diff --git a/common/djangoapps/xmodule_modifiers.py b/common/djangoapps/xmodule_modifiers.py index d398dfef0d..3f6db354d6 100644 --- a/common/djangoapps/xmodule_modifiers.py +++ b/common/djangoapps/xmodule_modifiers.py @@ -108,6 +108,22 @@ def add_histogram(get_html, module, user): histogram = grade_histogram(module_id) render_histogram = len(histogram) > 0 + if settings.MITX_FEATURES.get('ENABLE_LMS_MIGRATION'): + [filepath, filename] = getattr(module.descriptor, 'xml_attributes', {}).get('filename', ['', None]) + osfs = module.system.filestore + if filename is not None and osfs.exists(filename): + # if original, unmangled filename exists then use it (github + # doesn't like symlinks) + filepath = filename + data_dir = osfs.root_path.rsplit('/')[-1] + giturl = getattr(module.lms, 'giturl', '') or 'https://github.com/MITx' + edit_link = "%s/%s/tree/master/%s" % (giturl, data_dir, filepath) + else: + edit_link = False + # Need to define all the variables that are about to be used + giturl = "" + data_dir = "" + source_file = module.lms.source_file # source used to generate the problem XML, eg latex or word # useful to indicate to staff if problem has been released or not @@ -121,12 +137,15 @@ def add_histogram(get_html, module, user): staff_context = {'fields': [(field.name, getattr(module, field.name)) for field in module.fields], 'lms_fields': [(field.name, getattr(module.lms, field.name)) for field in module.lms.fields], + 'xml_attributes' : getattr(module.descriptor, 'xml_attributes', {}), 'location': module.location, 'xqa_key': module.lms.xqa_key, 'source_file': source_file, + 'source_url': '%s/%s/tree/master/%s' % (giturl, data_dir, source_file), 'category': str(module.__class__.__name__), # Template uses element_id in js function names, so can't allow dashes 'element_id': module.location.html_id().replace('-', '_'), + 'edit_link': edit_link, 'user': user, 'xqa_server': settings.MITX_FEATURES.get('USE_XQA_SERVER', 'http://xqa:server@content-qa.mitx.mit.edu/xqa'), 'histogram': json.dumps(histogram), diff --git a/common/lib/xmodule/xmodule/modulestore/inheritance.py b/common/lib/xmodule/xmodule/modulestore/inheritance.py index d819abe367..927f01d543 100644 --- a/common/lib/xmodule/xmodule/modulestore/inheritance.py +++ b/common/lib/xmodule/xmodule/modulestore/inheritance.py @@ -8,7 +8,8 @@ INHERITABLE_METADATA = ( # How many days early to show a course element to beta testers (float) # intended to be set per-course, but can be overridden in for specific # elements. Can be a float. - 'days_early_for_beta' + 'days_early_for_beta', + 'giturl' # for git edit link ) def compute_inherited_metadata(descriptor): diff --git a/common/lib/xmodule/xmodule/xml_module.py b/common/lib/xmodule/xmodule/xml_module.py index e5c1708ac4..c8a1ac009c 100644 --- a/common/lib/xmodule/xmodule/xml_module.py +++ b/common/lib/xmodule/xmodule/xml_module.py @@ -102,6 +102,7 @@ class XmlDescriptor(XModuleDescriptor): 'start', 'due', 'graded', 'display_name', 'url_name', 'hide_from_toc', 'ispublic', # if True, then course is listed for all users; see 'xqa_key', # for xqaa server access + 'giturl', # url of git server for origin of file # information about testcenter exams is a dict (of dicts), not a string, # so it cannot be easily exportable as a course element's attribute. 'testcenter_info', @@ -222,6 +223,7 @@ class XmlDescriptor(XModuleDescriptor): definition, children = cls.definition_from_xml(definition_xml, system) if definition_metadata: definition['definition_metadata'] = definition_metadata + definition['filename'] = [ filepath, filename ] return definition, children @@ -315,6 +317,7 @@ class XmlDescriptor(XModuleDescriptor): model_data['children'] = children model_data['xml_attributes'] = {} + model_data['xml_attributes']['filename'] = definition.get('filename', ['', None]) # for git link for key, value in metadata.items(): if key not in set(f.name for f in cls.fields + cls.lms.fields): model_data['xml_attributes'][key] = value diff --git a/lms/djangoapps/instructor/views.py b/lms/djangoapps/instructor/views.py index 89d546eb0e..762b993504 100644 --- a/lms/djangoapps/instructor/views.py +++ b/lms/djangoapps/instructor/views.py @@ -93,13 +93,13 @@ def instructor_dashboard(request, course_id): data += compute_course_stats(course).items() if request.user.is_staff: for field in course.fields: - if getattr(field.scope, 'student', False): + if getattr(field.scope, 'user', False): continue data.append([field.name, json.dumps(field.read_json(course))]) for namespace in course.namespaces: for field in getattr(course, namespace).fields: - if getattr(field.scope, 'student', False): + if getattr(field.scope, 'user', False): continue data.append(["{}.{}".format(namespace, field.name), json.dumps(field.read_json(course))]) diff --git a/lms/templates/staff_problem_info.html b/lms/templates/staff_problem_info.html index 807182b059..7b4abf13fd 100644 --- a/lms/templates/staff_problem_info.html +++ b/lms/templates/staff_problem_info.html @@ -1,15 +1,17 @@ ## The JS for this is defined in xqa_interface.html ${module_content} -%if location.category in ['problem','video','html']: +%if location.category in ['problem','video','html','combinedopenended']: % if edit_link:
% endif @@ -61,6 +63,12 @@ location = ${location | h}${field | h}| XML attributes | |
|---|---|
| ${name} | ${field | h} |