From f25dbc085433178eb0731f6ab7d58bf33b6f0016 Mon Sep 17 00:00:00 2001 From: Bridger Maxwell <bridgeyman@gmail.com> Date: Wed, 18 Jul 2012 13:48:20 -0400 Subject: [PATCH] Added {COURSE_STATIC_URL} format key for about section html. Changed get_about_section to be get_course_about_section in courseware.courses. --- common/lib/xmodule/xmodule/course_module.py | 74 +---------------- lms/djangoapps/courseware/courses.py | 88 ++++++++++++++++++--- lms/templates/course.html | 10 +-- lms/templates/dashboard.html | 11 ++- lms/templates/info.html | 11 ++- lms/templates/portal/course_about.html | 20 ++--- lms/templates/video_modal.html | 5 +- 7 files changed, 111 insertions(+), 108 deletions(-) diff --git a/common/lib/xmodule/xmodule/course_module.py b/common/lib/xmodule/xmodule/course_module.py index 0d5fbcf55b4..90aefe11138 100644 --- a/common/lib/xmodule/xmodule/course_module.py +++ b/common/lib/xmodule/xmodule/course_module.py @@ -1,8 +1,6 @@ import time import dateutil.parser -from fs.errors import ResourceNotFoundError import logging -from path import path from xmodule.modulestore import Location from xmodule.seq_module import SequenceDescriptor, SequenceModule @@ -50,77 +48,7 @@ class CourseDescriptor(SequenceDescriptor): @property def number(self): return self.location.course - - @property - def instructors(self): - return self.get_about_section("instructors").split("\n") @property def wiki_namespace(self): - return self.location.course - - def get_about_section(self, section_key): - """ - This returns the snippet of html to be rendered on the course about page, given the key for the section. - Valid keys: - - overview - - title - - university - - number - - short_description - - description - - key_dates (includes start, end, exams, etc) - - video - - course_staff_short - - course_staff_extended - - requirements - - syllabus - - textbook - - faq - - more_info - """ - - # Many of these are stored as html files instead of some semantic markup. This can change without effecting - # this interface when we find a good format for defining so many snippets of text/html. - - # TODO: Remove number, instructors from this list - if section_key in ['short_description', 'description', 'key_dates', 'video', 'course_staff_short', 'course_staff_extended', - 'requirements', 'syllabus', 'textbook', 'faq', 'more_info', 'number', 'instructors', 'overview', - 'effort', 'end_date', 'prerequisites']: - try: - with self.system.resources_fs.open(path("about") / section_key + ".html") as htmlFile: - return htmlFile.read().decode('utf-8') - except ResourceNotFoundError: - log.warning("Missing about section {key} in course {url}".format(key=section_key, url=self.location.url())) - return None - elif section_key == "title": - return self.metadata.get('display_name', self.name) - elif section_key == "university": - return self.location.org - elif section_key == "number": - return self.number - - raise KeyError("Invalid about key " + str(section_key)) - - def get_info_section(self, section_key): - """ - This returns the snippet of html to be rendered on the course info page, given the key for the section. - Valid keys: - - handouts - - guest_handouts - - updates - - guest_updates - """ - - # Many of these are stored as html files instead of some semantic markup. This can change without effecting - # this interface when we find a good format for defining so many snippets of text/html. - - if section_key in ['handouts', 'guest_handouts', 'updates', 'guest_updates']: - try: - with self.system.resources_fs.open(path("info") / section_key + ".html") as htmlFile: - return htmlFile.read().decode('utf-8') - except ResourceNotFoundError: - log.exception("Missing info section {key} in course {url}".format(key=section_key, url=self.location.url())) - return "! Info section missing !" - - raise KeyError("Invalid about key " + str(section_key)) + return self.location.course \ No newline at end of file diff --git a/lms/djangoapps/courseware/courses.py b/lms/djangoapps/courseware/courses.py index 7e7417166f8..7bf3cd729fc 100644 --- a/lms/djangoapps/courseware/courses.py +++ b/lms/djangoapps/courseware/courses.py @@ -1,4 +1,7 @@ +from fs.errors import ResourceNotFoundError from functools import wraps +import logging +from path import path from django.conf import settings from django.http import Http404 @@ -6,6 +9,7 @@ from django.http import Http404 from xmodule.course_module import CourseDescriptor from xmodule.modulestore.django import modulestore +log = logging.getLogger(__name__) def check_course(course_id, course_must_be_open=True, course_required=True): """ @@ -33,18 +37,80 @@ def check_course(course_id, course_must_be_open=True, course_required=True): return course -def course_static_file_url(course, filepath): - """ - Given a course and a filepath from the course's directory - (like images/course_image.png), this returns the url for - the static file in the form. It will be something like - /static/content-mit-6002x/images/course_image.png. - """ - return "/".join( [settings.STATIC_URL, course.metadata['data_dir'], filepath] ) + +### These methods look like they should be on the course_module object itself, but they rely +### on the lms. Maybe they should be added dynamically to the class? + +def course_static_url(course): + return settings.STATIC_URL + "/" + course.metadata['data_dir'] + "/" def course_image_url(course): - return course_static_file_url(course, "images/course_image.png") - - + return course_static_url(course) + "images/course_image.png" +def get_course_about_section(course, section_key): + """ + This returns the snippet of html to be rendered on the course about page, given the key for the section. + Valid keys: + - overview + - title + - university + - number + - short_description + - description + - key_dates (includes start, end, exams, etc) + - video + - course_staff_short + - course_staff_extended + - requirements + - syllabus + - textbook + - faq + - more_info + """ + + # Many of these are stored as html files instead of some semantic markup. This can change without effecting + # this interface when we find a good format for defining so many snippets of text/html. + +# TODO: Remove number, instructors from this list + if section_key in ['short_description', 'description', 'key_dates', 'video', 'course_staff_short', 'course_staff_extended', + 'requirements', 'syllabus', 'textbook', 'faq', 'more_info', 'number', 'instructors', 'overview', + 'effort', 'end_date', 'prerequisites']: + try: + with course.system.resources_fs.open(path("about") / section_key + ".html") as htmlFile: + return htmlFile.read().decode('utf-8').format(COURSE_STATIC_URL = course_static_url(course) ) + except ResourceNotFoundError: + log.warning("Missing about section {key} in course {url}".format(key=section_key, url=course.location.url())) + return None + elif section_key == "title": + return course.metadata.get('display_name', course.name) + elif section_key == "university": + return course.location.org + elif section_key == "number": + return course.number + + raise KeyError("Invalid about key " + str(section_key)) + +def get_course_info_section(course, section_key): + """ + This returns the snippet of html to be rendered on the course info page, given the key for the section. + Valid keys: + - handouts + - guest_handouts + - updates + - guest_updates + """ + + # Many of these are stored as html files instead of some semantic markup. This can change without effecting + # this interface when we find a good format for defining so many snippets of text/html. + + if section_key in ['handouts', 'guest_handouts', 'updates', 'guest_updates']: + try: + with course.system.resources_fs.open(path("info") / section_key + ".html") as htmlFile: + return htmlFile.read().decode('utf-8') + except ResourceNotFoundError: + log.exception("Missing info section {key} in course {url}".format(key=section_key, url=course.location.url())) + return "! Info section missing !" + + raise KeyError("Invalid about key " + str(section_key)) + \ No newline at end of file diff --git a/lms/templates/course.html b/lms/templates/course.html index 7ff04ad870f..20d052a9380 100644 --- a/lms/templates/course.html +++ b/lms/templates/course.html @@ -1,7 +1,7 @@ <%namespace name='static' file='static_content.html'/> <%! from django.core.urlresolvers import reverse - from courseware.courses import course_image_url + from courseware.courses import course_image_url, get_course_about_section %> <%page args="course" /> @@ -10,7 +10,7 @@ <header class="course-preview"> <a href="${reverse('about_course', args=[course.id])}"> <hgroup> - <h2>${course.number} ${course.get_about_section('title')}</h2> + <h2>${course.number} ${get_course_about_section(course, 'title')}</h2> </hgroup> <div class="info-link">➔</div> </a> @@ -20,15 +20,15 @@ <img src="${course_image_url(course)}"> </div> <div class="desc"> - <p>${course.get_about_section('short_description')}</p> + <p>${get_course_about_section(course, 'short_description')}</p> </div> <div class="bottom"> - <a href="#" class="university">${course.get_about_section('university')}</a> + <a href="#" class="university">${get_course_about_section(course, 'university')}</a> <span class="start-date">${course.start_date_text}</span> </div> </section> </div> <div class="meta-info"> - <p class="university">${course.get_about_section('university')}</p> + <p class="university">${get_course_about_section(course, 'university')}</p> </div> </article> diff --git a/lms/templates/dashboard.html b/lms/templates/dashboard.html index 48579d71176..caf28d920b8 100644 --- a/lms/templates/dashboard.html +++ b/lms/templates/dashboard.html @@ -1,4 +1,7 @@ -<%! from django.core.urlresolvers import reverse %> +<%! + from django.core.urlresolvers import reverse + from courseware.courses import course_image_url, get_course_about_section +%> <%inherit file="main.html" /> <%namespace name='static' file='static_content.html'/> @@ -33,14 +36,14 @@ % for course in courses: <article class="my-course"> - <a href="${reverse('info', args=[course.id])}" class="cover" style="background-image: url('static/images/courses/python.png')"> + <a href="${reverse('info', args=[course.id])}" class="cover" style="background-image: url('${course_image_url(course)}')"> <div class="shade"></div> <div class="arrow"></div> </a> <section class="info"> <hgroup> - <a href="#" class="university">${course.get_about_section('university')}</a> - <h3><a href="${reverse('info', args=[course.id])}">${course.get_about_section("title")}</a></h3> + <a href="#" class="university">${get_course_about_section(course, 'university')}</a> + <h3><a href="${reverse('info', args=[course.id])}">${get_course_about_section(course, "title")}</a></h3> </hgroup> <section class="course-status"> <p>Class Starts - <span>9/2/2012</span></div> diff --git a/lms/templates/info.html b/lms/templates/info.html index d8420a098ae..122a185f3ab 100644 --- a/lms/templates/info.html +++ b/lms/templates/info.html @@ -1,5 +1,8 @@ <%inherit file="main.html" /> <%include file="course_navigation.html" args="active_page='info'" /> +<%! + from courseware.courses import get_course_info_section +%> <section class="container"> <section class="course-content"> @@ -7,17 +10,17 @@ <div class="info-wrapper"> % if user.is_authenticated(): <section class="updates"> - ${course.get_info_section('updates')} + ${get_course_info_section(course, 'updates')} </section> <section aria-label="Handout Navigation" class="handouts"> - ${course.get_info_section('handouts')} + ${get_course_info_section(course, 'handouts')} </section> % else: <section class="updates"> - ${course.get_info_section('guest_updates')} + ${get_course_info_section(course, 'guest_updates')} </section> <section aria-label="Handout Navigation" class="handouts"> - ${course.get_info_section('guest_handouts')} + ${get_course_info_section(course, 'guest_handouts')} </section> % endif </div> diff --git a/lms/templates/portal/course_about.html b/lms/templates/portal/course_about.html index 25f6ce0875a..739b5b5c1b9 100644 --- a/lms/templates/portal/course_about.html +++ b/lms/templates/portal/course_about.html @@ -1,6 +1,6 @@ <%! from django.core.urlresolvers import reverse - from courseware.courses import course_image_url + from courseware.courses import course_image_url, get_course_about_section %> <%namespace name='static' file='../static_content.html'/> <%block name="js_extra"> @@ -14,7 +14,7 @@ <div class="intro-inner-wrapper"> <section class="intro"> <hgroup> - <h1>${course.number}: ${course.get_about_section("title")}</h1><h2><a href="#">${course.get_about_section("university")}</a></h2> + <h1>${course.number}: ${get_course_about_section(course, "title")}</h1><h2><a href="#">${get_course_about_section(course, "university")}</a></h2> </hgroup> <div class="main-cta"> @@ -30,7 +30,7 @@ </div> </section> - % if course.get_about_section("video"): + % if get_course_about_section(course, "video"): <a href="#video-modal" class="media" rel="leanModal"> <div class="hero"> <img src="${course_image_url(course)}" /> @@ -53,7 +53,7 @@ </nav> <div class="inner-wrapper"> - ${course.get_about_section("overview")} + ${get_course_about_section(course, "overview")} </div> </section> @@ -79,16 +79,16 @@ <li><div class="icon start-icon"></div><p>Classes Start</p><span class="start-date">${course.start_date_text}</span></li> ## End date should come from course.xml, but this is a quick hack - % if course.get_about_section("end_date"): - <li><div class="icon final-icon"></div><p>Classes End</p><span class="final-date">${course.get_about_section("end_date")}</span></li> + % if get_course_about_section(course, "end_date"): + <li><div class="icon final-icon"></div><p>Classes End</p><span class="final-date">${get_course_about_section(course, "end_date")}</span></li> % endif - % if course.get_about_section("effort"): - <li><div class="icon"></div><p>Estimated Effort</p><span class="start-date">${course.get_about_section("effort")}</span></li> + % if get_course_about_section(course, "effort"): + <li><div class="icon"></div><p>Estimated Effort</p><span class="start-date">${get_course_about_section(course, "effort")}</span></li> % endif - % if course.get_about_section("prerequisites"): - <li><div class="icon"></div><p>Prerequisites</p><span class="start-date">${course.get_about_section("prerequisites")}</span></li> + % if get_course_about_section(course, "prerequisites"): + <li><div class="icon"></div><p>Prerequisites</p><span class="start-date">${get_course_about_section(course, "prerequisites")}</span></li> % endif ##<li><div class="icon length-icon"></div><p>Course Length</p><span class="course-length">15 weeks</span></li> diff --git a/lms/templates/video_modal.html b/lms/templates/video_modal.html index 3f09857c021..a895df78d01 100644 --- a/lms/templates/video_modal.html +++ b/lms/templates/video_modal.html @@ -1,7 +1,10 @@ +<%! + from courseware.courses import get_course_about_section +%> <%namespace name='static' file='static_content.html'/> <section id="video-modal" class="modal video-modal"> <div class="inner-wrapper"> - ${course.get_about_section("video")} + ${get_course_about_section(course, "video")} </div> </section> -- GitLab