Merge branch 'master' into feature/abarrett/lms-notes-app
This commit is contained in:
@@ -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'))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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'),
|
||||
)
|
||||
|
||||
@@ -137,4 +137,4 @@ def clear_courses():
|
||||
# $ mongo test_xmodule --eval "db.dropDatabase()"
|
||||
_MODULESTORES = {}
|
||||
modulestore().collection.drop()
|
||||
update_templates()
|
||||
update_templates(modulestore('direct'))
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
<hr>
|
||||
</header>
|
||||
|
||||
<%
|
||||
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"
|
||||
%>
|
||||
<p>
|
||||
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
|
||||
<a href="/help" target="_blank">detailed FAQs</a>
|
||||
where most questions have already been answered.
|
||||
</p>
|
||||
|
||||
<div class="close-modal">
|
||||
|
||||
Reference in New Issue
Block a user