Commit 848ff3d0 by Clinton Blackburn Committed by Clinton Blackburn

Updated create_or_update_partner management command to modify Sites

The management command now creates and updates Site instances in  addition to Partner instances. This is necessary for proper multi-tenancy.

PLAT-1715
parent 3b75e164
......@@ -2,6 +2,7 @@
import logging
from django.contrib.sites.models import Site
from django.core.management import BaseCommand
from course_discovery.apps.core.models import Partner
......@@ -13,6 +14,17 @@ class Command(BaseCommand):
help = 'Create a new Partner, or update an existing Partner.'
def add_arguments(self, parser):
parser.add_argument('--site-id',
action='store',
dest='site_id',
type=int,
help='ID of the Site to update.')
parser.add_argument('--site-domain',
action='store',
dest='site_domain',
type=str,
required=True,
help='Site domain for the Partner')
parser.add_argument('--code',
action='store',
dest='partner_code',
......@@ -93,13 +105,26 @@ class Command(BaseCommand):
help='Key used for Partner OIDC workflows.')
def handle(self, *args, **options):
""" Creates or updates a Partner record. """
""" Creates or updates Site and Partner records. """
partner_code = options.get('partner_code')
partner_name = options.get('partner_name')
site_domain = options.get('site_domain')
site_id = options.get('site_id')
defaults = {'name': partner_name}
if site_id:
lookup = {'id': site_id}
defaults['domain'] = site_domain
else:
lookup = {'domain': site_domain}
site, __ = Site.objects.update_or_create(defaults=defaults, **lookup)
__, created = Partner.objects.update_or_create(
short_code=partner_code,
defaults={
'name': options.get('partner_name'),
'site': site,
'name': partner_name,
'courses_api_url': options.get('courses_api_url'),
'ecommerce_api_url': options.get('ecommerce_api_url'),
'organizations_api_url': options.get('organizations_api_url'),
......
......@@ -5,31 +5,30 @@ from django.core.management import CommandError, call_command
from django.test import TestCase
from course_discovery.apps.core.models import Partner
from course_discovery.apps.core.tests.factories import SiteFactory
@ddt
class CreateOrUpdatePartnerCommandTests(TestCase):
command_name = 'create_or_update_partner'
def setUp(self):
super(CreateOrUpdatePartnerCommandTests, self).setUp()
self.partner_code = 'abc'
self.partner_name = 'ABC Partner'
self.courses_api_url = 'https://courses.fake.org/api/v1/courses/'
self.ecommerce_api_url = 'https://ecommerce.fake.org/api/v1/courses/'
self.organizations_api_url = 'https://orgs.fake.org/api/v1/organizations/'
self.programs_api_url = 'https://programs.fake.org/api/v1/programs/'
self.marketing_site_api_url = 'https://www.fake.org/api/v1/courses/'
self.marketing_site_url_root = 'https://www.fake.org/'
self.marketing_site_api_username = 'marketing-username'
self.marketing_site_api_password = 'marketing-password'
self.oidc_url_root = 'https://oidc.fake.org/'
self.oidc_key = 'oidc-key'
self.oidc_secret = 'oidc-secret'
site_domain = 'test.example.com'
partner_code = 'abc'
partner_name = 'ABC Partner'
courses_api_url = 'https://courses.fake.org/api/v1/courses/'
ecommerce_api_url = 'https://ecommerce.fake.org/api/v1/courses/'
organizations_api_url = 'https://orgs.fake.org/api/v1/organizations/'
programs_api_url = 'https://programs.fake.org/api/v1/programs/'
marketing_site_api_url = 'https://www.fake.org/api/v1/courses/'
marketing_site_url_root = 'https://www.fake.org/'
marketing_site_api_username = 'marketing-username'
marketing_site_api_password = 'marketing-password'
oidc_url_root = 'https://oidc.fake.org/'
oidc_key = 'oidc-key'
oidc_secret = 'oidc-secret'
def _check_partner(self, partner):
self.assertEqual(partner.site.domain, self.site_domain)
self.assertEqual(partner.short_code, self.partner_code)
self.assertEqual(partner.name, self.partner_name)
self.assertEqual(partner.courses_api_url, self.courses_api_url)
......@@ -56,6 +55,8 @@ class CreateOrUpdatePartnerCommandTests(TestCase):
# Optional arguments
arg_map = {
'site_id': 'site-id',
'site_domain': 'site-domain',
'partner_name': 'name',
'courses_api_url': 'courses-api-url',
'ecommerce_api_url': 'ecommerce-api-url',
......@@ -79,6 +80,7 @@ class CreateOrUpdatePartnerCommandTests(TestCase):
def _create_partner(self):
""" Helper method to create a new partner """
self._call_command(
site_domain=self.site_domain,
partner_code=self.partner_code,
partner_name=self.partner_name,
courses_api_url=self.courses_api_url,
......@@ -109,6 +111,9 @@ class CreateOrUpdatePartnerCommandTests(TestCase):
""" Verify the command updates an existing Partner """
self._create_partner()
site = SiteFactory()
self.site_domain = 'some-other-test.example.org'
self.partner_name = 'Updated Partner'
self.courses_api_url = 'https://courses.updated.org/api/v1/courses/'
self.ecommerce_api_url = 'https://ecommerce.updated.org/api/v1/courses/'
......@@ -123,6 +128,8 @@ class CreateOrUpdatePartnerCommandTests(TestCase):
self.oidc_secret = 'updated-secret'
self._call_command(
site_id=site.id,
site_domain=self.site_domain,
partner_code=self.partner_code,
partner_name=self.partner_name,
courses_api_url=self.courses_api_url,
......@@ -141,6 +148,10 @@ class CreateOrUpdatePartnerCommandTests(TestCase):
partner = Partner.objects.get(short_code=self.partner_code)
self._check_partner(partner)
site.refresh_from_db()
self.assertEqual(site.domain, self.site_domain)
self.assertEqual(partner.site, site)
@data(
[''],
['--code="xyz"'], # Raises error because 'name' is not provided
......
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