Commit 4c8a45f8 by Vik Paruchuri

Code to add in an open ended tab automatically

parent 4b5837ff
......@@ -2,9 +2,10 @@ from django.conf import settings
from xmodule.modulestore import Location
from xmodule.modulestore.django import modulestore
from xmodule.modulestore.exceptions import ItemNotFoundError
import copy
DIRECT_ONLY_CATEGORIES = ['course', 'chapter', 'sequential', 'about', 'static_tab', 'course_info']
OPEN_ENDED_PANEL = {"name" : "Open Ended Panel", "type" : "open_ended"}
def get_modulestore(location):
"""
......@@ -158,3 +159,12 @@ def update_item(location, value):
get_modulestore(location).delete_item(location)
else:
get_modulestore(location).update_item(location, value)
def add_open_ended_panel_tab(course):
course_tabs = copy.copy(course.tabs)
changed = False
if OPEN_ENDED_PANEL not in course_tabs:
course_tabs.append(OPEN_ENDED_PANEL)
changed = True
return changed, course_tabs
......@@ -47,6 +47,7 @@ from auth.authz import is_user_in_course_group_role, get_users_in_course_group_b
from auth.authz import get_user_by_email, add_user_to_course_group, remove_user_from_course_group
from auth.authz import INSTRUCTOR_ROLE_NAME, STAFF_ROLE_NAME, create_all_course_groups
from .utils import get_course_location_for_item, get_lms_link_for_item, compute_unit_state, get_date_display, UnitState, get_course_for_item
from .utils import add_open_ended_panel_tab
from xmodule.modulestore.xml_importer import import_from_xml
from contentstore.course_info_model import get_course_updates,\
......@@ -68,7 +69,8 @@ log = logging.getLogger(__name__)
COMPONENT_TYPES = ['customtag', 'discussion', 'html', 'problem', 'video']
ADVANCED_COMPONENT_TYPES = ['annotatable','combinedopenended', 'peergrading']
OPEN_ENDED_COMPONENT_TYPES = ["combinedopenended", "peergrading"]
ADVANCED_COMPONENT_TYPES = ['annotatable'] + OPEN_ENDED_COMPONENT_TYPES
ADVANCED_COMPONENT_CATEGORY = 'advanced'
ADVANCED_COMPONENT_POLICY_KEY = 'advanced_modules'
......@@ -295,6 +297,9 @@ def edit_unit(request, location):
# in ADVANCED_COMPONENT_TYPES that should be enabled for the course.
course_metadata = CourseMetadata.fetch(course.location)
course_advanced_keys = course_metadata.get(ADVANCED_COMPONENT_POLICY_KEY, [])
log.debug(course.tabs)
log.debug(type(course.tabs))
log.debug("LOOK HERE NOW!!!!!")
# Set component types according to course policy file
component_types = list(COMPONENT_TYPES)
......@@ -1329,7 +1334,26 @@ def course_advanced_updates(request, org, course, name):
return HttpResponse(json.dumps(CourseMetadata.delete_key(location, json.loads(request.body))), mimetype="application/json")
elif real_method == 'POST' or real_method == 'PUT':
# NOTE: request.POST is messed up because expect_json cloned_request.POST.copy() is creating a defective entry w/ the whole payload as the key
return HttpResponse(json.dumps(CourseMetadata.update_from_json(location, json.loads(request.body))), mimetype="application/json")
request_body = json.loads(request.body)
filter_tabs = True
if ADVANCED_COMPONENT_POLICY_KEY in request_body:
log.debug("Advanced component in.")
for oe_type in OPEN_ENDED_COMPONENT_TYPES:
log.debug(request_body[ADVANCED_COMPONENT_POLICY_KEY])
if oe_type in request_body[ADVANCED_COMPONENT_POLICY_KEY]:
log.debug("OE type in.")
course_module = modulestore().get_item(location)
changed, new_tabs = add_open_ended_panel_tab(course_module)
log.debug(new_tabs)
if changed:
request_body.update({'tabs' : new_tabs})
filter_tabs = False
break
log.debug(request_body)
log.debug(filter_tabs)
log.debug("LOOK HERE FOR TAB SAVING!!!!")
response_json = json.dumps(CourseMetadata.update_from_json(location, request_body, filter_tabs=filter_tabs))
return HttpResponse(response_json, mimetype="application/json")
@login_required
......
from xmodule.modulestore import Location
from contentstore.utils import get_modulestore
from xmodule.x_module import XModuleDescriptor
import copy
class CourseMetadata(object):
......@@ -30,7 +31,7 @@ class CourseMetadata(object):
return course
@classmethod
def update_from_json(cls, course_location, jsondict):
def update_from_json(cls, course_location, jsondict, filter_tabs=True):
"""
Decode the json into CourseMetadata and save any changed attrs to the db.
......@@ -40,9 +41,13 @@ class CourseMetadata(object):
dirty = False
filtered_list = copy.copy(cls.FILTERED_LIST)
if not filter_tabs:
filtered_list.remove("tabs")
for k, v in jsondict.iteritems():
# should it be an error if one of the filtered list items is in the payload?
if k not in cls.FILTERED_LIST and (k not in descriptor.metadata or descriptor.metadata[k] != v):
if k not in filtered_list and (k not in descriptor.metadata or descriptor.metadata[k] != v):
dirty = True
descriptor.metadata[k] = v
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment