Commit 13d80568 by Hasnain Committed by Hasnain Naveed

WL-1295 | Added management command to create the sites and their partners.

parent 7323f313
""" Creates sites and partners """
import fnmatch
import json
import logging
import os
from django.contrib.sites.models import Site
from django.core.management import BaseCommand
from course_discovery.apps.core.models import Partner
logger = logging.getLogger(__name__)
class Command(BaseCommand):
"""
Creates Partners and their perspective Sites.
"""
dns_name = None
theme_path = None
def add_arguments(self, parser):
parser.add_argument(
"--dns-name",
type=str,
help="Enter DNS name of sandbox.",
required=True
)
parser.add_argument(
"--theme-path",
type=str,
help="Enter theme directory path",
required=True
)
def find(self, pattern, path):
"""
Matches the given pattern in given path and returns the list of matching files.
"""
result = []
for root, _, files in os.walk(path):
for name in files:
if fnmatch.fnmatch(name, pattern):
result.append(os.path.join(root, name))
return result
def _get_site_partner_data(self):
"""
Reads the json files from theme directory and returns the site partner data in JSON format.
"""
site_data = {}
for config_file in self.find('sandbox_configuration.json', self.theme_path):
logger.info("Reading file from {file_name}".format(file_name=config_file))
configuration_data = json.loads(
json.dumps(
json.load(
open(config_file)
)
).replace("{dns_name}", self.dns_name)
)['discovery_configuration']
site_data[configuration_data['site_partner']] = {
"site_domain": configuration_data['site_domain'],
"partner_data": configuration_data['partner_data']
}
return site_data
def handle(self, *args, **options):
"""
Creates sites and partners.
"""
self.dns_name = options['dns_name']
self.theme_path = options['theme_path']
logger.info("DNS name: '{dns_name}'".format(dns_name=self.dns_name))
logger.info("Theme path: '{theme_path}'".format(theme_path=self.theme_path))
all_sites = self._get_site_partner_data()
for site_partner, site_partner_data in all_sites.items():
partner_data = site_partner_data['partner_data']
logger.info("Creating '{site}' Site".format(site=site_partner))
site, _ = Site.objects.get_or_create(
domain=site_partner_data['site_domain'],
defaults={"name": site_partner}
)
logger.info("Successfully created {site} site".format(site=site_partner))
partner_data['site'] = site
logger.info("Creating '{partner}' Partner".format(partner=site_partner))
Partner.objects.get_or_create(
short_code=site_partner,
defaults=partner_data
)
logger.info("Successfully created {partner} Partner".format(partner=site_partner))
{
"discovery_configuration":{
"site_domain": "discovery-dummy-{dns_name}.example.com",
"site_partner": "dummy",
"partner_data": {
"name": "dummy",
"oidc_key": "key-dummy",
"studio_url": "https://studio-dummy-{dns_name}.example.com",
"oidc_secret": "secret-{dns_name}",
"oidc_url_root": "https://dummy-{dns_name}.example.com/oauth2",
"courses_api_url": "https://dummy-{dns_name}.example.com/api/courses/v1/",
"ecommerce_api_url": "https://ecommerce-dummy-{dns_name}.example.com/",
"organizations_api_url": "https://dummy-{dns_name}.example.com/api/organizations/v0/"
}
}
}
from __future__ import unicode_literals
import os
from django.contrib.sites.models import Site
from django.core.management import CommandError, call_command
from django.test import TestCase
from course_discovery.apps.core.models import Partner
SITES = ['dummy-site']
class CreateSitesAndPartnersTests(TestCase):
""" Test the create_sites_and_partners command """
def setUp(self):
super(CreateSitesAndPartnersTests, self).setUp()
self.dns_name = "dummy-dns"
self.theme_path = os.path.dirname(__file__)
def _assert_site_and_partner_are_valid(self):
"""
checks that all the sites and partners are valid.
"""
sites = Site.objects.all()
partners = Partner.objects.all()
# there is an extra default site.
self.assertEqual(len(sites), len(SITES) + 1)
self.assertEqual(len(partners), len(SITES))
for site in sites:
if site.name in SITES:
site_name = site.name
self.assertEqual(
site.domain,
"discovery-{site}-{dns_name}.example.com".format(site=site_name, dns_name=self.dns_name)
)
partner = Partner.objects.get(site=site)
self.assertEqual(partner.short_code, site_name)
self.assertEqual(partner.name, "dummy")
self.assertEqual(partner.oidc_key, "key-dummy")
self.assertEqual(partner.oidc_secret, "secret-{dns_name}".format(dns_name=self.dns_name))
self.assertEqual(
partner.oidc_url_root,
"https://dummy-{dns_name}.example.com/oauth2".format(dns_name=self.dns_name)
)
self.assertEqual(
partner.courses_api_url,
"https://dummy-{dns_name}.example.com/api/courses/v1/".format(dns_name=self.dns_name)
)
self.assertEqual(
partner.ecommerce_api_url,
"https://ecommerce-dummy-{dns_name}.example.com/".format(dns_name=self.dns_name)
)
self.assertEqual(
partner.organizations_api_url,
"https://dummy-{dns_name}.example.com/api/organizations/v0/"
)
def test_missing_required_arguments(self):
"""
Verify CommandError is raised when required arguments are missing.
"""
# If a required argument is not specified the system should raise a CommandError
with self.assertRaises(CommandError):
call_command(
"create_sites_and_partners",
"--dns-name", self.dns_name,
)
with self.assertRaises(CommandError):
call_command(
"create_sites_and_partners",
"--theme-path", self.theme_path,
)
def test_create_site_and_partner(self):
"""
Verify that command creates sites and Partners
"""
call_command(
"create_sites_and_partners",
"--dns-name", self.dns_name,
"--theme-path", self.theme_path
)
self._assert_site_and_partner_are_valid()
call_command(
"create_sites_and_partners",
"--dns-name", self.dns_name,
"--theme-path", self.theme_path
)
# if we run command with same dns then it will not duplicates the sites and partners.
self._assert_site_and_partner_are_valid()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment