From bf7dad15e442e477cc23e64e8b6df422b7854a77 Mon Sep 17 00:00:00 2001 From: Diana Huang <dkh@edx.org> Date: Mon, 12 Aug 2019 17:11:49 -0400 Subject: [PATCH] Remove microsite djangoapp except migrations and configuration. --- cms/envs/common.py | 22 -- cms/envs/production.py | 13 - cms/envs/test.py | 66 ---- common/djangoapps/edxmako/shortcuts.py | 11 - .../microsite_configuration/__init__.py | 35 +- .../microsite_configuration/admin.py | 81 ----- .../microsite_configuration/apps.py | 19 - .../backends/__init__.py | 7 - .../microsite_configuration/backends/base.py | 325 ------------------ .../backends/database.py | 205 ----------- .../backends/filebased.py | 24 -- .../management/__init__.py | 0 .../management/commands/__init__.py | 0 .../delete_historical_microsite_data.py | 36 -- .../microsite_configuration/microsite.py | 164 --------- .../microsite_configuration/middleware.py | 39 --- .../microsite_configuration/models.py | 183 ---------- .../microsite_configuration/tests/__init__.py | 0 .../tests/backends/__init__.py | 0 .../tests/backends/test_base.py | 136 -------- .../tests/backends/test_database.py | 211 ------------ .../tests/factories.py | 77 ----- .../tests/test_admin.py | 51 --- .../tests/test_logic.py | 39 --- .../tests/test_microsites.py | 84 ----- .../microsite_configuration/tests/tests.py | 40 --- common/djangoapps/student/helpers.py | 2 +- common/djangoapps/util/tests/test_db.py | 1 + lms/envs/common.py | 41 +-- lms/envs/docs/README.rst | 2 - lms/envs/production.py | 12 - lms/envs/test.py | 71 ---- lms/tests.py | 19 - openedx/tests/settings.py | 3 - 34 files changed, 7 insertions(+), 2012 deletions(-) delete mode 100644 common/djangoapps/microsite_configuration/admin.py delete mode 100644 common/djangoapps/microsite_configuration/apps.py delete mode 100644 common/djangoapps/microsite_configuration/backends/__init__.py delete mode 100644 common/djangoapps/microsite_configuration/backends/base.py delete mode 100644 common/djangoapps/microsite_configuration/backends/database.py delete mode 100644 common/djangoapps/microsite_configuration/backends/filebased.py delete mode 100644 common/djangoapps/microsite_configuration/management/__init__.py delete mode 100644 common/djangoapps/microsite_configuration/management/commands/__init__.py delete mode 100644 common/djangoapps/microsite_configuration/management/commands/delete_historical_microsite_data.py delete mode 100644 common/djangoapps/microsite_configuration/microsite.py delete mode 100644 common/djangoapps/microsite_configuration/middleware.py delete mode 100644 common/djangoapps/microsite_configuration/tests/__init__.py delete mode 100644 common/djangoapps/microsite_configuration/tests/backends/__init__.py delete mode 100644 common/djangoapps/microsite_configuration/tests/backends/test_base.py delete mode 100644 common/djangoapps/microsite_configuration/tests/backends/test_database.py delete mode 100644 common/djangoapps/microsite_configuration/tests/factories.py delete mode 100644 common/djangoapps/microsite_configuration/tests/test_admin.py delete mode 100644 common/djangoapps/microsite_configuration/tests/test_logic.py delete mode 100644 common/djangoapps/microsite_configuration/tests/test_microsites.py delete mode 100644 common/djangoapps/microsite_configuration/tests/tests.py diff --git a/cms/envs/common.py b/cms/envs/common.py index 338f518e437..8257d1f71cb 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -206,9 +206,6 @@ FEATURES = { # based on their location. 'EMBARGO': False, - # Turn on/off Microsites feature - 'USE_MICROSITES': False, - # Allow creating courses with non-ascii characters in the course id 'ALLOW_UNICODE_COURSE_ID': False, @@ -1680,21 +1677,6 @@ DEFAULT_SITE_THEME = None ENABLE_COMPREHENSIVE_THEMING = False -################################ Settings for Microsites ################################ - -### Select an implementation for the microsite backend -# for MICROSITE_BACKEND possible choices are -# 1. microsite_configuration.backends.filebased.FilebasedMicrositeBackend -# 2. microsite_configuration.backends.database.DatabaseMicrositeBackend -MICROSITE_BACKEND = 'microsite_configuration.backends.filebased.FilebasedMicrositeBackend' -# for MICROSITE_TEMPLATE_BACKEND possible choices are -# 1. microsite_configuration.backends.filebased.FilebasedMicrositeTemplateBackend -# 2. microsite_configuration.backends.database.DatabaseMicrositeTemplateBackend -MICROSITE_TEMPLATE_BACKEND = 'microsite_configuration.backends.filebased.FilebasedMicrositeTemplateBackend' -# TTL for microsite database template cache -MICROSITE_DATABASE_TEMPLATE_CACHE_TTL = 5 * 60 - - ############################ Global Database Configuration ##################### DATABASE_ROUTERS = [ @@ -1970,10 +1952,6 @@ BULK_EMAIL_DEFAULT_FROM_EMAIL = 'no-reply@example.com' # a bulk email message. BULK_EMAIL_LOG_SENT_EMAILS = False -################################ Settings for Microsites ################################ -MICROSITE_ROOT_DIR = '/edx/app/edxapp/edx-microsite' -MICROSITE_CONFIGURATION = {} - ############### Settings for django file storage ################## DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' diff --git a/cms/envs/production.py b/cms/envs/production.py index 59c6bafc1f7..c0b8039afee 100644 --- a/cms/envs/production.py +++ b/cms/envs/production.py @@ -514,19 +514,6 @@ XBLOCK_SETTINGS = ENV_TOKENS.get('XBLOCK_SETTINGS', {}) XBLOCK_SETTINGS.setdefault("VideoBlock", {})["licensing_enabled"] = FEATURES.get("LICENSING", False) XBLOCK_SETTINGS.setdefault("VideoBlock", {})['YOUTUBE_API_KEY'] = AUTH_TOKENS.get('YOUTUBE_API_KEY', YOUTUBE_API_KEY) -################# MICROSITE #################### -# microsite specific configurations. -MICROSITE_CONFIGURATION = ENV_TOKENS.get('MICROSITE_CONFIGURATION', {}) -MICROSITE_ROOT_DIR = path(ENV_TOKENS.get('MICROSITE_ROOT_DIR', '')) -# this setting specify which backend to be used when pulling microsite specific configuration -MICROSITE_BACKEND = ENV_TOKENS.get("MICROSITE_BACKEND", MICROSITE_BACKEND) -# this setting specify which backend to be used when loading microsite specific templates -MICROSITE_TEMPLATE_BACKEND = ENV_TOKENS.get("MICROSITE_TEMPLATE_BACKEND", MICROSITE_TEMPLATE_BACKEND) -# TTL for microsite database template cache -MICROSITE_DATABASE_TEMPLATE_CACHE_TTL = ENV_TOKENS.get( - "MICROSITE_DATABASE_TEMPLATE_CACHE_TTL", MICROSITE_DATABASE_TEMPLATE_CACHE_TTL -) - ############################ OAUTH2 Provider ################################### # OpenID Connect issuer ID. Normally the URL of the authentication endpoint. diff --git a/cms/envs/test.py b/cms/envs/test.py index 12d809c314f..154f8e6cc22 100644 --- a/cms/envs/test.py +++ b/cms/envs/test.py @@ -218,72 +218,6 @@ FEATURES['EMBARGO'] = True FEATURES['ENABLE_COMBINED_LOGIN_REGISTRATION'] = True -# set up some testing for microsites -FEATURES['USE_MICROSITES'] = True -MICROSITE_ROOT_DIR = COMMON_ROOT / 'test' / 'test_sites' -MICROSITE_CONFIGURATION = { - "test_site": { - "domain_prefix": "test-site", - "university": "test_site", - "platform_name": "Test Site", - "logo_image_url": "test_site/images/header-logo.png", - "email_from_address": "test_site@edx.org", - "payment_support_email": "test_site@edx.org", - "ENABLE_MKTG_SITE": False, - "SITE_NAME": "test_site.localhost", - "course_org_filter": "TestSiteX", - "course_about_show_social_links": False, - "css_overrides_file": "test_site/css/test_site.css", - "show_partners": False, - "show_homepage_promo_video": False, - "course_index_overlay_text": "This is a Test Site Overlay Text.", - "course_index_overlay_logo_file": "test_site/images/header-logo.png", - "homepage_overlay_html": "<h1>This is a Test Site Overlay HTML</h1>", - "ALWAYS_REDIRECT_HOMEPAGE_TO_DASHBOARD_FOR_AUTHENTICATED_USER": False, - "COURSE_CATALOG_VISIBILITY_PERMISSION": "see_in_catalog", - "COURSE_ABOUT_VISIBILITY_PERMISSION": "see_about_page", - "ENABLE_SHOPPING_CART": True, - "ENABLE_PAID_COURSE_REGISTRATION": True, - "SESSION_COOKIE_DOMAIN": "test_site.localhost", - "urls": { - 'ABOUT': 'test-site/about', - 'PRIVACY': 'test-site/privacy', - 'TOS_AND_HONOR': 'test-site/tos-and-honor', - }, - }, - "site_with_logistration": { - "domain_prefix": "logistration", - "university": "logistration", - "platform_name": "Test logistration", - "logo_image_url": "test_site/images/header-logo.png", - "email_from_address": "test_site@edx.org", - "payment_support_email": "test_site@edx.org", - "ENABLE_MKTG_SITE": False, - "ENABLE_COMBINED_LOGIN_REGISTRATION": True, - "SITE_NAME": "test_site.localhost", - "course_org_filter": "LogistrationX", - "course_about_show_social_links": False, - "css_overrides_file": "test_site/css/test_site.css", - "show_partners": False, - "show_homepage_promo_video": False, - "course_index_overlay_text": "Logistration.", - "course_index_overlay_logo_file": "test_site/images/header-logo.png", - "homepage_overlay_html": "<h1>This is a Logistration HTML</h1>", - "ALWAYS_REDIRECT_HOMEPAGE_TO_DASHBOARD_FOR_AUTHENTICATED_USER": False, - "COURSE_CATALOG_VISIBILITY_PERMISSION": "see_in_catalog", - "COURSE_ABOUT_VISIBILITY_PERMISSION": "see_about_page", - "ENABLE_SHOPPING_CART": True, - "ENABLE_PAID_COURSE_REGISTRATION": True, - "SESSION_COOKIE_DOMAIN": "test_logistration.localhost", - }, - "default": { - "university": "default_university", - "domain_prefix": "www", - } -} -MICROSITE_TEST_HOSTNAME = 'test-site.testserver' -MICROSITE_LOGISTRATION_HOSTNAME = 'logistration.testserver' - TEST_THEME = COMMON_ROOT / "test" / "test-theme" # For consistency in user-experience, keep the value of this setting in sync with diff --git a/common/djangoapps/edxmako/shortcuts.py b/common/djangoapps/edxmako/shortcuts.py index 5223f03eacf..e5a2c639eb5 100644 --- a/common/djangoapps/edxmako/shortcuts.py +++ b/common/djangoapps/edxmako/shortcuts.py @@ -129,17 +129,6 @@ def marketing_link_context_processor(request): ) -def footer_context_processor(request): # pylint: disable=unused-argument - """ - Checks the site name to determine whether to use the edX.org footer or the Open Source Footer. - """ - return dict( - [ - ("IS_REQUEST_IN_MICROSITE", is_request_in_themed_site()) - ] - ) - - def render_to_string(template_name, dictionary, namespace='main', request=None): """ Render a Mako template to as a string. diff --git a/common/djangoapps/microsite_configuration/__init__.py b/common/djangoapps/microsite_configuration/__init__.py index c7d304d59f5..bae853f8e8c 100644 --- a/common/djangoapps/microsite_configuration/__init__.py +++ b/common/djangoapps/microsite_configuration/__init__.py @@ -1,33 +1,6 @@ -""" -This file implements a class which is a handy utility to make any -call to the settings completely microsite aware by replacing the: +from django.apps import AppConfig -from django.conf import settings -with: - -from microsite_configuration import settings -""" -from __future__ import absolute_import - -from django.conf import settings as base_settings - -from microsite_configuration import microsite - - -class MicrositeAwareSettings(object): - """ - This class is a proxy object of the settings object from django. - It will try to get a value from the microsite and default to the - django settings - """ - - def __getattr__(self, name): - try: - if isinstance(microsite.get_value(name), dict): - return microsite.get_dict(name, getattr(base_settings, name)) - return microsite.get_value(name, getattr(base_settings, name)) - except KeyError: - return getattr(base_settings, name) - -settings = MicrositeAwareSettings() # pylint: disable=invalid-name +class MicrositeConfigurationConfig(AppConfig): + name = 'microsite_configuration' + verbose_name = "Microsite Configuration" diff --git a/common/djangoapps/microsite_configuration/admin.py b/common/djangoapps/microsite_configuration/admin.py deleted file mode 100644 index e68b94a7a58..00000000000 --- a/common/djangoapps/microsite_configuration/admin.py +++ /dev/null @@ -1,81 +0,0 @@ -""" -Django admin page for microsite models -""" -from __future__ import absolute_import - -from django import forms -from django.contrib import admin - -from util.organizations_helpers import get_organizations - -from .models import Microsite, MicrositeHistory, MicrositeOrganizationMapping, MicrositeTemplate - - -class MicrositeAdmin(admin.ModelAdmin): - """ Admin interface for the Microsite object. """ - list_display = ('key', 'site') - search_fields = ('site__domain', 'values') - - class Meta(object): # pylint: disable=missing-docstring - model = Microsite - - -class MicrositeHistoryAdmin(admin.ModelAdmin): - """ Admin interface for the MicrositeHistory object. """ - list_display = ('key', 'site', 'created') - search_fields = ('site__domain', 'values') - - ordering = ['-created'] - - class Meta(object): # pylint: disable=missing-docstring - model = MicrositeHistory - - def has_add_permission(self, request): - """Don't allow adds""" - return False - - def has_delete_permission(self, request, obj=None): - """Don't allow deletes""" - return False - - -class MicrositeOrganizationMappingForm(forms.ModelForm): - """ - Django admin form for MicrositeOrganizationMapping model - """ - def __init__(self, *args, **kwargs): - super(MicrositeOrganizationMappingForm, self).__init__(*args, **kwargs) - organizations = get_organizations() - org_choices = [(org["short_name"], org["name"]) for org in organizations] - org_choices.insert(0, ('', 'None')) - self.fields['organization'] = forms.TypedChoiceField( - choices=org_choices, required=False, empty_value=None - ) - - class Meta(object): - model = MicrositeOrganizationMapping - fields = '__all__' - - -class MicrositeOrganizationMappingAdmin(admin.ModelAdmin): - """ Admin interface for the MicrositeOrganizationMapping object. """ - list_display = ('organization', 'microsite') - search_fields = ('organization', 'microsite') - form = MicrositeOrganizationMappingForm - - class Meta(object): # pylint: disable=missing-docstring - model = MicrositeOrganizationMapping - - -class MicrositeTemplateAdmin(admin.ModelAdmin): - """ Admin interface for the MicrositeTemplate object. """ - list_display = ('microsite', 'template_uri') - search_fields = ('microsite', 'template_uri') - - class Meta(object): # pylint: disable=missing-docstring - model = MicrositeTemplate - -admin.site.register(Microsite, MicrositeAdmin) -admin.site.register(MicrositeHistory, MicrositeHistoryAdmin) -admin.site.register(MicrositeOrganizationMapping, MicrositeOrganizationMappingAdmin) -admin.site.register(MicrositeTemplate, MicrositeTemplateAdmin) diff --git a/common/djangoapps/microsite_configuration/apps.py b/common/djangoapps/microsite_configuration/apps.py deleted file mode 100644 index dbe4f3686e4..00000000000 --- a/common/djangoapps/microsite_configuration/apps.py +++ /dev/null @@ -1,19 +0,0 @@ - -from __future__ import absolute_import - -import logging - -from django.apps import AppConfig - -from .microsite import enable_microsites - -log = logging.getLogger(__name__) - - -class MicrositeConfigurationConfig(AppConfig): - name = 'microsite_configuration' - verbose_name = "Microsite Configuration" - - def ready(self): - # Mako requires the directories to be added after the django setup. - enable_microsites(log) diff --git a/common/djangoapps/microsite_configuration/backends/__init__.py b/common/djangoapps/microsite_configuration/backends/__init__.py deleted file mode 100644 index 00ec11f8107..00000000000 --- a/common/djangoapps/microsite_configuration/backends/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -""" -Supported backends for microsites -1. filebased - This backend supports retrieval of microsite configurations/templates from filesystem. -2. database - This backend supports retrieval of microsite configurations/templates from database. -""" diff --git a/common/djangoapps/microsite_configuration/backends/base.py b/common/djangoapps/microsite_configuration/backends/base.py deleted file mode 100644 index d4c4b7ec55a..00000000000 --- a/common/djangoapps/microsite_configuration/backends/base.py +++ /dev/null @@ -1,325 +0,0 @@ -""" -Microsite configuration backend module. - -Contains the base classes for microsite backends. - -AbstractBaseMicrositeBackend is Abstract Base Class for the microsite configuration backend. -BaseMicrositeBackend is Base Class for microsite configuration backend. -BaseMicrositeTemplateBackend is Base Class for the microsite template backend. -""" -from __future__ import absolute_import - -import abc -import os.path -import six -import threading - -from django.conf import settings - -from util.url import strip_port_from_host - - -# pylint: disable=unused-argument -class AbstractBaseMicrositeBackend(six.with_metaclass(abc.ABCMeta, object)): - """ - Abstract Base Class for the microsite backends. - """ - - def __init__(self, **kwargs): - pass - - @abc.abstractmethod - def set_config_by_domain(self, domain): - """ - For a given request domain, find a match in our microsite configuration - and make it available to the complete django request process - """ - raise NotImplementedError() - - @abc.abstractmethod - def get_value(self, val_name, default=None, **kwargs): - """ - Returns a value associated with the request's microsite, if present - """ - raise NotImplementedError() - - @abc.abstractmethod - def get_dict(self, dict_name, default=None, **kwargs): - """ - Returns a dictionary product of merging the request's microsite and - the default value. - This can be used, for example, to return a merged dictonary from the - settings.FEATURES dict, including values defined at the microsite - """ - raise NotImplementedError() - - @abc.abstractmethod - def is_request_in_microsite(self): - """ - This will return True/False if the current request is a request within a microsite - """ - raise NotImplementedError() - - @abc.abstractmethod - def has_override_value(self, val_name): - """ - Returns True/False whether a Microsite has a definition for the - specified named value - """ - raise NotImplementedError() - - @abc.abstractmethod - def get_all_config(self): - """ - This returns a set of orgs that are considered within all microsites. - This can be used, for example, to do filtering - """ - raise NotImplementedError() - - @abc.abstractmethod - def get_value_for_org(self, org, val_name, default=None): - """ - This returns a configuration value for a microsite which has an org_filter that matches - what is passed in - """ - raise NotImplementedError() - - @abc.abstractmethod - def get_all_orgs(self): - """ - This returns a set of orgs that are considered within a microsite. This can be used, - for example, to do filtering - """ - raise NotImplementedError() - - @abc.abstractmethod - def clear(self): - """ - Clears out any microsite configuration from the current request/thread - """ - raise NotImplementedError() - - -class BaseMicrositeBackend(AbstractBaseMicrositeBackend): - """ - Base class for Microsite backends. - """ - - def __init__(self, **kwargs): - super(BaseMicrositeBackend, self).__init__(**kwargs) - self.current_request_configuration = threading.local() - self.current_request_configuration.data = {} - self.current_request_configuration.cache = {} - - def has_configuration_set(self): - """ - Returns whether there is any Microsite configuration settings - """ - return getattr(settings, "MICROSITE_CONFIGURATION", False) - - def get_configuration(self): - """ - Returns the current request's microsite configuration. - if request's microsite configuration is not present returns empty dict. - """ - if not hasattr(self.current_request_configuration, 'data'): - return {} - - return self.current_request_configuration.data - - def get_key_from_cache(self, key): - """ - Retrieves a key from a cache scoped to the thread - """ - if hasattr(self.current_request_configuration, 'cache'): - return self.current_request_configuration.cache.get(key) - - def set_key_to_cache(self, key, value): - """ - Stores a key value pair in a cache scoped to the thread - """ - if hasattr(self.current_request_configuration, 'cache'): - self.current_request_configuration.cache[key] = value - - def set_config_by_domain(self, domain): - """ - For a given request domain, find a match in our microsite configuration - and then assign it to the thread local in order to make it available - to the complete Django request processing - """ - if not self.has_configuration_set() or not domain: - return - - for key, value in settings.MICROSITE_CONFIGURATION.items(): - subdomain = value.get('domain_prefix') - if subdomain and domain.startswith(subdomain): - self._set_microsite_config(key, subdomain, domain) - return - - # if no match on subdomain then see if there is a 'default' microsite defined - # if so, then use that - if 'default' in settings.MICROSITE_CONFIGURATION: - self._set_microsite_config('default', subdomain, domain) - return - - def get_value(self, val_name, default=None, **kwargs): - """ - Returns a value associated with the request's microsite, if present - """ - configuration = self.get_configuration() - return configuration.get(val_name, default) - - def get_dict(self, dict_name, default=None, **kwargs): - """ - Returns a dictionary product of merging the request's microsite and - the default value. - Supports storing a cache of the merged value to improve performance - """ - cached_dict = self.get_key_from_cache(dict_name) - if cached_dict: - return cached_dict - - default = default or {} - output = default.copy() - output.update(self.get_value(dict_name, {})) - - self.set_key_to_cache(dict_name, output) - return output - - def is_request_in_microsite(self): - """ - This will return if current request is a request within a microsite - """ - return bool(self.get_configuration()) - - def has_override_value(self, val_name): - """ - Will return True/False whether a Microsite has a definition for the - specified val_name - """ - configuration = self.get_configuration() - return val_name in configuration - - def get_all_config(self): - """ - This returns all configuration for all microsites - """ - config = {} - - for key, value in six.iteritems(settings.MICROSITE_CONFIGURATION): - config[key] = value - - return config - - def get_value_for_org(self, org, val_name, default=None): - """ - This returns a configuration value for a microsite which has an org_filter that matches - what is passed in - """ - - if not self.has_configuration_set(): - return default - - # Filter at the setting file - for value in six.itervalues(settings.MICROSITE_CONFIGURATION): - org_filter = value.get('course_org_filter', None) - if org_filter == org: - return value.get(val_name, default) - return default - - def get_all_orgs(self): - """ - This returns a set of orgs that are considered within a microsite. This can be used, - for example, to do filtering - """ - org_filter_set = set() - - if not self.has_configuration_set(): - return org_filter_set - - # Get the orgs in the db - for microsite in six.itervalues(settings.MICROSITE_CONFIGURATION): - org_filter = microsite.get('course_org_filter') - if org_filter: - org_filter_set.add(org_filter) - - return org_filter_set - - def _set_microsite_config(self, microsite_config_key, subdomain, domain): - """ - Helper internal method to actually find the microsite configuration - """ - config = settings.MICROSITE_CONFIGURATION[microsite_config_key].copy() - config['subdomain'] = strip_port_from_host(subdomain) - config['microsite_config_key'] = microsite_config_key - config['site_domain'] = strip_port_from_host(domain) - - template_dir = settings.MICROSITE_ROOT_DIR / microsite_config_key / 'templates' - config['template_dir'] = template_dir - self.current_request_configuration.data = config - - def clear(self): - """ - Clears out any microsite configuration from the current request/thread - """ - self.current_request_configuration.data = {} - self.current_request_configuration.cache = {} - - def enable_microsites(self, log): - """ - Configure the paths for the microsites feature - """ - microsites_root = settings.MICROSITE_ROOT_DIR - if os.path.isdir(microsites_root): - settings.STATICFILES_DIRS.insert(0, microsites_root) - - log.info('Loading microsite path at %s', microsites_root) - else: - log.error( - 'Error loading %s. Directory does not exist', - microsites_root - ) - - -class BaseMicrositeTemplateBackend(object): - """ - Interface for microsite template providers. Base implementation is to use the filesystem. - When this backend is used templates are first searched in location set in `template_dir` - configuration of microsite on filesystem. - """ - - def get_template_path(self, template_path, **kwargs): - """ - Returns a path (string) to a Mako template, which can either be in - an override or will just return what is passed in which is expected to be a string - """ - - from microsite_configuration.microsite import get_value as microsite_get_value - - microsite_template_path = microsite_get_value('template_dir', None) - if not microsite_template_path: - microsite_template_path = '/'.join([ - settings.MICROSITE_ROOT_DIR, - microsite_get_value('microsite_config_key', 'default'), - 'templates', - ]) - - relative_path = template_path[1:] if template_path.startswith('/') else template_path - search_path = os.path.join(microsite_template_path, relative_path) - if os.path.isfile(search_path): - path = '/{0}/templates/{1}'.format( - microsite_get_value('microsite_config_key'), - relative_path - ) - return path - else: - return template_path - - def get_template(self, uri): - """ - Returns the actual template for the microsite with the specified URI, - default implementation returns None, which means that the caller framework - should use default behavior - """ - - return diff --git a/common/djangoapps/microsite_configuration/backends/database.py b/common/djangoapps/microsite_configuration/backends/database.py deleted file mode 100644 index 80f379a0b30..00000000000 --- a/common/djangoapps/microsite_configuration/backends/database.py +++ /dev/null @@ -1,205 +0,0 @@ -""" -Microsite backend that reads the configuration from the database -""" -from __future__ import absolute_import - -from django.conf import settings -from django.db.models.signals import post_save -from django.dispatch import receiver -from mako.template import Template - -from microsite_configuration.backends.base import BaseMicrositeBackend, BaseMicrositeTemplateBackend -from microsite_configuration.microsite import get_value as microsite_get_value -from microsite_configuration.models import Microsite, MicrositeOrganizationMapping, MicrositeTemplate -from util.cache import cache -from util.memcache import fasthash -from util.url import strip_port_from_host - - -class DatabaseMicrositeBackend(BaseMicrositeBackend): - """ - Microsite backend that reads the microsites definitions - from a table in the database according to the models.py file - This backend would allow us to save microsite configurations - into database and load them in local storage when HTTRequest - is originated from microsite. - - E.g. we have setup a microsite with key `monster-university-academy` and - We would have a DB entry like this in table created by Microsite model. - - key = monster-university-academy - subdomain = mua.edx.org - values = { - "platform_name": "Monster University Academy". - "course_org_filter: "MonsterX" - } - - While using DatabaseMicrositeBackend any request coming from mua.edx.org - would get microsite configurations from `values` column. - """ - - def has_configuration_set(self): - """ - Returns whether there is any Microsite configuration settings - """ - if Microsite.objects.all()[:1].exists(): - return True - else: - return False - - def set_config_by_domain(self, domain): - """ - For a given request domain, find a match in our microsite configuration - and then assign it to the thread local in order to make it available - to the complete Django request processing - """ - - if not self.has_configuration_set() or not domain: - return - - # look up based on the HTTP request domain name - # this will need to be a full domain name match, - # not a 'startswith' match - microsite = Microsite.get_microsite_for_domain(domain) - - if not microsite: - # if no match, then try to find a 'default' key in Microsites - try: - microsite = Microsite.objects.get(key='default') - except Microsite.DoesNotExist: - pass - - if microsite: - # if we have a match, then set up the microsite thread local - # data - self._set_microsite_config_from_obj(microsite.site.domain, domain, microsite) - - def get_all_config(self): - """ - This returns all configuration for all microsites - """ - config = {} - - candidates = Microsite.objects.all() - for microsite in candidates: - values = microsite.values - config[microsite.key] = values - - return config - - def get_value_for_org(self, org, val_name, default=None): - """ - This returns a configuration value for a microsite which has an org_filter that matches - what is passed in - """ - - microsite = MicrositeOrganizationMapping.get_microsite_for_organization(org) - if not microsite: - return default - - # cdodge: This approach will not leverage any caching, although I think only Studio calls - # this - config = microsite.values - return config.get(val_name, default) - - def get_all_orgs(self): - """ - This returns a set of orgs that are considered within a microsite. This can be used, - for example, to do filtering - """ - - # This should be cacheable (via memcache to keep consistent across a cluster) - # I believe this is called on the dashboard and catalog pages, so it'd be good to optimize - return set(MicrositeOrganizationMapping.objects.all().values_list('organization', flat=True)) - - def _set_microsite_config_from_obj(self, subdomain, domain, microsite_object): - """ - Helper internal method to actually find the microsite configuration - """ - config = microsite_object.values - config['subdomain'] = strip_port_from_host(subdomain) - config['site_domain'] = strip_port_from_host(domain) - config['microsite_config_key'] = microsite_object.key - - # we take the list of ORGs associated with this microsite from the database mapping - # tables. NOTE, for now, we assume one ORG per microsite - organizations = microsite_object.get_organizations() - - # we must have at least one ORG defined - if not organizations: - raise Exception( - 'Configuration error. Microsite {key} does not have any ORGs mapped to it!'.format( - key=microsite_object.key - ) - ) - - # just take the first one for now, we'll have to change the upstream logic to allow - # for more than one ORG binding - config['course_org_filter'] = organizations[0] - self.current_request_configuration.data = config - - -class DatabaseMicrositeTemplateBackend(BaseMicrositeTemplateBackend): - """ - Specialized class to pull templates from the database. - This Backend would allow us to save templates in DB and pull - them from there when required for a specific microsite. - This backend can be enabled by `MICROSITE_TEMPLATE_BACKEND` setting. - - E.g. we have setup a microsite for subdomain `mua.edx.org` and - We have a DB entry like this in table created by MicrositeTemplate model. - - microsite = Key for microsite(mua.edx.org) - template_uri = about.html - template = <html><body>Template from DB</body></html> - - While using DatabaseMicrositeTemplateBackend any request coming from mua.edx.org/about.html - would get about.html template from DB and response would be the value of `template` column. - """ - def get_template_path(self, relative_path, **kwargs): - return relative_path - - def get_template(self, uri): - """ - Override of the base class for us to look into the - database tables for a template definition, if we can't find - one we'll return None which means "use default means" (aka filesystem) - """ - cache_key = "template_cache." + fasthash(microsite_get_value('site_domain') + '.' + uri) - template_text = cache.get(cache_key) # pylint: disable=maybe-no-member - - if not template_text: - # cache is empty so pull template from DB and fill cache. - template_obj = MicrositeTemplate.get_template_for_microsite( - microsite_get_value('site_domain'), - uri - ) - - if not template_obj: - # We need to set something in the cache to improve performance - # of the templates stored in the filesystem as well - cache.set( # pylint: disable=maybe-no-member - cache_key, '##none', settings.MICROSITE_DATABASE_TEMPLATE_CACHE_TTL - ) - return None - - template_text = template_obj.template - cache.set( # pylint: disable=maybe-no-member - cache_key, template_text, settings.MICROSITE_DATABASE_TEMPLATE_CACHE_TTL - ) - - if template_text == '##none': - return None - - return Template( - text=template_text - ) - - @staticmethod - @receiver(post_save, sender=MicrositeTemplate) - def clear_cache(sender, instance, **kwargs): # pylint: disable=unused-argument - """ - Clear the cached template when the model is saved - """ - cache_key = "template_cache." + fasthash(instance.microsite.site.domain + '.' + instance.template_uri) - cache.delete(cache_key) # pylint: disable=maybe-no-member diff --git a/common/djangoapps/microsite_configuration/backends/filebased.py b/common/djangoapps/microsite_configuration/backends/filebased.py deleted file mode 100644 index f179d351297..00000000000 --- a/common/djangoapps/microsite_configuration/backends/filebased.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -Microsite backend that reads the configuration from a file - -""" -from __future__ import absolute_import - -from microsite_configuration.backends.base import BaseMicrositeBackend, BaseMicrositeTemplateBackend - - -class FilebasedMicrositeBackend(BaseMicrositeBackend): - """ - Microsite backend that reads the microsites definitions - from a dictionary called MICROSITE_CONFIGURATION in the settings file. - """ - - def __init__(self, **kwargs): - super(FilebasedMicrositeBackend, self).__init__(**kwargs) - - -class FilebasedMicrositeTemplateBackend(BaseMicrositeTemplateBackend): - """ - Microsite backend that loads templates from filesystem. - """ - pass diff --git a/common/djangoapps/microsite_configuration/management/__init__.py b/common/djangoapps/microsite_configuration/management/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/common/djangoapps/microsite_configuration/management/commands/__init__.py b/common/djangoapps/microsite_configuration/management/commands/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/common/djangoapps/microsite_configuration/management/commands/delete_historical_microsite_data.py b/common/djangoapps/microsite_configuration/management/commands/delete_historical_microsite_data.py deleted file mode 100644 index 8364daae270..00000000000 --- a/common/djangoapps/microsite_configuration/management/commands/delete_historical_microsite_data.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -Command to delete all rows from these tables: -microsite_configuration_historicalmicrositeorganizationmapping -microsite_configuration_historicalmicrositetemplate -""" -from __future__ import absolute_import - -import logging -from microsite_configuration.models import MicrositeOrganizationMapping, MicrositeTemplate -from openedx.core.djangoapps.util.row_delete import delete_rows, BaseDeletionCommand -log = logging.getLogger(__name__) - - -class Command(BaseDeletionCommand): - """ - Example usage: ./manage.py lms --settings=devstack delete_historical_microsite_data - """ - help = 'Deletes all historical MicrositeOrganizationMapping and MicrositeTemplate rows (in chunks).' - - def handle(self, *args, **options): - """ - Deletes rows, chunking the deletes to avoid long table/row locks. - """ - chunk_size, sleep_between = super(Command, self).handle(*args, **options) - delete_rows( - MicrositeOrganizationMapping.objects, - 'microsite_configuration_historicalmicrositeorganizationmapping', - 'history_id', - chunk_size, sleep_between - ) - delete_rows( - MicrositeTemplate.objects, - 'microsite_configuration_historicalmicrositetemplate', - 'history_id', - chunk_size, sleep_between - ) diff --git a/common/djangoapps/microsite_configuration/microsite.py b/common/djangoapps/microsite_configuration/microsite.py deleted file mode 100644 index e023832c2b7..00000000000 --- a/common/djangoapps/microsite_configuration/microsite.py +++ /dev/null @@ -1,164 +0,0 @@ -""" -This file implements the Microsite support for the Open edX platform. -A microsite enables the following features: - -1) Mapping of sub-domain name to a 'brand', e.g. foo-university.edx.org -2) Present a landing page with a listing of courses that are specific to the 'brand' -3) Ability to swap out some branding elements in the website -""" -from __future__ import absolute_import - -import inspect -from importlib import import_module - -from django.conf import settings - -from microsite_configuration.backends.base import BaseMicrositeBackend, BaseMicrositeTemplateBackend - -__all__ = [ - 'is_request_in_microsite', 'get_value', 'has_override_value', - 'get_template_path', 'get_value_for_org', 'get_all_orgs', - 'clear', 'set_by_domain', 'enable_microsites', 'get_all_config', - 'is_feature_enabled', -] - -BACKEND = None -TEMPLATES_BACKEND = None - - -def is_feature_enabled(): - """ - Returns whether the feature flag to enable microsite has been set - """ - return settings.FEATURES.get('USE_MICROSITES', False) - - -def is_request_in_microsite(): - """ - This will return if current request is a request within a microsite - """ - return BACKEND.is_request_in_microsite() - - -def get_value(val_name, default=None, **kwargs): - """ - Returns a value associated with the request's microsite, if present - """ - return BACKEND.get_value(val_name, default, **kwargs) - - -def get_dict(dict_name, default=None, **kwargs): - """ - Returns a dictionary product of merging the request's microsite and - the default value. - This can be used, for example, to return a merged dictonary from the - settings.FEATURES dict, including values defined at the microsite - """ - return BACKEND.get_dict(dict_name, default, **kwargs) - - -def has_override_value(val_name): - """ - Returns True/False whether a Microsite has a definition for the - specified named value - """ - return BACKEND.has_override_value(val_name) - - -def get_value_for_org(org, val_name, default=None): - """ - This returns a configuration value for a microsite which has an org_filter that matches - what is passed in - """ - return BACKEND.get_value_for_org(org, val_name, default) - - -def get_all_orgs(): - """ - This returns a set of orgs that are considered within a microsite. This can be used, - for example, to do filtering - """ - return BACKEND.get_all_orgs() - - -def get_all_config(): - """ - This returns a dict have all microsite configs. Each key in the dict represent a - microsite config. - """ - return BACKEND.get_all_config() - - -def clear(): - """ - Clears out any microsite configuration from the current request/thread - """ - BACKEND.clear() - - -def set_by_domain(domain): - """ - For a given request domain, find a match in our microsite configuration - and make it available to the complete django request process - """ - BACKEND.set_config_by_domain(domain) - - -def enable_microsites(log): - """ - Enable the use of microsites during the startup script - """ - if is_feature_enabled(): - BACKEND.enable_microsites(log) - - -def get_template(uri): - """ - Returns a template for the specified URI, None if none exists or if caller should - use default templates/search paths - """ - if not is_request_in_microsite(): - return - - return TEMPLATES_BACKEND.get_template(uri) - - -def get_template_path(relative_path, **kwargs): - """ - Returns a path (string) to a template - """ - if not is_request_in_microsite(): - return relative_path - - return TEMPLATES_BACKEND.get_template_path(relative_path, **kwargs) - - -def get_backend(name, expected_base_class, **kwds): - """ - Load a microsites backend and return an instance of it. - If backend is None (default) settings.MICROSITE_BACKEND is used. - Any additional args(kwds) will be used in the constructor of the backend. - """ - if not name: - return None - - try: - parts = name.split('.') - module_name = '.'.join(parts[:-1]) - class_name = parts[-1] - except IndexError: - raise ValueError('Invalid microsites backend %s' % name) - - try: - module = import_module(module_name) - cls = getattr(module, class_name) - if not inspect.isclass(cls) or not issubclass(cls, expected_base_class): - raise TypeError - except (AttributeError, ValueError): - raise ValueError('Cannot find microsites backend %s' % module_name) - - return cls(**kwds) - - -BACKEND = get_backend(settings.MICROSITE_BACKEND, BaseMicrositeBackend) -TEMPLATES_BACKEND = get_backend(settings.MICROSITE_TEMPLATE_BACKEND, BaseMicrositeTemplateBackend) diff --git a/common/djangoapps/microsite_configuration/middleware.py b/common/djangoapps/microsite_configuration/middleware.py deleted file mode 100644 index 9056480c9f6..00000000000 --- a/common/djangoapps/microsite_configuration/middleware.py +++ /dev/null @@ -1,39 +0,0 @@ -""" -This file implements the Middleware support for the Open edX platform. -A microsite enables the following features: - -1) Mapping of sub-domain name to a 'brand', e.g. foo-university.edx.org -2) Present a landing page with a listing of courses that are specific to the 'brand' -3) Ability to swap out some branding elements in the website -""" - -from __future__ import absolute_import - -from microsite_configuration import microsite - - -class MicrositeMiddleware(object): - """ - Middleware class which will bind configuration information regarding 'microsites' on a per request basis. - The actual configuration information is taken from Django settings information - """ - - def process_request(self, request): - """ - Middleware entry point on every request processing. This will associate a request's domain name - with a 'University' and any corresponding microsite configuration information - """ - microsite.clear() - - domain = request.META.get('HTTP_HOST', None) - - microsite.set_by_domain(domain) - - return None - - def process_response(self, request, response): - """ - Middleware entry point for request completion. - """ - microsite.clear() - return response diff --git a/common/djangoapps/microsite_configuration/models.py b/common/djangoapps/microsite_configuration/models.py index 00408ee54df..e69de29bb2d 100644 --- a/common/djangoapps/microsite_configuration/models.py +++ b/common/djangoapps/microsite_configuration/models.py @@ -1,183 +0,0 @@ -""" -Model to store a microsite in the database. - -The object is stored as a json representation of the python dict -that would have been used in the settings. - -""" -from __future__ import absolute_import - -import collections - -from django.contrib.sites.models import Site -from django.db import models -from django.db.models.base import ObjectDoesNotExist -from django.db.models.signals import pre_delete, pre_save -from django.dispatch import receiver -from jsonfield.fields import JSONField -from model_utils.models import TimeStampedModel - - -class Microsite(models.Model): - """ - This is where the information about the microsite gets stored to the db. - To achieve the maximum flexibility, most of the fields are stored inside - a json field. - - Notes: - - The key field was required for the dict definition at the settings, and it - is used in some of the microsite_configuration methods. - - The site field is django site. - - The values field must be validated on save to prevent the platform from crashing - badly in the case the string is not able to be loaded as json. - - .. no_pii: - """ - site = models.OneToOneField(Site, related_name='microsite', on_delete=models.CASCADE) - key = models.CharField(max_length=63, db_index=True, unique=True) - values = JSONField(null=False, blank=True, load_kwargs={'object_pairs_hook': collections.OrderedDict}) - - def __unicode__(self): - return self.key - - def get_organizations(self): - """ - Helper method to return a list of organizations associated with our particular Microsite - """ - return MicrositeOrganizationMapping.get_organizations_for_microsite_by_pk(self.id) # pylint: disable=no-member - - @classmethod - def get_microsite_for_domain(cls, domain): - """ - Returns the microsite associated with this domain. Note that we always convert to lowercase, or - None if no match - """ - - # remove any port number from the hostname - domain = domain.split(':')[0] - microsites = cls.objects.filter(site__domain__iexact=domain) - - return microsites[0] if microsites else None - - -class MicrositeHistory(TimeStampedModel): - """ - This is an archive table for Microsites model, so that we can maintain a history of changes. Note that the - key field is no longer unique - - .. no_pii: - """ - site = models.ForeignKey(Site, related_name='microsite_history', on_delete=models.CASCADE) - key = models.CharField(max_length=63, db_index=True) - values = JSONField(null=False, blank=True, load_kwargs={'object_pairs_hook': collections.OrderedDict}) - - def __unicode__(self): - return self.key - - class Meta(object): - """ Meta class for this Django model """ - verbose_name_plural = "Microsite histories" - - -def _make_archive_copy(instance): - """ - Helper method to make a copy of a Microsite into the history table - """ - archive_object = MicrositeHistory( - key=instance.key, - site=instance.site, - values=instance.values, - ) - archive_object.save() - - -@receiver(pre_delete, sender=Microsite) -def on_microsite_deleted(sender, instance, **kwargs): # pylint: disable=unused-argument - """ - Archive the exam attempt when the item is about to be deleted - Make a clone and populate in the History table - """ - _make_archive_copy(instance) - - -@receiver(pre_save, sender=Microsite) -def on_microsite_updated(sender, instance, **kwargs): # pylint: disable=unused-argument - """ - Archive the microsite on an update operation - """ - - if instance.id: - # on an update case, get the original and archive it - original = Microsite.objects.get(id=instance.id) - _make_archive_copy(original) - - -class MicrositeOrganizationMapping(models.Model): - """ - Mapping of Organization to which Microsite it belongs - - .. no_pii: - """ - - organization = models.CharField(max_length=63, db_index=True, unique=True) - microsite = models.ForeignKey(Microsite, db_index=True, on_delete=models.CASCADE) - - def __unicode__(self): - """String conversion""" - return u'{microsite_key}: {organization}'.format( - microsite_key=self.microsite.key, - organization=self.organization - ) - - @classmethod - def get_organizations_for_microsite_by_pk(cls, microsite_pk): - """ - Returns a list of organizations associated with the microsite key, returned as a set - """ - return cls.objects.filter(microsite_id=microsite_pk).values_list('organization', flat=True) - - @classmethod - def get_microsite_for_organization(cls, org): - """ - Returns the microsite object for a given organization based on the table mapping, None if - no mapping exists - """ - - try: - item = cls.objects.select_related('microsite').get(organization=org) - return item.microsite - except ObjectDoesNotExist: - return None - - -class MicrositeTemplate(models.Model): - """ - A HTML template that a microsite can use - - .. no_pii: - """ - - microsite = models.ForeignKey(Microsite, db_index=True, on_delete=models.CASCADE) - template_uri = models.CharField(max_length=255, db_index=True) - template = models.TextField() - - def __unicode__(self): - """String conversion""" - return u'{microsite_key}: {template_uri}'.format( - microsite_key=self.microsite.key, - template_uri=self.template_uri - ) - - class Meta(object): - """ Meta class for this Django model """ - unique_together = (('microsite', 'template_uri'),) - - @classmethod - def get_template_for_microsite(cls, domain, template_uri): - """ - Returns the template object for the microsite, None if not found - """ - try: - return cls.objects.get(microsite__site__domain=domain, template_uri=template_uri) - except ObjectDoesNotExist: - return None diff --git a/common/djangoapps/microsite_configuration/tests/__init__.py b/common/djangoapps/microsite_configuration/tests/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/common/djangoapps/microsite_configuration/tests/backends/__init__.py b/common/djangoapps/microsite_configuration/tests/backends/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/common/djangoapps/microsite_configuration/tests/backends/test_base.py b/common/djangoapps/microsite_configuration/tests/backends/test_base.py deleted file mode 100644 index 0a7d0031c4d..00000000000 --- a/common/djangoapps/microsite_configuration/tests/backends/test_base.py +++ /dev/null @@ -1,136 +0,0 @@ -""" -Test Microsite base backends. -""" -from __future__ import absolute_import - -import logging - -from django.test import TestCase - -from microsite_configuration.backends.base import AbstractBaseMicrositeBackend - -log = logging.getLogger(__name__) - - -class NullBackend(AbstractBaseMicrositeBackend): - """ - A class that does nothing but inherit from the base class. - We created this class to test methods of AbstractBaseMicrositeBackend class. - Since abstract class cannot be instantiated we created this wrapper class. - """ - def set_config_by_domain(self, domain): - """ - For a given request domain, find a match in our microsite configuration - and make it available to the complete django request process - """ - return super(NullBackend, self).set_config_by_domain(domain) - - def get_template_path(self, relative_path, **kwargs): - """ - Returns a path (string) to a Mako template, which can either be in - an override or will just return what is passed in which is expected to be a string - """ - return super(NullBackend, self).get_template_path(relative_path, **kwargs) - - def get_value(self, val_name, default=None, **kwargs): - """ - Returns a value associated with the request's microsite, if present - """ - return super(NullBackend, self).get_value(val_name, default, **kwargs) - - def get_dict(self, dict_name, default=None, **kwargs): - """ - Returns a dictionary product of merging the request's microsite and - the default value. - This can be used, for example, to return a merged dictonary from the - settings.FEATURES dict, including values defined at the microsite - """ - return super(NullBackend, self).get_dict(dict_name, default, **kwargs) - - def is_request_in_microsite(self): - """ - This will return True/False if the current request is a request within a microsite - """ - return super(NullBackend, self).is_request_in_microsite() - - def has_override_value(self, val_name): - """ - Returns True/False whether a Microsite has a definition for the - specified named value - """ - return super(NullBackend, self).has_override_value(val_name) - - def get_all_config(self): - """ - This returns a set of orgs that are considered within all microsites. - This can be used, for example, to do filtering - """ - return super(NullBackend, self).get_all_config() - - def get_value_for_org(self, org, val_name, default=None): - """ - This returns a configuration value for a microsite which has an org_filter that matches - what is passed in - """ - return super(NullBackend, self).get_value_for_org(org, val_name, default) - - def get_all_orgs(self): - """ - This returns a set of orgs that are considered within a microsite. This can be used, - for example, to do filtering - """ - return super(NullBackend, self).get_all_orgs() - - def clear(self): - """ - Clears out any microsite configuration from the current request/thread - """ - return super(NullBackend, self).clear() - - -class AbstractBaseMicrositeBackendTests(TestCase): - """ - Go through and test the base abstract class - """ - - def test_cant_create_instance(self): - """ - We shouldn't be able to create an instance of the base abstract class - """ - - with self.assertRaises(TypeError): - AbstractBaseMicrositeBackend() # pylint: disable=abstract-class-instantiated - - def test_not_yet_implemented(self): - """ - Make sure all base methods raise a NotImplementedError exception - """ - - backend = NullBackend() - - with self.assertRaises(NotImplementedError): - backend.set_config_by_domain(None) - - with self.assertRaises(NotImplementedError): - backend.get_value(None, None) - - with self.assertRaises(NotImplementedError): - backend.get_dict(None, None) - - with self.assertRaises(NotImplementedError): - backend.is_request_in_microsite() - - with self.assertRaises(NotImplementedError): - backend.has_override_value(None) - - with self.assertRaises(NotImplementedError): - backend.get_all_config() - - with self.assertRaises(NotImplementedError): - backend.clear() - - with self.assertRaises(NotImplementedError): - backend.get_value_for_org(None, None, None) - - with self.assertRaises(NotImplementedError): - backend.get_all_orgs() diff --git a/common/djangoapps/microsite_configuration/tests/backends/test_database.py b/common/djangoapps/microsite_configuration/tests/backends/test_database.py deleted file mode 100644 index d58c2b9aff7..00000000000 --- a/common/djangoapps/microsite_configuration/tests/backends/test_database.py +++ /dev/null @@ -1,211 +0,0 @@ -""" -Test Microsite database backends. -""" -from __future__ import absolute_import - -import logging -from mock import patch - -from django.conf import settings - -from microsite_configuration.backends.base import ( - BaseMicrositeBackend, - BaseMicrositeTemplateBackend, -) -from microsite_configuration import microsite -from microsite_configuration.models import ( - Microsite, - MicrositeHistory, - MicrositeTemplate, -) -from microsite_configuration.tests.tests import ( - DatabaseMicrositeTestCase, -) -from microsite_configuration.tests.factories import ( - SiteFactory, - MicrositeFactory, - MicrositeTemplateFactory, -) - -log = logging.getLogger(__name__) - - -@patch( - 'microsite_configuration.microsite.BACKEND', - microsite.get_backend( - 'microsite_configuration.backends.database.DatabaseMicrositeBackend', BaseMicrositeBackend - ) -) -class DatabaseMicrositeBackendTests(DatabaseMicrositeTestCase): - """ - Go through and test the DatabaseMicrositeBackend class - """ - def setUp(self): - super(DatabaseMicrositeBackendTests, self).setUp() - self.addCleanup(microsite.clear) - - def test_get_value(self): - """ - Tests microsite.get_value works as expected. - """ - microsite.set_by_domain(self.microsite.site.domain) - self.assertEqual(microsite.get_value('email_from_address'), self.microsite.values['email_from_address']) - - def test_is_request_in_microsite(self): - """ - Tests microsite.is_request_in_microsite works as expected. - """ - microsite.set_by_domain(self.microsite.site.domain) - self.assertTrue(microsite.is_request_in_microsite()) - - def test_get_dict(self): - """ - Tests microsite.get_dict works as expected. - """ - microsite.set_by_domain(self.microsite.site.domain) - self.assertEqual(microsite.get_dict('nested_dict'), self.microsite.values['nested_dict']) - - def test_has_override_value(self): - """ - Tests microsite.has_override_value works as expected. - """ - microsite.set_by_domain(self.microsite.site.domain) - self.assertTrue(microsite.has_override_value('platform_name')) - - def test_get_value_for_org(self): - """ - Tests microsite.get_value_for_org works as expected. - """ - microsite.set_by_domain(self.microsite.site.domain) - self.assertEqual( - microsite.get_value_for_org(self.microsite.get_organizations()[0], 'platform_name'), - self.microsite.values['platform_name'] - ) - - def test_get_all_orgs(self): - """ - Tests microsite.get_all_orgs works as expected. - """ - microsite.set_by_domain(self.microsite.site.domain) - self.assertEqual( - microsite.get_all_orgs(), - set(self.microsite.get_organizations()) - ) - - def test_clear(self): - """ - Tests microsite.clear works as expected. - """ - microsite.set_by_domain(self.microsite.site.domain) - self.assertEqual( - microsite.get_value('platform_name'), - self.microsite.values['platform_name'] - ) - microsite.clear() - self.assertIsNone(microsite.get_value('platform_name')) - - @patch('edxmako.paths.add_lookup') - def test_enable_microsites(self, add_lookup): - """ - Tests microsite.enable_microsites works as expected. - """ - # remove microsite root directory paths first - settings.STATICFILES_DIRS = [ - path for path in settings.STATICFILES_DIRS - if path != settings.MICROSITE_ROOT_DIR - ] - with patch.dict('django.conf.settings.FEATURES', {'USE_MICROSITES': False}): - microsite.enable_microsites(log) - self.assertNotIn(settings.MICROSITE_ROOT_DIR, settings.STATICFILES_DIRS) - add_lookup.assert_not_called() - with patch.dict('django.conf.settings.FEATURES', {'USE_MICROSITES': True}): - microsite.enable_microsites(log) - self.assertIn(settings.MICROSITE_ROOT_DIR, settings.STATICFILES_DIRS) - - def test_get_all_configs(self): - """ - Tests microsite.get_all_config works as expected. - """ - microsite.set_by_domain(self.microsite.site.domain) - configs = microsite.get_all_config() - self.assertEqual(len(list(configs.keys())), 1) - self.assertEqual(configs[self.microsite.key], self.microsite.values) - - def test_set_config_by_domain(self): - """ - Tests microsite.set_config_by_domain works as expected. - """ - microsite.clear() - # if microsite config does not exist - microsite.set_by_domain('unknown') - self.assertIsNone(microsite.get_value('platform_name')) - - # if no microsite exists - Microsite.objects.all().delete() - microsite.clear() - microsite.set_by_domain('unknown') - self.assertIsNone(microsite.get_value('platform_name')) - - # if microsite site has no organization it should raise exception - new_microsite = MicrositeFactory.create(key="test_microsite2") - new_microsite.site = SiteFactory.create(domain='test.microsite2.com') - # This would update microsite so we test MicrositeHistory has old microsite - new_microsite.save() - self.assertEqual(MicrositeHistory.objects.all().count(), 2) - with self.assertRaises(Exception): - microsite.set_by_domain('test.microsite2.com') - - def test_has_configuration_set(self): - """ - Tests microsite.has_configuration_set works as expected on this backend. - """ - self.assertTrue(microsite.BACKEND.has_configuration_set()) - - Microsite.objects.all().delete() - self.assertFalse(microsite.BACKEND.has_configuration_set()) - - -@patch( - 'microsite_configuration.microsite.TEMPLATES_BACKEND', - microsite.get_backend( - 'microsite_configuration.backends.database.DatabaseMicrositeTemplateBackend', BaseMicrositeTemplateBackend - ) -) -class DatabaseMicrositeTemplateBackendTests(DatabaseMicrositeTestCase): - """ - Go through and test the DatabaseMicrositeTemplateBackend class - """ - def setUp(self): - super(DatabaseMicrositeTemplateBackendTests, self).setUp() - MicrositeTemplateFactory.create( - microsite=self.microsite, - template_uri='about.html', - template=""" - <html> - <body> - About this microsite. - </body> - </html> - """, - ) - - def tearDown(self): - super(DatabaseMicrositeTemplateBackendTests, self).tearDown() - microsite.clear() - - def test_microsite_get_template_when_no_template_exists(self): - """ - Test microsite.get_template return None if there is not template in DB. - """ - MicrositeTemplate.objects.all().delete() - microsite.set_by_domain(self.microsite.site.domain) - template = microsite.get_template('about.html') - self.assertIsNone(template) - - def test_microsite_get_template(self): - """ - Test microsite.get_template return appropriate template. - """ - microsite.set_by_domain(self.microsite.site.domain) - template = microsite.get_template('about.html') - self.assertIn('About this microsite', template.render()) diff --git a/common/djangoapps/microsite_configuration/tests/factories.py b/common/djangoapps/microsite_configuration/tests/factories.py deleted file mode 100644 index 6b58dc25ff9..00000000000 --- a/common/djangoapps/microsite_configuration/tests/factories.py +++ /dev/null @@ -1,77 +0,0 @@ -""" -Factories module to hold microsite factories -""" -from __future__ import absolute_import - -import factory -from django.contrib.sites.models import Site -from factory.django import DjangoModelFactory - -from microsite_configuration.models import Microsite, MicrositeOrganizationMapping, MicrositeTemplate - - -class SiteFactory(DjangoModelFactory): - """ - Factory for django.contrib.sites.models.Site - """ - class Meta(object): - model = Site - django_get_or_create = ('domain',) - - name = "test microsite" - domain = "test-site.testserver" - - -class MicrositeFactory(DjangoModelFactory): - """ - Factory for Microsite - """ - class Meta(object): - model = Microsite - - key = "test_site" - site = factory.SubFactory(SiteFactory) - values = { - "domain_prefix": "test-site", - "university": "test_site", - "platform_name": "Test Site DB", - "logo_image_url": "test_site/images/header-logo.png", - "email_from_address": "test_site@edx.org", - "payment_support_email": "test_site_dbe@edx.org", - "ENABLE_MKTG_SITE": False, - "SITE_NAME": "test_site.localhost", - "course_org_filter": "TestSiteX", - "course_about_show_social_links": False, - "css_overrides_file": "test_site/css/test_site.css", - "show_partners": False, - "show_homepage_promo_video": False, - "course_index_overlay_text": "This is a Test Site Overlay Text.", - "course_index_overlay_logo_file": "test_site/images/header-logo.png", - "homepage_overlay_html": "<h1>This is a Test Site Overlay HTML</h1>", - "ALWAYS_REDIRECT_HOMEPAGE_TO_DASHBOARD_FOR_AUTHENTICATED_USER": False, - "COURSE_CATALOG_VISIBILITY_PERMISSION": "see_in_catalog", - "COURSE_ABOUT_VISIBILITY_PERMISSION": "see_about_page", - "ENABLE_SHOPPING_CART": True, - "ENABLE_PAID_COURSE_REGISTRATION": True, - "SESSION_COOKIE_DOMAIN": "test_site.localhost", - "nested_dict": { - "key 1": "value 1", - "key 2": "value 2", - } - } - - -class MicrositeOrganizationMappingFactory(DjangoModelFactory): - """ - Factory for MicrositeOrganizationMapping - """ - class Meta(object): - model = MicrositeOrganizationMapping - - -class MicrositeTemplateFactory(DjangoModelFactory): - """ - Factory for MicrositeTemplate - """ - class Meta(object): - model = MicrositeTemplate diff --git a/common/djangoapps/microsite_configuration/tests/test_admin.py b/common/djangoapps/microsite_configuration/tests/test_admin.py deleted file mode 100644 index e78bdf3da4c..00000000000 --- a/common/djangoapps/microsite_configuration/tests/test_admin.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -Tests for microsite admin -""" -from __future__ import absolute_import - -from django.contrib.admin.sites import AdminSite -from django.http import HttpRequest - -from microsite_configuration.admin import MicrositeAdmin -from microsite_configuration.models import Microsite -from microsite_configuration.tests.tests import DatabaseMicrositeTestCase - - -class MicrositeAdminTests(DatabaseMicrositeTestCase): - """ - Test class for MicrositeAdmin - """ - - def setUp(self): - super(MicrositeAdminTests, self).setUp() - self.adminsite = AdminSite() - self.microsite_admin = MicrositeAdmin(Microsite, self.adminsite) - self.request = HttpRequest() - - def test_fields_in_admin_form(self): - """ - Tests presence of form fields for Microsite. - """ - microsite_form = self.microsite_admin.get_form(self.request, self.microsite) - self.assertEqual( - list(microsite_form.base_fields), - ["site", "key", "values"] - ) - - def test_save_action_admin_form(self): - """ - Tests save action for Microsite model form. - """ - new_values = { - "domain_prefix": "test-site-new", - "platform_name": "Test Site New" - } - microsite_form = self.microsite_admin.get_form(self.request)(instance=self.microsite, data={ - "key": self.microsite.key, - "site": self.microsite.site.id, - "values": new_values, - }) - self.assertTrue(microsite_form.is_valid()) - microsite_form.save() - new_microsite = Microsite.objects.get(key=self.microsite.key) - self.assertEqual(new_microsite.values, new_values) diff --git a/common/djangoapps/microsite_configuration/tests/test_logic.py b/common/djangoapps/microsite_configuration/tests/test_logic.py deleted file mode 100644 index c321f219203..00000000000 --- a/common/djangoapps/microsite_configuration/tests/test_logic.py +++ /dev/null @@ -1,39 +0,0 @@ -""" -Some additional unit tests for Microsite logic. The LMS covers some of the Microsite testing, this adds -some additional coverage -""" -from __future__ import absolute_import - -import ddt -from mock import patch - -from microsite_configuration.backends.base import BaseMicrositeBackend -from microsite_configuration.microsite import get_backend, get_value_for_org -from microsite_configuration.tests.tests import MICROSITE_BACKENDS, DatabaseMicrositeTestCase - - -@ddt.ddt -class TestMicrosites(DatabaseMicrositeTestCase): - """ - Run through some Microsite logic - """ - - @ddt.data(*MICROSITE_BACKENDS) - def test_get_value_for_org_when_microsite_has_no_org(self, site_backend): - """ - Make sure default value is returned if there's no Microsite ORG match - """ - with patch('microsite_configuration.microsite.BACKEND', - get_backend(site_backend, BaseMicrositeBackend)): - value = get_value_for_org("BogusX", "university", "default_value") - self.assertEquals(value, "default_value") - - @ddt.data(*MICROSITE_BACKENDS) - def test_get_value_for_org(self, site_backend): - """ - Make sure get_value_for_org return value of org if it present. - """ - with patch('microsite_configuration.microsite.BACKEND', - get_backend(site_backend, BaseMicrositeBackend)): - value = get_value_for_org("TestSiteX", "university", "default_value") - self.assertEquals(value, "test_site") diff --git a/common/djangoapps/microsite_configuration/tests/test_microsites.py b/common/djangoapps/microsite_configuration/tests/test_microsites.py deleted file mode 100644 index bdd694ed738..00000000000 --- a/common/djangoapps/microsite_configuration/tests/test_microsites.py +++ /dev/null @@ -1,84 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tests configuration templatetags and helper functions. -""" -from __future__ import absolute_import - -import logging - -from django.conf import settings -from django.test import TestCase - -from microsite_configuration import microsite -from microsite_configuration.backends.base import BaseMicrositeBackend -from microsite_configuration.backends.database import DatabaseMicrositeBackend -from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers -from openedx.core.djangoapps.site_configuration.templatetags import configuration as configuration_tags - -log = logging.getLogger(__name__) - - -class MicrositeTests(TestCase): - """ - Make sure some of the helper functions work - """ - def test_breadcrumbs(self): - crumbs = ['my', 'less specific', 'Page'] - expected = u'my | less specific | Page | {}'.format(settings.PLATFORM_NAME) - title = configuration_helpers.page_title_breadcrumbs(*crumbs) - self.assertEqual(expected, title) - - def test_unicode_title(self): - crumbs = [u'øo', u'π tastes gréât', u'驴'] - expected = u'øo | π tastes gréât | 驴 | {}'.format(settings.PLATFORM_NAME) - title = configuration_helpers.page_title_breadcrumbs(*crumbs) - self.assertEqual(expected, title) - - def test_platform_name(self): - pname = configuration_tags.platform_name() - self.assertEqual(pname, settings.PLATFORM_NAME) - - def test_breadcrumb_tag(self): - crumbs = ['my', 'less specific', 'Page'] - expected = u'my | less specific | Page | {}'.format(settings.PLATFORM_NAME) - title = configuration_tags.page_title_breadcrumbs_tag(None, *crumbs) - self.assertEqual(expected, title) - - def test_microsite_template_path(self): - """ - When an unexistent path is passed to the filter, it should return the same path - """ - path = configuration_tags.microsite_template_path('footer.html') - self.assertEqual("footer.html", path) - - def test_get_backend_raise_error_for_invalid_class(self): - """ - Test get_backend returns None for invalid paths - and raises TypeError when invalid class or class name is a method. - """ - # invalid backend path - self.assertEqual(microsite.get_backend(None, BaseMicrositeBackend), None) - - # invalid class or class name is a method - with self.assertRaises(TypeError): - microsite.get_backend('microsite_configuration.microsite.get_backend', BaseMicrositeBackend) - - def test_get_backend_raise_error_when_module_has_no_class(self): - """ - Test get_backend raises ValueError when module does not have a class. - """ - # module does not have a class - with self.assertRaises(ValueError): - microsite.get_backend('microsite_configuration.microsite.invalid_method', BaseMicrositeBackend) - - def test_get_backend_for_valid_class(self): - """ - Test get_backend loads class if class exists. - """ - # load a valid class - self.assertIsInstance( - microsite.get_backend( - 'microsite_configuration.backends.database.DatabaseMicrositeBackend', BaseMicrositeBackend - ), - DatabaseMicrositeBackend - ) diff --git a/common/djangoapps/microsite_configuration/tests/tests.py b/common/djangoapps/microsite_configuration/tests/tests.py deleted file mode 100644 index 2a1375c87c9..00000000000 --- a/common/djangoapps/microsite_configuration/tests/tests.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -Holds base classes for microsite tests -""" -from __future__ import absolute_import - -from django.test import TestCase -from mock import DEFAULT - -from microsite_configuration.tests.factories import MicrositeFactory, MicrositeOrganizationMappingFactory - -MICROSITE_BACKENDS = ( - 'microsite_configuration.backends.filebased.FilebasedMicrositeBackend', - 'microsite_configuration.backends.database.DatabaseMicrositeBackend', -) - - -class DatabaseMicrositeTestCase(TestCase): - """ - Base class for microsite related tests. - """ - def setUp(self): - super(DatabaseMicrositeTestCase, self).setUp() - self.microsite = MicrositeFactory.create() - MicrositeOrganizationMappingFactory.create(microsite=self.microsite, organization='TestSiteX') - - -def side_effect_for_get_value(value, return_value): - """ - returns a side_effect with given return value for a given value - """ - def side_effect(*args, **kwargs): # pylint: disable=unused-argument - """ - A side effect for tests which returns a value based - on a given argument otherwise return actual function. - """ - if args[0] == value: - return return_value - else: - return DEFAULT - return side_effect diff --git a/common/djangoapps/student/helpers.py b/common/djangoapps/student/helpers.py index 9e86c114a99..6a0c9fc7405 100644 --- a/common/djangoapps/student/helpers.py +++ b/common/djangoapps/student/helpers.py @@ -388,7 +388,7 @@ def generate_activation_email_context(user, registration): def create_or_set_user_attribute_created_on_site(user, site): """ - Create or Set UserAttribute indicating the microsite site the user account was created on. + Create or Set UserAttribute indicating the site the user account was created on. User maybe created on 'courses.edx.org', or a white-label site. Due to the very high traffic on this table we now ignore the default site (eg. 'courses.edx.org') and code which comsumes this attribute should assume a 'created_on_site' which doesn't exist diff --git a/common/djangoapps/util/tests/test_db.py b/common/djangoapps/util/tests/test_db.py index 3df590fc95a..c5648be4bad 100644 --- a/common/djangoapps/util/tests/test_db.py +++ b/common/djangoapps/util/tests/test_db.py @@ -222,6 +222,7 @@ class MigrationTests(TestCase): """ Tests for migrations. """ + @unittest.skip("Migration will delete several models. Need to ship not referencing it first. DEPR-12.") @override_settings(MIGRATION_MODULES={}) def test_migrations_are_in_sync(self): """ diff --git a/lms/envs/common.py b/lms/envs/common.py index 49f46fe3636..2f56f92d103 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -255,9 +255,6 @@ FEATURES = { # defaults, so that we maintain current behavior 'ALLOW_WIKI_ROOT_ACCESS': True, - # Turn on/off Microsites feature - 'USE_MICROSITES': False, - # Turn on third-party auth. Disabled for now because full implementations are not yet available. Remember to run # migrations if you enable this; we don't create tables by default. 'ENABLE_THIRD_PARTY_AUTH': False, @@ -646,8 +643,6 @@ def _make_mako_template_dirs(settings): for theme in get_themes_unchecked(themes_dirs, settings.PROJECT_ROOT): if theme.themes_base_dir not in settings.MAKO_TEMPLATE_DIRS_BASE: settings.MAKO_TEMPLATE_DIRS_BASE.insert(0, theme.themes_base_dir) - if settings.FEATURES.get('USE_MICROSITES', False) and getattr(settings, "MICROSITE_CONFIGURATION", False): - settings.MAKO_TEMPLATE_DIRS_BASE.insert(0, settings.MICROSITE_ROOT_DIR) return settings.MAKO_TEMPLATE_DIRS_BASE @@ -673,9 +668,6 @@ CONTEXT_PROCESSORS = [ # Timezone processor (sends language and time_zone preference) 'courseware.context_processor.user_timezone_locale_prefs', - # Allows the open edX footer to be leveraged in Django Templates. - 'edxmako.shortcuts.footer_context_processor', - # Online contextual help 'help_tokens.context_processor', 'openedx.core.djangoapps.site_configuration.context_processors.configuration_context', @@ -732,19 +724,6 @@ derived_collection_entry('TEMPLATES', 1, 'DIRS') DEFAULT_TEMPLATE_ENGINE = TEMPLATES[0] DEFAULT_TEMPLATE_ENGINE_DIRS = DEFAULT_TEMPLATE_ENGINE['DIRS'][:] - -def _add_microsite_dirs_to_default_template_engine(settings): - """ - Derives the final DEFAULT_TEMPLATE_ENGINE['DIRS'] setting from other settings. - """ - if settings.FEATURES.get('USE_MICROSITES', False) and getattr(settings, "MICROSITE_CONFIGURATION", False): - DEFAULT_TEMPLATE_ENGINE_DIRS.append(settings.MICROSITE_ROOT_DIR) - return DEFAULT_TEMPLATE_ENGINE_DIRS - - -DEFAULT_TEMPLATE_ENGINE['DIRS'] = _add_microsite_dirs_to_default_template_engine -derived_collection_entry('DEFAULT_TEMPLATE_ENGINE', 'DIRS') - ############################################################################################### AUTHENTICATION_BACKENDS = [ @@ -1450,7 +1429,6 @@ MIDDLEWARE_CLASSES = [ 'mobile_api.middleware.AppVersionUpgrade', 'openedx.core.djangoapps.header_control.middleware.HeaderControlMiddleware', - 'microsite_configuration.middleware.MicrositeMiddleware', 'lms.djangoapps.discussion.django_comment_client.middleware.AjaxExceptionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.contrib.sites.middleware.CurrentSiteMiddleware', @@ -2383,7 +2361,7 @@ INSTALLED_APPS = [ 'openedx.core.djangoapps.dark_lang', # Microsite configuration - 'microsite_configuration.apps.MicrositeConfigurationConfig', + 'microsite_configuration.MicrositeConfigurationConfig', # RSS Proxy 'rss_proxy', @@ -3441,23 +3419,6 @@ EDX_DRF_EXTENSIONS = { 'JWT_PAYLOAD_USER_ATTRIBUTE_MAPPING': {}, } -################################ Settings for Microsites ################################ - -### Select an implementation for the microsite backend -# for MICROSITE_BACKEND possible choices are -# 1. microsite_configuration.backends.filebased.FilebasedMicrositeBackend -# 2. microsite_configuration.backends.database.DatabaseMicrositeBackend -MICROSITE_BACKEND = 'microsite_configuration.backends.filebased.FilebasedMicrositeBackend' -# for MICROSITE_TEMPLATE_BACKEND possible choices are -# 1. microsite_configuration.backends.filebased.FilebasedMicrositeTemplateBackend -# 2. microsite_configuration.backends.database.DatabaseMicrositeTemplateBackend -MICROSITE_TEMPLATE_BACKEND = 'microsite_configuration.backends.filebased.FilebasedMicrositeTemplateBackend' -# TTL for microsite database template cache -MICROSITE_DATABASE_TEMPLATE_CACHE_TTL = 5 * 60 - -MICROSITE_ROOT_DIR = '/edx/app/edxapp/edx-microsite' -MICROSITE_CONFIGURATION = {} - ################################ Settings for rss_proxy ################################ RSS_PROXY_CACHE_TIMEOUT = 3600 # The length of time we cache RSS retrieved from remote URLs in seconds diff --git a/lms/envs/docs/README.rst b/lms/envs/docs/README.rst index f7c767ae220..77427b54c29 100644 --- a/lms/envs/docs/README.rst +++ b/lms/envs/docs/README.rst @@ -81,8 +81,6 @@ when nested within each other:: for theme in get_themes_unchecked(themes_dirs, settings.PROJECT_ROOT): if theme.themes_base_dir not in settings.MAKO_TEMPLATE_DIRS_BASE: settings.MAKO_TEMPLATE_DIRS_BASE.insert(0, theme.themes_base_dir) - if settings.FEATURES.get('USE_MICROSITES', False) and getattr(settings, "MICROSITE_CONFIGURATION", False): - settings.MAKO_TEMPLATE_DIRS_BASE.insert(0, settings.MICROSITE_ROOT_DIR) return settings.MAKO_TEMPLATE_DIRS_BASE TEMPLATES = [ diff --git a/lms/envs/production.py b/lms/envs/production.py index ec09dc0f069..d8930705523 100644 --- a/lms/envs/production.py +++ b/lms/envs/production.py @@ -898,18 +898,6 @@ CREDIT_HELP_LINK_URL = ENV_TOKENS.get('CREDIT_HELP_LINK_URL', CREDIT_HELP_LINK_U JWT_AUTH.update(ENV_TOKENS.get('JWT_AUTH', {})) JWT_AUTH.update(AUTH_TOKENS.get('JWT_AUTH', {})) -################# MICROSITE #################### -MICROSITE_CONFIGURATION = ENV_TOKENS.get('MICROSITE_CONFIGURATION', {}) -MICROSITE_ROOT_DIR = path(ENV_TOKENS.get('MICROSITE_ROOT_DIR', '')) -# this setting specify which backend to be used when pulling microsite specific configuration -MICROSITE_BACKEND = ENV_TOKENS.get("MICROSITE_BACKEND", MICROSITE_BACKEND) -# this setting specify which backend to be used when loading microsite specific templates -MICROSITE_TEMPLATE_BACKEND = ENV_TOKENS.get("MICROSITE_TEMPLATE_BACKEND", MICROSITE_TEMPLATE_BACKEND) -# TTL for microsite database template cache -MICROSITE_DATABASE_TEMPLATE_CACHE_TTL = ENV_TOKENS.get( - "MICROSITE_DATABASE_TEMPLATE_CACHE_TTL", MICROSITE_DATABASE_TEMPLATE_CACHE_TTL -) - # Offset for pk of courseware.StudentModuleHistoryExtended STUDENTMODULEHISTORYEXTENDED_OFFSET = ENV_TOKENS.get( 'STUDENTMODULEHISTORYEXTENDED_OFFSET', STUDENTMODULEHISTORYEXTENDED_OFFSET diff --git a/lms/envs/test.py b/lms/envs/test.py index 6768c52665f..4d8c6d3b6d0 100644 --- a/lms/envs/test.py +++ b/lms/envs/test.py @@ -417,77 +417,6 @@ PLATFORM_DESCRIPTION = ugettext_lazy(u"Open édX Platform") SITE_NAME = "edx.org" -# set up some testing for microsites -FEATURES['USE_MICROSITES'] = True -MICROSITE_ROOT_DIR = COMMON_ROOT / 'test' / 'test_sites' -MICROSITE_CONFIGURATION = { - "test_site": { - "domain_prefix": "test-site", - "university": "test_site", - "platform_name": "Test Site", - "logo_image_url": "test_site/images/header-logo.png", - "email_from_address": "test_site@edx.org", - "ACTIVATION_EMAIL_FROM_ADDRESS": "test_activate@edx.org", - "payment_support_email": "test_site@edx.org", - "ENABLE_MKTG_SITE": False, - "SITE_NAME": "test_site.localhost", - "course_org_filter": "TestSiteX", - "course_about_show_social_links": False, - "css_overrides_file": "test_site/css/test_site.css", - "show_partners": False, - "show_homepage_promo_video": False, - "course_index_overlay_text": "This is a Test Site Overlay Text.", - "course_index_overlay_logo_file": "test_site/images/header-logo.png", - "homepage_overlay_html": "<h1>This is a Test Site Overlay HTML</h1>", - "ALWAYS_REDIRECT_HOMEPAGE_TO_DASHBOARD_FOR_AUTHENTICATED_USER": False, - "COURSE_CATALOG_VISIBILITY_PERMISSION": "see_in_catalog", - "COURSE_ABOUT_VISIBILITY_PERMISSION": "see_about_page", - "ENABLE_SHOPPING_CART": True, - "ENABLE_PAID_COURSE_REGISTRATION": True, - "SESSION_COOKIE_DOMAIN": "test_site.localhost", - "LINKEDIN_COMPANY_ID": "test", - "FACEBOOK_APP_ID": "12345678908", - "urls": { - 'ABOUT': 'test-site/about', - 'PRIVACY': 'test-site/privacy', - 'TOS_AND_HONOR': 'test-site/tos-and-honor', - }, - }, - "site_with_logistration": { - "domain_prefix": "logistration", - "university": "logistration", - "platform_name": "Test logistration", - "logo_image_url": "test_site/images/header-logo.png", - "email_from_address": "test_site@edx.org", - "ACTIVATION_EMAIL_FROM_ADDRESS": "test_activate@edx.org", - "payment_support_email": "test_site@edx.org", - "ENABLE_MKTG_SITE": False, - "ENABLE_COMBINED_LOGIN_REGISTRATION": True, - "SITE_NAME": "test_site.localhost", - "course_org_filter": "LogistrationX", - "course_about_show_social_links": False, - "css_overrides_file": "test_site/css/test_site.css", - "show_partners": False, - "show_homepage_promo_video": False, - "course_index_overlay_text": "Logistration.", - "course_index_overlay_logo_file": "test_site/images/header-logo.png", - "homepage_overlay_html": "<h1>This is a Logistration HTML</h1>", - "ALWAYS_REDIRECT_HOMEPAGE_TO_DASHBOARD_FOR_AUTHENTICATED_USER": False, - "COURSE_CATALOG_VISIBILITY_PERMISSION": "see_in_catalog", - "COURSE_ABOUT_VISIBILITY_PERMISSION": "see_about_page", - "ENABLE_SHOPPING_CART": True, - "ENABLE_PAID_COURSE_REGISTRATION": True, - "SESSION_COOKIE_DOMAIN": "test_logistration.localhost", - }, - "default": { - "university": "default_university", - "domain_prefix": "www", - } -} - -MICROSITE_TEST_HOSTNAME = 'test-site.testserver' -MICROSITE_LOGISTRATION_HOSTNAME = 'logistration.testserver' - TEST_THEME = COMMON_ROOT / "test" / "test-theme" # add extra template directory for test-only templates diff --git a/lms/tests.py b/lms/tests.py index 43b7e9f5d89..3cf88ca0844 100644 --- a/lms/tests.py +++ b/lms/tests.py @@ -9,7 +9,6 @@ from django.conf import settings from django.test import TestCase from edxmako import LOOKUP, add_lookup -from microsite_configuration import microsite log = logging.getLogger(__name__) @@ -32,21 +31,3 @@ class LmsModuleTests(TestCase): assert settings.FEATURES['ENABLE_API_DOCS'] response = self.client.get('/api-docs/') self.assertEqual(200, response.status_code) - - -class TemplateLookupTests(TestCase): - """ - Tests for TemplateLookup. - """ - - def test_add_lookup_to_main(self): - """Test that any template directories added are not cleared when microsites are enabled.""" - - add_lookup('main', 'external_module', __name__) - directories = LOOKUP['main'].directories - self.assertEqual(len([directory for directory in directories if 'external_module' in directory]), 1) - - # This should not clear the directories list - microsite.enable_microsites(log) - directories = LOOKUP['main'].directories - self.assertEqual(len([directory for directory in directories if 'external_module' in directory]), 1) diff --git a/openedx/tests/settings.py b/openedx/tests/settings.py index b31f7846e0f..97eb1ec558a 100644 --- a/openedx/tests/settings.py +++ b/openedx/tests/settings.py @@ -101,9 +101,6 @@ LMS_ROOT_URL = "http://localhost:8000" MEDIA_ROOT = tempfile.mkdtemp() -MICROSITE_BACKEND = 'microsite_configuration.backends.filebased.FilebasedMicrositeBackend' -MICROSITE_TEMPLATE_BACKEND = 'microsite_configuration.backends.filebased.FilebasedMicrositeTemplateBackend' - RECALCULATE_GRADES_ROUTING_KEY = 'edx.core.default' POLICY_CHANGE_GRADES_ROUTING_KEY = 'edx.core.default' POLICY_CHANGE_TASK_RATE_LIMIT = '300/h' -- GitLab