Urls working.
This commit is contained in:
@@ -19,7 +19,7 @@ def i_see_default_checklists(step):
|
||||
assert_true(checklists[0].text.endswith('Getting Started With Studio'))
|
||||
assert_true(checklists[1].text.endswith('Draft a Rough Course Outline'))
|
||||
assert_true(checklists[2].text.endswith("Explore edX\'s Support Tools"))
|
||||
assert_true(checklists[3].text.endswith('Draft your Course Introduction'))
|
||||
assert_true(checklists[3].text.endswith('Draft Your Course About Page'))
|
||||
|
||||
|
||||
@step('I can check and uncheck tasks in a checklist$')
|
||||
|
||||
@@ -2,6 +2,7 @@ from django.conf import settings
|
||||
from xmodule.modulestore import Location
|
||||
from xmodule.modulestore.django import modulestore
|
||||
from xmodule.modulestore.exceptions import ItemNotFoundError
|
||||
from django.core.urlresolvers import reverse
|
||||
|
||||
DIRECT_ONLY_CATEGORIES = ['course', 'chapter', 'sequential', 'about', 'static_tab', 'course_info']
|
||||
|
||||
@@ -158,3 +159,23 @@ def update_item(location, value):
|
||||
get_modulestore(location).delete_item(location)
|
||||
else:
|
||||
get_modulestore(location).update_item(location, value)
|
||||
|
||||
|
||||
def get_url_reverse(course_page_name, course):
|
||||
# TODO: document and write unit tests
|
||||
url_name = getattr(CoursePageNames, course_page_name, None)
|
||||
ctx_loc = course.location
|
||||
|
||||
if CoursePageNames.ManageUsers == url_name:
|
||||
return reverse(url_name, kwargs={"location": ctx_loc})
|
||||
elif url_name in [CoursePageNames.SettingsDetails, CoursePageNames.SettingsGrading, CoursePageNames.CourseOutline]:
|
||||
return reverse(url_name, kwargs={'org' : ctx_loc.org, 'course' : ctx_loc.course, 'name': ctx_loc.name})
|
||||
else:
|
||||
return course_page_name
|
||||
|
||||
|
||||
class CoursePageNames:
|
||||
ManageUsers = "manage_users"
|
||||
SettingsDetails = "settings_details"
|
||||
SettingsGrading = "settings_grading"
|
||||
CourseOutline = "course_index"
|
||||
|
||||
@@ -51,7 +51,7 @@ from xmodule.contentstore.content import StaticContent
|
||||
from auth.authz import is_user_in_course_group_role, get_users_in_course_group_by_role
|
||||
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 get_course_location_for_item, get_lms_link_for_item, compute_unit_state, get_date_display, UnitState, get_course_for_item, get_url_reverse
|
||||
|
||||
from xmodule.modulestore.xml_importer import import_from_xml
|
||||
from contentstore.course_info_model import get_course_updates,\
|
||||
@@ -141,10 +141,7 @@ def index(request):
|
||||
return render_to_response('index.html', {
|
||||
'new_course_template': Location('i4x', 'edx', 'templates', 'course', 'Empty'),
|
||||
'courses': [(course.display_name,
|
||||
reverse('course_index', args=[
|
||||
course.location.org,
|
||||
course.location.course,
|
||||
course.location.name]),
|
||||
get_url_reverse('CourseOutline', course),
|
||||
get_lms_link_for_item(course.location, course_id=course.location.course_id))
|
||||
for course in courses],
|
||||
'user': request.user,
|
||||
@@ -1308,11 +1305,12 @@ def get_checklists(request, org, course, name):
|
||||
course_module.checklists = template_module.checklists
|
||||
modulestore.update_metadata(location, own_metadata(course_module))
|
||||
|
||||
checklists = course_module.checklists
|
||||
create_checklist_action_urls(checklists, course_module)
|
||||
return render_to_response('checklists.html',
|
||||
{
|
||||
'context_course': course_module,
|
||||
'checklists' : course_module.checklists
|
||||
|
||||
'checklists' : checklists
|
||||
})
|
||||
|
||||
|
||||
@@ -1337,15 +1335,24 @@ def update_checklist(request, org, course, name, checklist_index=None):
|
||||
modified_checklist = json.loads(request.body)
|
||||
course_module.checklists[int(checklist_index)] = modified_checklist
|
||||
modulestore.update_metadata(location, own_metadata(course_module))
|
||||
create_checklist_action_urls([modified_checklist], course_module)
|
||||
return HttpResponse(json.dumps(modified_checklist), mimetype="application/json")
|
||||
else:
|
||||
return HttpResponseBadRequest("Could not save checklist state because the checklist index was out of range or unspecified.",
|
||||
content_type="text/plain")
|
||||
elif request.method == 'GET':
|
||||
# In the JavaScript view initialize method, we do a fetch to get all the checklists.
|
||||
return HttpResponse(json.dumps(course_module.checklists), mimetype="application/json")
|
||||
checklists = course_module.checklists
|
||||
create_checklist_action_urls(checklists, course_module)
|
||||
return HttpResponse(json.dumps(checklists), mimetype="application/json")
|
||||
|
||||
|
||||
def create_checklist_action_urls(checklists, course_module):
|
||||
# Expand action names to their URLs.
|
||||
for checklist in checklists:
|
||||
for item in checklist.get('items'):
|
||||
item['action_url'] = get_url_reverse(item.get('action_url'), course_module)
|
||||
|
||||
@login_required
|
||||
@ensure_csrf_cookie
|
||||
def asset_index(request, org, course, name):
|
||||
@@ -1539,10 +1546,7 @@ def import_course(request, org, course, name):
|
||||
return render_to_response('import.html', {
|
||||
'context_course': course_module,
|
||||
'active_tab': 'import',
|
||||
'successful_import_redirect_url': reverse('course_index', args=[
|
||||
course_module.location.org,
|
||||
course_module.location.course,
|
||||
course_module.location.name])
|
||||
'successful_import_redirect_url': get_url_reverse('CourseOutline', course_module)
|
||||
})
|
||||
|
||||
|
||||
|
||||
@@ -45,7 +45,8 @@
|
||||
<% if (item['action_text'] !== '' && item['action_url'] !== '') { %>
|
||||
<ul class="list-actions task-actions">
|
||||
<li>
|
||||
<a href="<%= item['action_url'] %>" class="action action-primary"><%= item['action_text'] %></a>
|
||||
<a href="<%= item['action_url'] %>" rel="external" class="action action-primary"
|
||||
title="This link will open in a new browser window/tab"><%= item['action_text'] %></a>
|
||||
</li>
|
||||
</ul>
|
||||
<% } %>
|
||||
|
||||
@@ -5,7 +5,8 @@ CMS.Views.Checklists = Backbone.View.extend({
|
||||
|
||||
events : {
|
||||
'click .course-checklist .checklist-title' : "toggleChecklist",
|
||||
'click .course-checklist .task input' : "toggleTask"
|
||||
'click .course-checklist .task input' : "toggleTask",
|
||||
'click a[rel="external"]' : "openInNewTab"
|
||||
},
|
||||
|
||||
initialize : function() {
|
||||
@@ -60,7 +61,7 @@ CMS.Views.Checklists = Backbone.View.extend({
|
||||
},
|
||||
|
||||
toggleChecklist : function(e) {
|
||||
(e).preventDefault();
|
||||
e.preventDefault();
|
||||
$(e.target).closest('.course-checklist').toggleClass('is-collapsed');
|
||||
},
|
||||
|
||||
@@ -84,6 +85,11 @@ CMS.Views.Checklists = Backbone.View.extend({
|
||||
},
|
||||
error : CMS.ServerError
|
||||
});
|
||||
},
|
||||
|
||||
openInNewTab : function(e) {
|
||||
e.preventDefault();
|
||||
window.open($(e.target).attr('href'));
|
||||
}
|
||||
|
||||
});
|
||||
@@ -58,7 +58,7 @@
|
||||
<ul>
|
||||
<li class="nav-item nav-course-tools-import"><a href="${reverse('import_course', kwargs=dict(org=ctx_loc.org, course=ctx_loc.course, name=ctx_loc.name))}">Import</a></li>
|
||||
<li class="nav-item nav-course-tools-export"><a href="${reverse('export_course', kwargs=dict(org=ctx_loc.org, course=ctx_loc.course, name=ctx_loc.name))}">Export</a></li>
|
||||
<li class="nav-item nav-course-tools-checklists"><a href="${reverse('checklists', kwargs=dict(org=ctx_loc.org, course=ctx_loc.course, name=ctx_loc.name))}">Tasks & Checklists</a></li>
|
||||
<li class="nav-item nav-course-tools-checklists"><a href="${reverse('checklists', kwargs=dict(org=ctx_loc.org, course=ctx_loc.course, name=ctx_loc.name))}">Checklists</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from django.conf import settings
|
||||
from django.conf.urls import patterns, include, url
|
||||
from . import one_time_startup
|
||||
|
||||
# Uncomment the next two lines to enable the admin:
|
||||
# from django.contrib import admin
|
||||
@@ -44,8 +43,8 @@ urlpatterns = ('',
|
||||
'contentstore.views.remove_user', name='remove_user'),
|
||||
url(r'^(?P<org>[^/]+)/(?P<course>[^/]+)/info/(?P<name>[^/]+)$', 'contentstore.views.course_info', name='course_info'),
|
||||
url(r'^(?P<org>[^/]+)/(?P<course>[^/]+)/course_info/updates/(?P<provided_id>.*)$', 'contentstore.views.course_info_updates', name='course_info'),
|
||||
url(r'^(?P<org>[^/]+)/(?P<course>[^/]+)/settings-details/(?P<name>[^/]+)$', 'contentstore.views.get_course_settings', name='course_settings'),
|
||||
url(r'^(?P<org>[^/]+)/(?P<course>[^/]+)/settings-grading/(?P<name>[^/]+)$', 'contentstore.views.course_config_graders_page', name='course_settings'),
|
||||
url(r'^(?P<org>[^/]+)/(?P<course>[^/]+)/settings-details/(?P<name>[^/]+)$', 'contentstore.views.get_course_settings', name='settings_details'),
|
||||
url(r'^(?P<org>[^/]+)/(?P<course>[^/]+)/settings-grading/(?P<name>[^/]+)$', 'contentstore.views.course_config_graders_page', name='settings_grading'),
|
||||
url(r'^(?P<org>[^/]+)/(?P<course>[^/]+)/settings-details/(?P<name>[^/]+)/section/(?P<section>[^/]+).*$', 'contentstore.views.course_settings_updates', name='course_settings'),
|
||||
url(r'^(?P<org>[^/]+)/(?P<course>[^/]+)/settings-grading/(?P<name>[^/]+)/(?P<grader_index>.*)$', 'contentstore.views.course_grader_updates', name='course_settings'),
|
||||
# This is the URL to initially render the course advanced settings.
|
||||
|
||||
@@ -7,17 +7,17 @@ metadata:
|
||||
"items" : [{"short_description": "Add Course Team Members",
|
||||
"long_description": "Grant your collaborators permission to edit your course so you can work together.",
|
||||
"is_checked": false,
|
||||
"action_url": "/manage_users/",
|
||||
"action_url": "ManageUsers",
|
||||
"action_text": "Edit Course Team"},
|
||||
{"short_description": "Set Important Dates for Your Course",
|
||||
"long_description": "Establish your course's student enrollment and launch dates on the Schedule and Details page.",
|
||||
"is_checked": false,
|
||||
"action_url": "/settings-details/",
|
||||
"action_url": "SettingsDetails",
|
||||
"action_text": "Edit Course Details & Schedule"},
|
||||
{"short_description": "Draft Your Course's Grading Policy",
|
||||
"long_description": "Set up your assignment types and grading policy even if you haven't created all your assignments.",
|
||||
"is_checked": false,
|
||||
"action_url": "/settings-grading/",
|
||||
"action_url": "SettingsGrading",
|
||||
"action_text": "Edit Grading Settings"},
|
||||
{"short_description": "Explore the Other Studio Checklists",
|
||||
"long_description": "Discover other available course authoring tools, and find help when you need it.",
|
||||
@@ -29,37 +29,37 @@ metadata:
|
||||
"items" : [{"short_description": "Create Your First Section and Subsection",
|
||||
"long_description": "Use your course outline to build your first Section and Subsection.",
|
||||
"is_checked": false,
|
||||
"action_url": "/course/",
|
||||
"action_url": "CourseOutline",
|
||||
"action_text": "Edit Course Outline"},
|
||||
{"short_description": "Set Section Release Dates",
|
||||
"long_description": "Specify the release dates for each Section in your course. Sections become visible to students on their release dates.",
|
||||
"is_checked": false,
|
||||
"action_url": "/course/",
|
||||
"action_url": "CourseOutline",
|
||||
"action_text": "Edit Course Outline"},
|
||||
{"short_description": "Designate a Subsection as Graded",
|
||||
"long_description": "Set a Subsection to be graded as a specific assignment type. Assignments within graded Subsections count toward a student's final grade.",
|
||||
"is_checked": false,
|
||||
"action_url": "/course/",
|
||||
"action_url": "CourseOutline",
|
||||
"action_text": "Edit Course Outline"},
|
||||
{"short_description": "Reordering Course Content",
|
||||
"long_description": "Use drag and drop to reorder the content in your course.",
|
||||
"is_checked": false,
|
||||
"action_url": "/course/",
|
||||
"action_url": "CourseOutline",
|
||||
"action_text": "Edit Course Outline"},
|
||||
{"short_description": "Renaming Sections",
|
||||
"long_description": "Rename Sections by clicking the Section name from the Course Outline.",
|
||||
"is_checked": false,
|
||||
"action_url": "/course/",
|
||||
"action_url": "CourseOutline",
|
||||
"action_text": "Edit Course Outline"},
|
||||
{"short_description": "Deleting Course Content",
|
||||
"long_description": "Delete Sections, Subsections, or Units you don't need anymore. Be careful, as there is no Undo function.",
|
||||
"is_checked": false,
|
||||
"action_url": "/course/",
|
||||
"action_url": "CourseOutline",
|
||||
"action_text": "Edit Course Outline"},
|
||||
{"short_description": "Add an Instructor-Only Section to Your Outline",
|
||||
"long_description": "Some course authors find using a section for unsorted, in-progress work useful. To do this, create a section and set the release date to the distant future.",
|
||||
"is_checked": false,
|
||||
"action_url": "/course/",
|
||||
"action_url": "CourseOutline",
|
||||
"action_text": "Edit Course Outline"}]
|
||||
},
|
||||
{"short_description" : "Explore edX's Support Tools",
|
||||
@@ -71,35 +71,35 @@ metadata:
|
||||
{"short_description": "Enroll in edX 101",
|
||||
"long_description": "Register for edX 101, edX's primer for course creation.",
|
||||
"is_checked": false,
|
||||
"action_url": "/",
|
||||
"action_url": "https://edge.edx.org/courses/edX/edX101/How_to_Create_an_edX_Course/about",
|
||||
"action_text": "Register for edX 101"},
|
||||
{"short_description": "Download the Studio Documentation",
|
||||
"long_description": "Download the searchable Studio reference documentation in PDF form.",
|
||||
"is_checked": false,
|
||||
"action_url": "/",
|
||||
"action_url": "http://help.edge.edx.org/help/assets/8ccd409f979c8639dd463e126eb840dc67f09098/Getting_Started_with_Studio.pdf",
|
||||
"action_text": "Download Documentation"}]
|
||||
},
|
||||
{"short_description" : "Draft Your Course About Page",
|
||||
"items" : [{"short_description": "Draft a Course Description",
|
||||
"long_description": "Courses on edX have an About page that includes a course video, description, and more. Draft the text students will read before deciding to enroll in your course.",
|
||||
"is_checked": false,
|
||||
"action_url": "/settings-details/",
|
||||
"action_text": "Edit Course Details & Schedule"},
|
||||
"action_url": "SettingsDetails",
|
||||
"action_text": "Edit Course Schedule & Details"},
|
||||
{"short_description": "Add Staff Bios",
|
||||
"long_description": "Showing prospective students who their instructor will be is helpful. Include staff bios on the course About page.",
|
||||
"is_checked": false,
|
||||
"action_url": "/settings-details/",
|
||||
"action_text": "Edit Course Details & Schedule"},
|
||||
"action_url": "SettingsDetails",
|
||||
"action_text": "Edit Course Schedule & Details"},
|
||||
{"short_description": "Add Course FAQs",
|
||||
"long_description": "Include a short list of frequently asked questions about your course.",
|
||||
"is_checked": false,
|
||||
"action_url": "/settings-details/",
|
||||
"action_text": "Edit Course Details & Schedule"},
|
||||
"action_url": "SettingsDetails",
|
||||
"action_text": "Edit Course Schedule & Details"},
|
||||
{"short_description": "Add Course Prerequisites",
|
||||
"long_description": "Let students know what knowledge and/or skills they should have before they enroll in your course.",
|
||||
"is_checked": false,
|
||||
"action_url": "/settings-details/",
|
||||
"action_text": "Edit Course Details & Schedule"}]
|
||||
"action_url": "SettingsDetails",
|
||||
"action_text": "Edit Course Schedule & Details"}]
|
||||
}
|
||||
]
|
||||
data: { 'textbooks' : [ ], 'wiki_slug' : null }
|
||||
|
||||
Reference in New Issue
Block a user