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