diff --git a/cms/djangoapps/contentstore/management/commands/update_templates.py b/cms/djangoapps/contentstore/management/commands/update_templates.py index e94fee64b8..36348314b9 100644 --- a/cms/djangoapps/contentstore/management/commands/update_templates.py +++ b/cms/djangoapps/contentstore/management/commands/update_templates.py @@ -1,4 +1,5 @@ from xmodule.templates import update_templates +from xmodule.modulestore.django import modulestore from django.core.management.base import BaseCommand @@ -6,4 +7,4 @@ class Command(BaseCommand): help = 'Imports and updates the Studio component templates from the code pack and put in the DB' def handle(self, *args, **options): - update_templates() + update_templates(modulestore('direct')) diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py index 07b7032e60..844ba87a11 100644 --- a/cms/djangoapps/contentstore/tests/test_contentstore.py +++ b/cms/djangoapps/contentstore/tests/test_contentstore.py @@ -937,7 +937,7 @@ class TemplateTestCase(ModuleStoreTestCase): self.assertIsNotNone(verify_create) # now run cleanup - update_templates() + update_templates(modulestore('direct')) # now try to find dangling template, it should not be in DB any longer asserted = False diff --git a/cms/envs/aws.py b/cms/envs/aws.py index 59ad8b835e..05c57d8263 100644 --- a/cms/envs/aws.py +++ b/cms/envs/aws.py @@ -43,6 +43,16 @@ CACHES = ENV_TOKENS['CACHES'] SESSION_COOKIE_DOMAIN = ENV_TOKENS.get('SESSION_COOKIE_DOMAIN') +#Email overrides +DEFAULT_FROM_EMAIL = ENV_TOKENS.get('DEFAULT_FROM_EMAIL', DEFAULT_FROM_EMAIL) +DEFAULT_FEEDBACK_EMAIL = ENV_TOKENS.get('DEFAULT_FEEDBACK_EMAIL', DEFAULT_FEEDBACK_EMAIL) +ADMINS = ENV_TOKENS.get('ADMINS', ADMINS) +SERVER_EMAIL = ENV_TOKENS.get('SERVER_EMAIL', SERVER_EMAIL) + +#Timezone overrides +TIME_ZONE = ENV_TOKENS.get('TIME_ZONE', TIME_ZONE) + + for feature, value in ENV_TOKENS.get('MITX_FEATURES', {}).items(): MITX_FEATURES[feature] = value diff --git a/cms/envs/common.py b/cms/envs/common.py index 8effc773e0..a53830082b 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -152,6 +152,7 @@ IGNORABLE_404_ENDS = ('favicon.ico') EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' DEFAULT_FROM_EMAIL = 'registration@edx.org' DEFAULT_FEEDBACK_EMAIL = 'feedback@edx.org' +SERVER_EMAIL = 'devops@edx.org' ADMINS = ( ('edX Admins', 'admin@edx.org'), ) diff --git a/common/djangoapps/terrain/course_helpers.py b/common/djangoapps/terrain/course_helpers.py index f0df456c80..9d6837ae86 100644 --- a/common/djangoapps/terrain/course_helpers.py +++ b/common/djangoapps/terrain/course_helpers.py @@ -137,4 +137,4 @@ def clear_courses(): # $ mongo test_xmodule --eval "db.dropDatabase()" _MODULESTORES = {} modulestore().collection.drop() - update_templates() + update_templates(modulestore('direct')) diff --git a/common/lib/capa/capa/responsetypes.py b/common/lib/capa/capa/responsetypes.py index b06a62ffc6..fda70c6a55 100644 --- a/common/lib/capa/capa/responsetypes.py +++ b/common/lib/capa/capa/responsetypes.py @@ -1783,7 +1783,7 @@ class FormulaResponse(LoncapaResponse): response_tag = 'formularesponse' hint_tag = 'formulahint' allowed_inputfields = ['textline'] - required_attributes = ['answer'] + required_attributes = ['answer', 'samples'] max_inputfields = 1 def setup_response(self): diff --git a/common/lib/xmodule/xmodule/modulestore/mongo.py b/common/lib/xmodule/xmodule/modulestore/mongo.py index c8256422f8..24df17b15b 100644 --- a/common/lib/xmodule/xmodule/modulestore/mongo.py +++ b/common/lib/xmodule/xmodule/modulestore/mongo.py @@ -476,7 +476,15 @@ class MongoModuleStore(ModuleStoreBase): ''' # TODO (vshnayder): Why do I have to specify i4x here? course_filter = Location("i4x", category="course") - return self.get_items(course_filter) + return [ + course + for course + in self.get_items(course_filter) + if not ( + course.location.org == 'edx' and + course.location.course == 'templates' + ) + ] def _find_one(self, location): '''Look for a given location in the collection. If revision is not diff --git a/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py b/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py index 753cbfac4f..98523e9b15 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/django_utils.py @@ -42,7 +42,7 @@ class ModuleStoreTestCase(TestCase): num_templates = modulestore.collection.find(query).count() if num_templates < 1: - update_templates() + update_templates(modulestore) @classmethod def setUpClass(cls): diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py b/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py index 061d70d09f..6332ade04f 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/test_mongo.py @@ -7,6 +7,7 @@ from pprint import pprint from xmodule.modulestore import Location from xmodule.modulestore.mongo import MongoModuleStore from xmodule.modulestore.xml_importer import import_from_xml +from xmodule.templates import update_templates from .test_modulestore import check_path_to_location from . import DATA_DIR @@ -45,6 +46,7 @@ class TestMongoModuleStore(object): # Explicitly list the courses to load (don't want the big one) courses = ['toy', 'simple'] import_from_xml(store, DATA_DIR, courses) + update_templates(store) return store @staticmethod @@ -103,3 +105,11 @@ class TestMongoModuleStore(object): def test_path_to_location(self): '''Make sure that path_to_location works''' check_path_to_location(self.store) + + def test_get_courses_has_no_templates(self): + courses = self.store.get_courses() + for course in courses: + assert_false( + course.location.org == 'edx' and course.location.course == 'templates', + '{0} is a template course'.format(course) + ) diff --git a/common/lib/xmodule/xmodule/templates.py b/common/lib/xmodule/xmodule/templates.py index eaf821155e..f4e37ab0d5 100644 --- a/common/lib/xmodule/xmodule/templates.py +++ b/common/lib/xmodule/xmodule/templates.py @@ -19,7 +19,6 @@ from collections import defaultdict from .x_module import XModuleDescriptor from .mako_module import MakoDescriptorSystem from .modulestore import Location -from .modulestore.django import modulestore log = logging.getLogger(__name__) @@ -50,7 +49,7 @@ class TemplateTestSystem(MakoDescriptorSystem): ) -def update_templates(): +def update_templates(modulestore): """ Updates the set of templates in the modulestore with all templates currently available from the installed plugins @@ -58,7 +57,7 @@ def update_templates(): # cdodge: build up a list of all existing templates. This will be used to determine which # templates have been removed from disk - and thus we need to remove from the DB - templates_to_delete = modulestore('direct').get_items(['i4x', 'edx', 'templates', None, None, None]) + templates_to_delete = modulestore.get_items(['i4x', 'edx', 'templates', None, None, None]) for category, templates in all_templates().items(): for template in templates: @@ -86,9 +85,9 @@ def update_templates(): ), exc_info=True) continue - modulestore('direct').update_item(template_location, template.data) - modulestore('direct').update_children(template_location, template.children) - modulestore('direct').update_metadata(template_location, template.metadata) + modulestore.update_item(template_location, template.data) + modulestore.update_children(template_location, template.children) + modulestore.update_metadata(template_location, template.metadata) # remove template from list of templates to delete templates_to_delete = [t for t in templates_to_delete if t.location != template_location] @@ -97,4 +96,4 @@ def update_templates(): if len(templates_to_delete) > 0: logging.debug('deleting dangling templates = {0}'.format(templates_to_delete)) for template in templates_to_delete: - modulestore('direct').delete_item(template.location) + modulestore.delete_item(template.location) diff --git a/lms/templates/help_modal.html b/lms/templates/help_modal.html index 83ea00068f..deebd391d2 100644 --- a/lms/templates/help_modal.html +++ b/lms/templates/help_modal.html @@ -1,4 +1,6 @@ <%namespace name='static' file='static_content.html'/> +<%! from datetime import datetime %> +<%! import pytz %> <%! from django.conf import settings %> <%! from courseware.tabs import get_discussion_link %> @@ -79,9 +81,16 @@ discussion_link = get_discussion_link(course) if course else None
+ <% + dst = datetime.now(pytz.utc).astimezone(pytz.timezone("America/New_York")).dst() + business_hours = "13:00 UTC to 21:00 UTC" if dst else "14:00 UTC to 22:00 UTC" + %>

- Thanks for your feedback. We will read your message, and our - support team may contact you to respond or ask for further clarification. + Thank you for your inquiry or feedback. We typically respond to a + request within one business day (Monday to Friday, + ${business_hours}.) In the meantime, please review our + detailed FAQs + where most questions have already been answered.