From b5ab766092c340da375d6accee111c4478508a6c Mon Sep 17 00:00:00 2001 From: Brian Wilson Date: Wed, 6 Mar 2013 17:57:33 -0500 Subject: [PATCH 01/60] initial framework for htmlbook --- common/lib/xmodule/xmodule/course_module.py | 7 ++++ lms/djangoapps/courseware/tabs.py | 11 ++++++ lms/djangoapps/staticbook/views.py | 40 +++++++++++++++++++-- lms/urls.py | 5 +++ 4 files changed, 60 insertions(+), 3 deletions(-) diff --git a/common/lib/xmodule/xmodule/course_module.py b/common/lib/xmodule/xmodule/course_module.py index 72196f92a2..3923d3f056 100644 --- a/common/lib/xmodule/xmodule/course_module.py +++ b/common/lib/xmodule/xmodule/course_module.py @@ -358,6 +358,13 @@ class CourseDescriptor(SequenceDescriptor): """ return self.metadata.get('pdf_textbooks') + @property + def html_textbooks(self): + """ + Return the html_textbooks config, as a python object, or None if not specified. + """ + return self.metadata.get('html_textbooks') + @tabs.setter def tabs(self, value): self.metadata['tabs'] = value diff --git a/lms/djangoapps/courseware/tabs.py b/lms/djangoapps/courseware/tabs.py index b31aeb6b5a..4a9de0792f 100644 --- a/lms/djangoapps/courseware/tabs.py +++ b/lms/djangoapps/courseware/tabs.py @@ -130,6 +130,17 @@ def _pdf_textbooks(tab, user, course, active_page): for index, textbook in enumerate(course.pdf_textbooks)] return [] +def _html_textbooks(tab, user, course, active_page): + """ + Generates one tab per textbook. Only displays if user is authenticated. + """ + if user.is_authenticated(): + # since there can be more than one textbook, active_page is e.g. "book/0". + return [CourseTab(textbook['tab_title'], reverse('html_book', args=[course.id, index]), + active_page == "htmltextbook/{0}".format(index)) + for index, textbook in enumerate(course.html_textbooks)] + return [] + def _staff_grading(tab, user, course, active_page): if has_access(user, course, 'staff'): link = reverse('staff_grading', args=[course.id]) diff --git a/lms/djangoapps/staticbook/views.py b/lms/djangoapps/staticbook/views.py index a391b1cb32..8e973ac97d 100644 --- a/lms/djangoapps/staticbook/views.py +++ b/lms/djangoapps/staticbook/views.py @@ -57,12 +57,46 @@ def pdf_index(request, course_id, book_index, chapter=None, page=None): # then remap all the chapter URLs as well, if they are provided. if 'chapters' in textbook: for entry in textbook['chapters']: - entry['url'] = remap_static_url(entry['url'], course) + entry['url'] = remap_static_url(entry['url'], course) return render_to_response('static_pdfbook.html', - {'book_index': book_index, - 'course': course, + {'book_index': book_index, + 'course': course, + 'textbook': textbook, + 'chapter': chapter, + 'page': page, + 'staff_access': staff_access}) + +@login_required +def html_index(request, course_id, book_index, chapter=None, page=None): + course = get_course_with_access(request.user, course_id, 'load') + staff_access = has_access(request.user, course, 'staff') + + book_index = int(book_index) + textbook = course.html_textbooks[book_index] + + def remap_static_url(original_url, course): + input_url = "'" + original_url + "'" + output_url = replace_static_urls( + input_url, + course.metadata['data_dir'], + course_namespace=course.location + ) + # strip off the quotes again... + return output_url[1:-1] + + if 'url' in textbook: + textbook['url'] = remap_static_url(textbook['url'], course) + # then remap all the chapter URLs as well, if they are provided. + if 'chapters' in textbook: + for entry in textbook['chapters']: + entry['url'] = remap_static_url(entry['url'], course) + + + return render_to_response('static_htmlbook.html', + {'book_index': book_index, + 'course': course, 'textbook': textbook, 'chapter': chapter, 'page': page, diff --git a/lms/urls.py b/lms/urls.py index 5e5ac9a7f2..b85bc3d458 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -285,6 +285,11 @@ if settings.COURSEWARE_ENABLED: url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/pdfbook/(?P[^/]*)/chapter/(?P[^/]*)/(?P[^/]*)$', 'staticbook.views.pdf_index'), + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/htmlbook/(?P[^/]*)/$', + 'staticbook.views.html_index', name="html_book"), + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/htmlbook/(?P[^/]*)/(?P[^/]*)$', + 'staticbook.views.html_index'), + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/courseware/?$', 'courseware.views.index', name="courseware"), url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/courseware/(?P[^/]*)/$', From aee7d856942b403b768f9a0a9781502777c99401 Mon Sep 17 00:00:00 2001 From: Brian Wilson Date: Thu, 7 Mar 2013 02:01:42 -0500 Subject: [PATCH 02/60] fix bug in tabs --- lms/djangoapps/courseware/tabs.py | 1 + lms/templates/static_htmlbook.html | 71 ++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 lms/templates/static_htmlbook.html diff --git a/lms/djangoapps/courseware/tabs.py b/lms/djangoapps/courseware/tabs.py index 4a9de0792f..a956c03eeb 100644 --- a/lms/djangoapps/courseware/tabs.py +++ b/lms/djangoapps/courseware/tabs.py @@ -220,6 +220,7 @@ VALID_TAB_TYPES = { 'external_link': TabImpl(key_checker(['name', 'link']), _external_link), 'textbooks': TabImpl(null_validator, _textbooks), 'pdf_textbooks': TabImpl(null_validator, _pdf_textbooks), + 'html_textbooks': TabImpl(null_validator, _html_textbooks), 'progress': TabImpl(need_name, _progress), 'static_tab': TabImpl(key_checker(['name', 'url_slug']), _static_tab), 'peer_grading': TabImpl(null_validator, _peer_grading), diff --git a/lms/templates/static_htmlbook.html b/lms/templates/static_htmlbook.html new file mode 100644 index 0000000000..e3caa9c0ce --- /dev/null +++ b/lms/templates/static_htmlbook.html @@ -0,0 +1,71 @@ +<%inherit file="main.html" /> +<%namespace name='static' file='static_content.html'/> +<%block name="title"> + + + ${course.number} Textbook + + +<%block name="headextra"> +<%static:css group='course'/> +<%static:js group='courseware'/> + + +<%block name="js_extra"> + + + +<%include file="/courseware/course_navigation.html" args="active_page='htmltextbook/{0}'.format(book_index)" /> + +
+
+ + %if 'chapters' in textbook: +
+
    + <%def name="print_entry(entry, index_value)"> +
  • + + ${entry.get('title')} + +
  • + + + % for (index, entry) in enumerate(textbook['chapters']): + ${print_entry(entry, index+1)} + % endfor +
+
+ %endif + +
+ + ") + parentElement = document.getElementById('bookpage'); + while (parentElement.hasChildNodes()) + parentElement.removeChild(parentElement.lastChild); + + $('"') + // .css({'height':'40px','width':'200px'}) + .appendTo('#bookpage'); + } + }; + + loadUrl = function htmlViewLoadUrl(url, anchorId) { + var newurl = url; + if (anchorId != null) { + newurl = url + "#" + anchorId; + } + // clear out previous load, if any: + parentElement = document.getElementById('bookpage'); + while (parentElement.hasChildNodes()) + parentElement.removeChild(parentElement.lastChild); + + $('#bookpage').load(newurl); + + }; + + loadChapterUrl = function htmlViewLoadChapterUrl(chapterNum, anchorId) { + if (chapterNum < 1 || chapterNum > chapterUrls.length) { + return; + } + var chapterUrl = chapterUrls[chapterNum-1]; + loadUrl(chapterUrl, anchorId); + }; + + // define navigation links for chapters: + if (chapterUrls != null) { + var loadChapterUrlHelper = function(i) { + return function(event) { + // when opening a new chapter, always open to the top: + loadChapterUrl(i, null); + }; + }; + for (var index = 1; index <= chapterUrls.length; index += 1) { + $("#htmlchapter-" + index).click(loadChapterUrlHelper(index)); + } + } + + // finally, load the appropriate url/page + if (urlToLoad != null) { + loadUrl(urlToLoad, anchorToLoad); + } else { + loadChapterUrl(chapterToLoad, anchorToLoad); + } + + } +})(jQuery); $(document).ready(function() { var options = {}; @@ -29,10 +105,8 @@ %if chapter is not None: options.chapterNum = ${chapter}; %endif - %if page is not None: - options.pageNum = ${page}; - %endif + $('#outerContainer').myHTMLViewer(options); }); @@ -43,29 +117,29 @@
%if 'chapters' in textbook: -
-
    - <%def name="print_entry(entry, index_value)"> -
  • - - ${entry.get('title')} - -
  • - +
    +
      + <%def name="print_entry(entry, index_value)"> +
    • + + ${entry.get('title')} + +
    • + - % for (index, entry) in enumerate(textbook['chapters']): - ${print_entry(entry, index+1)} - % endfor -
    -
    + %for (index, entry) in enumerate(textbook['chapters']): + ${print_entry(entry, index+1)} + % endfor +
+
%endif
- - ") - parentElement = document.getElementById('bookpage'); - while (parentElement.hasChildNodes()) - parentElement.removeChild(parentElement.lastChild); - - $('"') - // .css({'height':'40px','width':'200px'}) - .appendTo('#bookpage'); - } - }; + if (options.chapters) { + anchorToLoad = options.anchor_id; + } loadUrl = function htmlViewLoadUrl(url, anchorId) { - var newurl = url; - if (anchorId != null) { - newurl = url + "#" + anchorId; - } // clear out previous load, if any: parentElement = document.getElementById('bookpage'); while (parentElement.hasChildNodes()) parentElement.removeChild(parentElement.lastChild); + // load new URL in: + $('#bookpage').load(url); - $('#bookpage').load(newurl); + // if there is an anchor set, then go to that location: + if (anchorId != null) { + // TODO: add implementation.... + } }; @@ -105,6 +92,9 @@ %if chapter is not None: options.chapterNum = ${chapter}; %endif + %if anchor_id is not None: + options.anchor_id = ${anchor_id}; + %endif $('#outerContainer').myHTMLViewer(options); }); diff --git a/lms/urls.py b/lms/urls.py index b85bc3d458..3377fa54c0 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -287,7 +287,11 @@ if settings.COURSEWARE_ENABLED: url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/htmlbook/(?P[^/]*)/$', 'staticbook.views.html_index', name="html_book"), - url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/htmlbook/(?P[^/]*)/(?P[^/]*)$', + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/htmlbook/(?P[^/]*)/chapter/(?P[^/]*)/$', + 'staticbook.views.html_index'), + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/htmlbook/(?P[^/]*)/chapter/(?P[^/]*)/(?P[^/]*)/$', + 'staticbook.views.html_index'), + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/htmlbook/(?P[^/]*)/(?P[^/]*)/$', 'staticbook.views.html_index'), url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/courseware/?$', From 18ee1018e63db73a8d19c3e9b86bd2515bbbd3d6 Mon Sep 17 00:00:00 2001 From: Chris Dodge Date: Sun, 10 Mar 2013 11:11:17 -0400 Subject: [PATCH 25/60] optimize forum page rendering as we don't pre-compute the link urls to inline discussions. We can use jump_to urls and then figure out the link path if/when end-user clicks on it. This saves a lot of unnecessary round trips to the DB as path computation is expensive, especially when it being done for every discussion module in a course in a loop. --- lms/djangoapps/django_comment_client/utils.py | 28 ++----------------- lms/envs/dev.py | 3 +- 2 files changed, 4 insertions(+), 27 deletions(-) diff --git a/lms/djangoapps/django_comment_client/utils.py b/lms/djangoapps/django_comment_client/utils.py index dde219294c..7cc36c491b 100644 --- a/lms/djangoapps/django_comment_client/utils.py +++ b/lms/djangoapps/django_comment_client/utils.py @@ -18,7 +18,6 @@ import pystache_custom as pystache from xmodule.modulestore import Location from xmodule.modulestore.django import modulestore -from xmodule.modulestore.search import path_to_location log = logging.getLogger(__name__) @@ -166,7 +165,6 @@ def initialize_discussion_info(course): # get all discussion models within this course_id all_modules = modulestore().get_items(['i4x', course.location.org, course.location.course, 'discussion', None], course_id=course_id) - path_to_locations = {} for module in all_modules: skip_module = False for key in ('id', 'discussion_category', 'for'): @@ -174,14 +172,6 @@ def initialize_discussion_info(course): log.warning("Required key '%s' not in discussion %s, leaving out of category map" % (key, module.location)) skip_module = True - # cdodge: pre-compute the path_to_location. Note this can throw an exception for any - # dangling discussion modules - try: - path_to_locations[module.location] = path_to_location(modulestore(), course.id, module.location) - except NoPathToItem: - log.warning("Could not compute path_to_location for {0}. Perhaps this is an orphaned discussion module?!? Skipping...".format(module.location)) - skip_module = True - if skip_module: continue @@ -246,7 +236,6 @@ def initialize_discussion_info(course): _DISCUSSIONINFO[course.id]['id_map'] = discussion_id_map _DISCUSSIONINFO[course.id]['category_map'] = category_map _DISCUSSIONINFO[course.id]['timestamp'] = datetime.now() - _DISCUSSIONINFO[course.id]['path_to_location'] = path_to_locations class JsonResponse(HttpResponse): @@ -403,21 +392,8 @@ def get_courseware_context(content, course): location = id_map[id]["location"].url() title = id_map[id]["title"] - # cdodge: did we pre-compute, if so, then let's use that rather than recomputing - if 'path_to_location' in _DISCUSSIONINFO[course.id] and location in _DISCUSSIONINFO[course.id]['path_to_location']: - (course_id, chapter, section, position) = _DISCUSSIONINFO[course.id]['path_to_location'][location] - else: - try: - (course_id, chapter, section, position) = path_to_location(modulestore(), course.id, location) - except NoPathToItem: - # Object is not in the graph any longer, let's just get path to the base of the course - # so that we can at least return something to the caller - (course_id, chapter, section, position) = path_to_location(modulestore(), course.id, course.location) - - url = reverse('courseware_position', kwargs={"course_id":course_id, - "chapter":chapter, - "section":section, - "position":position}) + url = reverse('jump_to', kwargs={"course_id":course.location.course_id, + "location": location}) content_info = {"courseware_url": url, "courseware_title": title} return content_info diff --git a/lms/envs/dev.py b/lms/envs/dev.py index 6ecbbb0f85..84cd80859c 100644 --- a/lms/envs/dev.py +++ b/lms/envs/dev.py @@ -104,7 +104,8 @@ SUBDOMAIN_BRANDING = { # have an actual course with that org set VIRTUAL_UNIVERSITIES = [] -COMMENTS_SERVICE_KEY = "PUT_YOUR_API_KEY_HERE" +COMMENTS_SERVICE_KEY = "***REMOVED***" +COMMENTS_SERVICE_URL = "https://comments-edge-stage.herokuapp.com" ############################## Course static files ########################## if os.path.isdir(DATA_DIR): From cbcda0fc65a11961e87b3d2ff6df741bad4c9472 Mon Sep 17 00:00:00 2001 From: Chris Dodge Date: Sun, 10 Mar 2013 11:14:25 -0400 Subject: [PATCH 26/60] oops didn't mean to commit the test API key --- lms/envs/dev.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lms/envs/dev.py b/lms/envs/dev.py index 84cd80859c..6ecbbb0f85 100644 --- a/lms/envs/dev.py +++ b/lms/envs/dev.py @@ -104,8 +104,7 @@ SUBDOMAIN_BRANDING = { # have an actual course with that org set VIRTUAL_UNIVERSITIES = [] -COMMENTS_SERVICE_KEY = "***REMOVED***" -COMMENTS_SERVICE_URL = "https://comments-edge-stage.herokuapp.com" +COMMENTS_SERVICE_KEY = "PUT_YOUR_API_KEY_HERE" ############################## Course static files ########################## if os.path.isdir(DATA_DIR): From 0c949d20c9b98041d898900f91db3b966f313f13 Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Mon, 11 Mar 2013 10:09:56 -0400 Subject: [PATCH 27/60] Add the ability to hide correctness markers with a custom message for when they submit something. --- common/lib/capa/capa/inputtypes.py | 6 ++++++ common/lib/capa/capa/templates/choicegroup.html | 7 +++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/common/lib/capa/capa/inputtypes.py b/common/lib/capa/capa/inputtypes.py index f614743e67..9781f10ae6 100644 --- a/common/lib/capa/capa/inputtypes.py +++ b/common/lib/capa/capa/inputtypes.py @@ -366,6 +366,12 @@ class ChoiceGroup(InputTypeBase): self.choices = self.extract_choices(self.xml) + @classmethod + def get_attributes(cls): + return [Attribute("show_correctness", "always"), + Attribute("submitted_message", "Answer received.")] + + def _extra_context(self): return {'input_type': self.html_input_type, 'choices': self.choices, diff --git a/common/lib/capa/capa/templates/choicegroup.html b/common/lib/capa/capa/templates/choicegroup.html index e4a3f1dc39..e1ff40b6a1 100644 --- a/common/lib/capa/capa/templates/choicegroup.html +++ b/common/lib/capa/capa/templates/choicegroup.html @@ -1,7 +1,7 @@
% if input_type == 'checkbox' or not value: - % if status == 'unsubmitted': + % if status == 'unsubmitted' or show_correctness == 'never': % elif status == 'correct': @@ -26,7 +26,7 @@ else: correctness = None %> - % if correctness: + % if correctness and not show_correctness=='never': class="choicegroup_${correctness}" % endif % endif @@ -41,4 +41,7 @@ + % if show_correctness == "never" and (value or status not in ['unsubmitted']): +
${submitted_message}
+ %endif From a8ff7911f6ab11900c7a98491c717a2080497aa5 Mon Sep 17 00:00:00 2001 From: David Ormsbee Date: Mon, 11 Mar 2013 10:21:03 -0400 Subject: [PATCH 28/60] Update of Delft logo (lighthouse ticket #234) --- .../images/university/delft/delft-cover.jpg | Bin 174338 -> 197366 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lms/static/images/university/delft/delft-cover.jpg b/lms/static/images/university/delft/delft-cover.jpg index 73092d7596c7cd145aaeff300233582471659a9d..e69c836908809035fb829672efaf530b684cc26a 100644 GIT binary patch literal 197366 zcmeFYcT|(j);FBcTM&?D5DCRdZ-yd>h8_Zekc47Dq?-f+NL3IGAV`&tG?9`*l!!nA zibk;jg5`z;P`W4wW(_!y;j>J-f_r_BFHj%<%ig@0S1> zq?3yi04M+egl_);elG)L9TGw!P62=bApihiwEbufWKW2XkFhc`ii$G~3XKj9GYp9) z8=VY_F)}eUHUbqtY9XP zzZZ=|5|D$jq2X2-2dBTQ+pgJY{JmdENlAuD`wgRGj~kgBIB>wo*wo0>)L^@XLENdR z_@I*pQE{4oiujuhhp@PiSYk{(F**wJr_7+>=!AG14UKI&|Jvd&_P@sIZ`%K9u$50(Fg89Y{;!Vx9fW@> zwX#i!Cq&1_p`+u7f5Np*{}V;X!O#$^zxCy>>fd0sjg0?W?Qhjc;-6SrMFvG3x6wFh z5E>R9ln@!OVf1$nqd$@V2g^aD|1R)P`601kLGjVC|DpgJcH+M)IE0Lji3x)w21P*} zh@^;vf60s_{;P(6@cgCWUq$|@BAyr@8TKy<{$bAF{p8>7!GFm+_+R*X#RVM?!-d6? z;4bI<759f;kd9!pXk`_+2eoYbtDH7|NrP-vHzg{ z<#K;>j(>Uew@2e|&$g$O?b*!epVQgjhUxDU&;PTpztH-BCjIY%|D)vJLij&${Rggp z3xR*D@qfJQKXCn92>e@(|KnZ%*Wi-)uY@QpYC8)`+D>^bTohIoUrycSy_1$}1=-$jhpzsH&={?1Ms~ z`}F@=fD+>35|R>95)x87K+>QcJEgbFPDN>H8EI)n6?xh1BCnzhR#H*|EAQE(qOxZX z6siS<{*zz-cMm{TOaLmnAPCd|2*?5jWr4pR0(!UY69xi-+jjoF2mpYBLc$`VVnBf4 zHsN0=+nM8^6d8a3P*4ykA}Ay#AR;CtAi4b*ASJh4<8%b@AKkdudpF|l`{Aar4MjspE{aGpt1k~0e~=2R6syXNCYS( zxNVZGfVzpToSg6=k|Y$ZM4URXl1}06xy3`zb61v zg23%Q3CaQv1Ewa}V~iWLqy5U8^aWnstGXi4c+^BlE8Z}DU7kwK@SMa#%O!AKJoMG+uNhKN{brQ&}ktQ zrBRk)hOj1$b9wx|#pIhbr^l!WtQ%U4!DXs!Vm>G4!ewmONxX(B9Z`;qoV%682~Sam zoOD@rn4U(0nRbwuP?;Uly@eKf)LWp|1}k@g@4O^Q#IjTJ{Ca_;jIpuelxp+qC3Xq4 z8=DFB({=%s1Ff6G7s~z3T)VSiswMy)C^>~k(F|*@#6283?1_>aRvh%ReqR95rB({^ zl|IrU5}M5G4Ol=iMa6GJJ6{m;66%Ac%U$GpZ(PXAMmXaO6E91UM;!(%T7>s|pxf#V zNa`YQeRqP-`g+BD$L^Q({;jvpEdAn6k2 zk-8>Mx+;dvun7=iN0_}6m{umsD}PU@1hLhn2q=X`QzFH#xSp#wlZGf9bpvT6P(dal z+L<63Dok#J8SKS%(#82jxXferiZxzxVn1dnE4GXi5yu+yaY>B|d*uQutH~pKn*nRc z4aL{4XV`FR88~%R8TN|eX8fF2x2f2$z|t6z(#s8TqgPXQuhT`!O~5l0Ev_X=7=|;J z^4!D)@_E2VV`(i`!?}unLll}RC7$k@!SXFp$=e(;m2S6?IIPL5{f8vwv&cXzHEVX9{@oeM9Hqwhc=(nT;JzS z(EJS3JG%DSBl)}SbN6C{FcxK#cQQd7diX7gfmfumP=v4?Yry~kQxFs~XjTrOLeDM1 zfq^=yR=n#g%MGXG4Vc+7JschI7X`5hfBych(G%HJmX)eUD(=PBgx9-3KYadVJI7sW zT*812lhTi8R;7^kNARnFqSqU=s^fxC$)Rn9NXusz>!AhlJc^W=;UteEDM+%{^5z_R z*{-)Iy+Mkw>wTIF)PHiScxcpaVi;C)1sdTsYNy`rI&qF87O{kQF)EhA<4R|A)~y4+ z(4j>mJPnG%!U90}a2W;&M3(m&TMd~yM&NRzSw7GlacW;xpepI)(_WUB0*4twCV_QK zW9~__pV^L(bj>4pcPmO9U3TZ|9%4tHtB&bZh_wX?N?fYgY|vveZdBwxL|0#GY98bl zlQm%qdPWr^!X#=%wrv+){k6OI1W%*(oM5uErz0DCjw=QUqji4gUzx}qF&7t)#~ZS9 zc^n;OyPJ1oL#yI;?gBlOj6H~okNTBQ)=L$WRHIx|eMj6^k$C5uU&0T7nR$pST8+iL zmcndh{a|+Cq(ftMWIE~Gg%##kj8NJN)e3BXl;}Hqzv%vZAndv7B|;goHDHi@D4r@r z#L%G>HJYYfcMY~CV0r|=T$|+;@$ENxL&UKWu~Y+^nch$-3$mMEN@Lz4K3$oE3-U(b znClFY3ABj{z7k&)^qBz@6IorRO-4N!8peVHWdtVB#UbwE-!LOfa4`&xMqUFM6Y>?xHU z*~BV9%bEG`so9S9V#bgJTy`8T=%AyfsxumuurLlkKTWgh*u&KU;9d+D(-r_iH5tyy zp`2Ea+h|em_yv|8pTEFXnW!xNxNAurJXiLtEiSPXNquTI2u`#c8@UulxhLsgf(Fo z*&!ga)@vtady#<#p*u$RYMB>RPSl)Qt~Z!PzHYxJrX_{4gf>ni?iR=h-CA)SSu+!l zLv?4vJr*yQ8+nf&8&TESLYmi4Px$Vv8Obx}IGgD*~FR|@KLlMNT2vYW) zi(K)G$Qbu|hCjf zY}mj9iSX$0<}cWQtn=!t4b!M(IigTzvQPcTWrmqUW^xS4!~q0_A+^(*%c_ea5L6@s zS?<@~fYH9kfx>*fmB6_3_!f?(70#3|CSgi2qUnwF+`mDG)+Cs~0L?^yzL%Kwf;-ET zp9>a1P4H)$MCvvm8C=T+JCKc35O!kyenB!1U{}m5z}2yB2`#oc3u0cys2ZRZ%xK0M51lBvmDkGDeK);J@~4leF_P`}dn@h_Nw%DW z_MInyU+cAKZFy;gq(@`R#x6Nc>#Ba2Z!S6qNyODvt}w9nS{d~%Z*D(6=kPF~Qqaz$ zx&VY00x|vkMxrK$8*WgA9!(5anQh6F?VTu&U)0#SB%|Qg1bPcwUy=Y z8v#yNr60WWn!;~*K_5C?;Ig%r&V0u~Than9Cy3KQ@Qm>5yz?ilFjjmZOHfN>t!-Z@*K;c$&Sfyj${Up$9<$)Z~yQ z@b)sBp9dr@>PyIam6gV|Oin1h|u4E^CYB*b(Xbs#GA$^*V1BFvV_; zumQrg5DTgtUGpibbJVZOIJ*;nIShHII#x7QrSfGS*%Dte#-KvX`RA|>#L;M8?FFf` zv2T)<1%wZs&gh)IZ}nVv40oM%EH*U%f>$x>6(v$_553)XpPjz-qTfSJF(IOz?P?n5dlc)GliTGmkvC17GBvQ&&nbr~segGoj z&8y7yYn_Bk>sw)zxW){+01ef==Z(L&T>pk>?;e<&l) znJjD!{v}`ikU$)yST_r=O(O)l&ahocY6Uj8Qa})?LU56cGqN>>V1>)>k4`mCi@%$2 zcpUkhD>C+xDw8NeskY9I@O}iJ7+HTq^xfiW7llY9dou(oGaa}(Ovx`JY_t!9YfMW< zACQcpTk-Kljlwq0bdJr!dq4usF$fiP&jFCm(c$Khc%Ejx6<#yF6iC!6?1+L&{ z#!U%jN#4jNAAi^(*AKNp)7%v=P?%sovlzoI0||liQXQTv%3H5YA_ZK9dj%2Ji-M5m zC+XGo)-T<7KzQh#u4c)Z^Jfe24bnU$4;Qv(_tXxBL7=jfu~GHYZhk8ap#kVeR4Tz} z+zlloHz0|PYJQBFb`UD@$Cx)i*y)-SCZplX<2r%Zv|IR?1AEmH^wK6hvuMc>txB6) z1g-}-BjGy+L_(|NX}Cr>?7Ko+XGrbns~EBAZPR9K#4mXX@>f4n7th~l=bs!BPvgRm z-R4biCJkLt$$6N*?%3Ns8Z!gSTcTNt?>$Zjv7EarRtS_5JK{BMi)}l^Y_vW4%GYT$ zOXXHtAwEW@m1SvD2H-RbVZUOoQw5p=%3v>f%5eS=kE=d!(`yNXX5-U@KsG(219gG|44EoS^wC@}@>%`fs0Vk9#!9g+4%4dD6Rc{5ktUT)cNiPVtpt#a8QKi#UX`u@&FEkXB(UxvJ> z_8}$2G&)yrR8H~rq=RzeP$HTGaPucOw@$jbUj_#{+uOmXvOo)cWf1<5Sh?_`D^7Qk z_++}QTG!Ju*qY$F)9Xn~%0lwFh?K9MY_0ONMbho3tScVJu8$Z_7A(+&I-OB08%-R% zpT=bNSTH0U0n+SO**YtX7euK*c2E?I;nf6=Z*(f&)7Q`;%^?G9h!cCwtaB%@6CTJI z2HUInBokLL|P1O*V!3|>4)I1-HzWMo2R@OX{*=JFQdL*FZ5w*Kh0vFa}$8ba*s zf(<;nn_wCEN@|(e0aEUIFQ;CsyvDUUzlh+9uBbJ*4;t=D4?z?jVMqhfJ$ z_UvH^2yls}bwG&8F)VOE84K|MnIaAgd3lERsr7PsRyj4>xwS4eonC6zjf*@zs-f_MN#u7{E;Q2t8+12G_rX*VcA;w`{}@`w z#cpUZo*}`&?_~WE*mzyg{n7~KXobAhFqq5+ysCRgGjC!kyay(tXGXTNstCZJ$+Ikw z5;9~g4N?z^QGFFz9+^`w( zmbYOy1MA+|x^vSnVoAu96n4FUd?7Mww!r4@Vtt4#uX=jjfhT3e0(2;2mu68vaKU3# z^FDc&Thxxe+Ndt1xPk%ke%tbveD(c_%=*AtPlxG>Z$q%6Yb@PgX7W`p>LodUjJx}w zCuYt)Z^X{xCW~^k#Jl2DaVkq_m%&FC-$`8ogMLdRqzbd>Fyk(k`77PWwU5y@O8DF$p!88wr^7;o?ZrfJ#>ox9I7$BVdyQ_ zH*{aQ3bV?bHuazsR_3^*WJ~GA=6J@VU_t$zQZKfGE&aAYqzcbJomZyteb-BwCz>3 zk@KsC?H8{e(2XdbSfPbDqDb$J6>=Il-4Uc>M@s>U<|LBZpg|G23_mDB9VYW>{i!SV zKRdC_x-hGW(wLgsbMNd-iY1ZiE`kS?fJ9Vj;f02FEgT@;>e3m7r=Jhj9ai0c4*=4y zUk>`A*@b6{oRRprcChVxmEc06bwO|3;fqJ^?b}uDT|%2rG#=E-c2WCwyuqe1JK(zI z*_i0QoYX82WT!7vJIGg$|It?xS0@mkXZKt)@i{HT%W~lJ z@xCLbnvyY~ACb-p{x?|YmP`I7naVKOHG=&4l}j^$c?sIPGg184$n|NqV93-aKYe@gtsYx~3nx1^Cu0SOJuVQ9k(Wd9j63Ws)rF`A zt_2n@0=}H!$g+e9l^jDV#)z;jUp>pY^J41DcWM zcs+qGZ#T_O7ryTI8a`Yz(w&HX0mk%qB7a?KCNr;UNr>1^<62yq0Vw&p3Hs4%@mE_e zE_sFfsYvkh2j|`9FDwcWs!*AW<}p+`an<|m{gJvM$nWUVpbS zs}ixQ+Va_8hnY$~7OuIS9u8FpDlD`jib+R>0eU z2*7(V9E6{dsts5bwuC9k!+FZdm=7xr@~!auG*q$=RWSF2n>JGj#LLEFGvFfHz0OWn zXiO+&SVH(?Bi98{vYylYC6T{M1+Lnxx7sGdhXspzl@~k(Su!Lcg!U-Om;@iA4%*_& zS5V!R)y0omS#mXCNqz=A=fUuKrDh;68>3yzS-3?k%fn`{5dE4+RSvXl&QVUo;37j- zG6EA%MalK#)4H)~BnN&5O;9D8{5~>;umA?+=XvS@-3Y|&vO%%t&=`ViLUU!!=-zCQ zx&_C0-<{gLMHHxa{i^!g198dQQG^B8YDl~!fa;?FjKGQ>mZ-?8%WRy$nX0_ksc?T_ z_muS>K`ws_kxcRmPj1t`vG2}R#2vM;L@Oa-g|EoB=(M__1f*n1KFw>W?rDO!YUM1;I3-su8kK_8 zvgZ4vXR6oJ?WSE5dV#Qt%5<*TLY@S<=PMSWrB{8FAPElaze6cnBgLG-SupA`GO#br zUp$9^f*#uuPoqeNXY*K(O6i>c;R7|_W?aS(onsR}D2#o&8M5O-wcl@maVtaZYmG=F$qN82kYd?47 zAf$v3BYkLasc9X-Km(7Dv>>=(EP+L{$=r^!qW~P!Vt(hP@3}ro^`dl*-vHe>US)i} z@KGs@-!bA6Bg|Ih zcOLL3F@mJDuRYrgAScat^N8VHI&)YzTq~Y#65*DdKoz&CKFQO({~KT>Ai_CR#(p2! z)ZTPT11@QkV=i93&_+WC=(dYi>!d{Zo_g%8;?iQcbq$ycIzkH?@m=<$K}%a>H{&sL>F z$h7&7UwJd@j=C(DErLtuQq3`BPDjYZk?1gbuKLm+I)@xoyiyJg0)cK2=~hiukD~ZP1}2m z%RrnK)wnqkb z%L;)$aDF7PcD1(*50_^id|DrFaHQt#n%UJ-!pRq}wixZj9~*wwZ~f6tH`#4z z%^k`7fjBI|DyS+fq6<+WMIa~j2 zd*|(2UGNcV`8V*JL zvEQ}iQHgzvy9nbeG4^2P!MTW#3%vgiIlz1)=SJE1vO|LAH zZ*31^+Zfjhw%G7Q+jPEnU@u!?cj>*|={mbLuXq0j(CLu8A`nH(M-{fqzg6Q`ZT_-K zh;&_b#*x|bv5hM&17?`H`Gl(+N?2ge(g_|_LSJ{cKdvuRBmYu%gRM>HRRBfL)ffrT zW0~MfJBtNoV5Pfd@pbjjE(P|*h9RgENW~A=0*p?*g~Ib7PVj&$hg!i;e_q&2zVITG zuu}ZOpFh*_^;fj$A-PBQq1fP7I_JQAj6>bUmRrASKnbkyR%n~3-#(CHv^&CTsKAW- zllVo_Q|M74{wRAdGlQQcr)nepqedcS4@aNiu<2=pRFO-@<-(X@I6or!E>cexxqY@r zw!n3`Z67|=SNqoI(5uoLHw<{qw$DBuF{Qc`U3(UJHM)>?ZgX-(IesZO*-WboGTBU9<(=^)cn+?$t*g%jjHGKa0zU+a|}v(*$?8KX6TOc1#A?=tR-CH<3kL&MYQhScg}mjWbSSR|P%c zM&lkq2m!8)nd-uO0eD~TD~hb^2`X^*u?H_Bv8)TMJOE^HuUPYE@03Xufn!KEJ=oPo zKqVM*zd_2GtPIP_vB%Cd@hTQkJLLR$Q@X~RwC-#H`2F=CnTwEwMy`yUOLr|e9~|Qd z&4q%TRFD+oM$oTZw9u{QG+yJ~ad&W9qX+neZFe@fQowP+33SD*Q9+-L03p(wkmY1d zk1>q#6+`D{LS(ty+v(xWkHG*9Vk7 z#JHid`~f75iJ8XZODvI3DWq~lV(3#y{WMMZ$HKiU@+DCVP7Gw$`Y)O`-~~S*BVnP{ z0cf_uvcQ8zy71Y6Dnt4e(-+m8+n02ADZZ`labuBD;(lLoeWuphiD3340wrV8O@w2D zlq<)$sH!_&pQ(7@?kE^gz3vAxu@ja{7upULeh}=6Y0b^bIgC4HV-1blb_-r(k7zBy zGq$r01V=Ye-9ekUV5~Oh?z4%HS`s0Yxw|#+l6(6kJB2capi6 zP}{0N(e8KMae^Mw;LG*N?K@sAD`cECL)DbU#?l@Ky{lrYQY5Z?N@drmM5`Yd%i5Ix zB0{NK#JGtZoRMd%qQtZ?5tx#56GhhAtY&$M_@>WjfrvyRa_bUXYog@K5D+8khc1m{ zgqcoN1BF!Zu|y^q;A1nA_WU6~!Xsi)N6cwE+6jE(bmpt8qt@|=<1|m z=RVWVyip37L1h8m3zfQb zD()8!kua5Hkpr{!qMh2Yd~J9Rxd)ZCniy^F>vJq|1KQ;xOGzb0)`l)OC zi}V{H_G95n{nX&irnqaf<0|m_3xF&5`}4R9u5SIVJIAPwQuk6W+%YqV7je-isq9f- z-_UF?QTapbQWJcd{o?`hiBn!Z9iwP^_T++(P*--YFy+|QooB&`N+2>D?pK|o$P*h;%6IA@my>xJyRk>208rEOcY2N-!u z>o9gF;woJ=D|6#8*dgsacq61i@MF^>u&wmuG1f2nh&_o0JP9zIahS??Z?zVytCKL;9fpX)KzfZnNR=MIy7JQv>$CJXuP z$l*1<_zk#ohVKxpX}?QFvN%Yphika%CKry7pV8iR~}Mnk^h)>N8woU z7yauFw@;twP`=iFyKgxKrpl2%yZ>UYs2b%-@k2vYclDDp&8K@Dmfg;Ygr}ZT3CbJn?S#99 zL=|#yehK;RR}0@#2L?@0dW}bXSeY!=(Sdg{mTO;6%X?pX0f9`B*GLcMY;M*J9C%#) zVz9>)WE+Bw-FP*u5 ze!LQIZ|`vq_fl~{#_zjx^L^u!3qiZ9eSsepTA%dpQ>lGXVtp{v{#WppxYb0vQ&`Pu z%3x1Xef7snEpN>7t3T4(%t{~LyfxzFUDPMu-dJFfH17@?h=9 zmcd8|r+2oKUN-}aGaq#*1l{k=jX8Ech1=8@Up1q(4t=H ztCJ!bhb-sMJyys_mu61590o7FHh!TW#fs{QXf3Qbxwt&C<(wREuW{rGsUS4F4M%=* zsNRg@O4B>=Fu}8)GL{!jHip^ux*&mVRHrhBJRWadP{T&sz$t|wyf%l+@0Wj7!i0R0 zKHpd1-Qynt=k4|cqFTd*zWKfwlxlrzp>B=%z$EKWDWZ6_YTvKwSx;3e538qTIehXJ z8`?Sy?%JWQ$lBj{%HEi}nel>TF{V2=^^d6dFte;B zmuckf{q8{FAA$Gu+UivCX!;|gVPEglvbKd<2ma6%j&+N1h#H8R#GU#U?x%1rIH;7P z8MGnKPsl{|hs4TcJaWk|c}P9w?_0ixzwg)4@nH93SLshr&ejZ8ozkD;oOUEX*~{deuz3o_OcV3~ClhMi=-sd}z5*a>%DDvRPwX3aN4wEjx#K{q{%tZf=nSv@T_( zK;H|qDKdK6XPl7CY<^Z#^X4SGSNX$Wsf)Tvuf(?t)doxDH9JcN=XX%0mqW1{QPh$?u??`lXhlLdJ%u7E^De1LM$2QhtX22TZ0vcWj>8?= zwZod_d1nm4;!Rrn5wP`vrK5KBx`I1wvR0R#n?3k^up+?c4bL(dMa!>Pi0TsPCU|=} z%H1r!aBCg#{J2U~-l(O-=%V0jY3_!2pY6!xoR7=$mV)47gkyO4VuvnUOr(6Lg!Wi(pxe$`PctnU}Exm?uYHz1WEZYO#og(++^+VIU2@oMJsjf~0g6WHWEvl2I< zCaRaM(i%0GM@;dlVl70^m1T|@^HCO^(aGLygsbY@yK|mqytc|vx|?Y%w!L1i)2Ug# zEE_Y!2`&3g{!{{;HVIExf@Y()w_Vlgss`5D(FlK@wpC1g1I^ZUrWWlf0X(p0eH~_3 zs{AT%&Q7Pd7b0x!xGYM>NjUGbpSA7&4rCpm(I8?3omS*}|4JhumJsdX>bg!B zkY`4%Zl4iI>!k6f*{^CRwsZim`|3tC@#@KeHZr{GlCL}wy|J@5I^5M{wbkB*s=0_p z-NkxW4B>lx_O9NhT`p2yjH+yk&U&}BiRqMlc;(fPeCA#tTvas8$LPk?d!0hp?TdbU z(PufYj|k@gCAwfmDtu$17wfA`;k4^lfD_L-CJRyYsx(8Lo|_-*MI5^V*tOpryJuOu zG^3V$a{>8|k2KkmJkb~8H+k7+nFUY@`f`sT{nCcY(+iBJkgeg5jXs`^-EtuL%~FSY zzzz(lVcrDy-i2|H60B&siny`weks?RrhEJG(FDeI$mq`UibZn>dNE+D2b=X+-Nk&0 zR+*H9`JzWxXLqF}Xw1O4z84o00Hga=Cd`YbbQOzJK;JQLVLO!1#B^QgABCHm!AU|NxG+!X`v;{7AWgMGBqAfyWx^HtbaKu$X}cMXn(8(=pq#ea+e3FCi5T~%ucT%73|M@dYHvBy zq_SC;UVSiZ8W8K!cIu4kD2!rx=3QXL*F=a^3;lYj)9R4p|!vlG zQPvLV8fVG_-Zv#r`5UytAAZ+&%3n_SHj$5Tsy}wtLn2~kfUHPS+gd+yA=l_EIN!u8 zX-!Me!DS|3^Xo{ISk}F}q?ZyxpVbAn&eW4eLU*}z=5{tKKH2PSYQ0ala#;D{c4i4( z>}LP7G5V?n-n2s38gTbn4e4Co4bp@A7v81F9jxG*icBR{srX4ocut9}O!R$W(j|<8 z%N?IkGhRm1oL;~8r1jm^6~WdX`XouPlKA84aj5piC(m9Ir$EF3%FSKSPx6IKj>sV) zU8zm|!G})MqXxGNEVS~9Ipv)bJ(8!bnR&7o#Q7&UPPi76^^WEns$W(ZVcjhusOrhr zs8EM@*|Aa6yKNlrarPT7=LpK#NoIX)l$OS~ExX@=y?7e5zci{Ft-)?-@xO4flZ}Xc z`0LS8N3k}Wmy0CC#Tbh%mJZ1@yzK!R780Q*al|wIW7-7Z5X>O;s`6Ip7hKI~J8u@D zs*{J&DN=d?8*iOk0i}yyu4L#4qT@_0g?+ z+ZO`&IGL*1?=zUfzvBxvAMS;BocI=Zui(Po7owHdY6{HF&noTy(5jaIS|^Ji*YI_Q zUb;g=q(2NEh8YYNjgb9#%_nq@U4^nIH<#FR;Du1w#2*XG9wvKWyuc41!t-TS^m{X+ zE-!FH=EL1@W@&l2J4U=n;G#68awJ2MQHt|7xlhCTA0Hhg-0E+~ke()~?m2CIF9)_D zmFO8-ju1cd(Z6Ntg5Bk7&(eQ%6X*Q=I|KBm4CR%t**KaLx+G688C5E;37OobmpZ{e zU2duS?$f!%m5a$lvX|+&^5>tA6d#KGBVN(7i)nMQ@f`bBh}hA-a|r;PE3BE7tvJ*H zdKk|ozM2mWj&ef?iYO9~HGjlE(_K?MaTL_cBHZ&k+xz8fzL;j2n^W5! z7gr)>7h3suui~#z$Hnlb7Xuo%w$`~WtkhnG!pg5-eQZvSHx;Wivk&-lGAmGAf!IJ)F{P`ldHM_(ey}-qnl4 z9^|WyKQG?8_I65Jox0L3>Bh>~{Xs+T*+jv#{N@C0uD!j!^fP2NFcSOajzV6ZzK3?z z)UBC$|5^M@o}urnpnRryT+F9bha}eSgN1n)Blbdy0ISeKhN=Qw`%Y4?LR5%$G208DT9Q6xAS9=7yIeg ztsl#@OR^|8BWfa&j~gkD7Qp=Ez9>O9?%uy)0ee>w6E zfT7a+B*8dbW5TW^KXz_ZUr4>ppq>~08nSx=mR`};&>)?(U#qnwC=9E5$+=wLIaN^z zlzrGZWLAsPZvF{<%ukhYz_$a}t#*+A5Gr~!Q}=|iFUe0eId5$G&f?(aD*W*S7qFRkek4Zh?uiBbrl9*h zTC#^$M^9e3umW{|KucjNLvEGS0{q0iJ2Jf+meoF90! zi&-djh?;o2y)>}te!I@pW)wAJ_421oFY|*Su@+$eMd=MNe;2MR_L4@ zuI@3&=*Y*9SpHc&}ZjiHBIGtr|9cvO?)s0zNbzzlm_Sf3-Ut^LG*otc8L=m z?Kl1XcX#YlcKQ}?tkYey$?Jdn(emvnDbmgTYSyZDzX4f|KR4#PQO(E@b_&j=sV1%W z!{Yc28SyW^2i+!SZ_jj`W%h1CvI>GqHLy$ERpcgc?#SuR(^Z&(gMM7|>vES2oijy5 zbmp~W-R&MmCGh={p6`6y9mO>B3;)Ye@z3(+9JkDq8Pc$nwit`=R^x5W+MRp()pq zCp;tvB1SofE;c~5+Vwx)e0=T`!ZSc=`i^kK%x?g~e6{)Q+x8Fp{Fl+!T}{biW}NTf z$C3F!Wm$NjRZhUx9R>Noi&GcN$q5DwKL2COWwXW419l<#1%&pvSSm5wYs0YPVAk?- z3K{$K;dP!lSsbtb$!xB zji_7gBgB`(tVj3Mb`;19I37Glg*_<$1?%~kn5n^hqmF^#Fc ztX>5Tzz8lvU&?%Ay%4=$`tr4N|Lx*I&tI3}TS#ZjEO_iP^k*WOzBnVkF7{w&SE1of zFgr?3N(UO-<6j8Qa*2z5?P57yR~)^+%kQMmZsy64ZGCpNNnM{@+L>ETM=x(2+>Oh% z>|2hh7xy0HCSgmHrzj+0|9`;+V{KqY*#pa= z(SQ(yVds?+2$vNN?)(iv`6QTMrH3c^mRFI7(BysX3`FLUVLVc&C3)nH^?M{S z$lWC&)H+3!d>Cm{&6{j>G<-l; z2-EPgxm2zViEjqBHO^uN_ZqMaMim$R-cz)olp77xV@>)xROo#pRq*Rv!?jrN^WJzW=BX#yi1`L?JnZ~djuB~0TVm+8&KwLI} zOT{<99EPe19_kW`RDX2E6_*kddCD?_Yn5tODU{b*;Eo;OWx_#mj>0@n@|*}gw0YOL0Gqq#MNCPUUKwah{%)a%80+^IAZ1L`35?pcf&l5s*O zq05*B;_~z8Y-E}}skkg){T^|^7zoDV&Y@R6G?)k?0_sMXlzl84=CV$Kx)hldtn&vl zqPiYjJ5z3A#RK}`BYb&Qyd^hb1dl$lux*n2wgY_Swb9ivD-6AQj#W3G+wBFpf;c*$NKG(hBbnIkGvL5-7 zY0c7gfBY62fRb4dct28hB>+sZdZ1eKJ8c`3uhE#~-DGnxFhnO85mH zj~co)xh!AT`?b~U_2GI_%hHo{c_Pi+L22Lp+wU}zs$F8WZV+oZKf1gwV5jcPmF%z! zD^Ra93j?Tnag@I1_8r(2Ic6vyQU77VcebQMd=Q2s1|PL%g$Z4F?cRBeN%;*>Kzr`5 z*{?G0{Dhx>V)XWdX9+eLwBvW%3Q3Dc4_MZJqYBP>-qp;dKTb3|_UWENPMf;V3aq~0 zD=Z|cCg+2EN}=ul0fj(%zimaI>Hwc4M3P7s@Du|(C4kz9rGbBd9h5>V0i}xhuj1Xb zMH6uVd2~QO8hfqQ0|ZxmjMv@g0EGtLB=n~#kXew(Ndzc9J+)+@EKRzwWAGYUl8wG@ z&`H1esYB{k1#^!XWd(`;VL$4Mc%egIYX%@|5~{Doy3~;i1p}$MKMG|Qw{tf0;sq5+1cJ+8>NFM+ufTN_?5FvH z{dS=E4x*n=E%g^HN5-Brc@-PDyB{9Priqp_dCPooiQ>R7VO~&S9 z+H+8t zF&4Najk;gPv~$iYWaCQ}wl+GM6m~e!nxaaW9dBoM-5=Z1s2~N1`Bg`p>fSb^Dg3r$ z^k@L?H8-q-DP#jhO|9{$w|^_qwYQt8?jyE<97Ms=J9({p(i#Sxbr;xg*`cTPSj=Vp zsMl@#>M&2G>6O2zeAEFbjgX{gxEuUwwt~)X2Hh>;MY~WBRU3ZF0`8%J7vH4}OEDPa z5vu5YLv^UKK`hJDXchvcEO#Jb{!r4PW)AFasi15SzH?)(fT@IgimB}DLW(bb+x4k~ z137Qm+h9Cs09in}A5TkD5oGgqr*XCtKWMg;q!%bVdYS?Ub}WmH&;!5hrXuWL_jI*O z8YGQ7vHt)qcLDIIK^qHoy#NY%cQ;+#JSbaCaHB@Pr{hH+8x&s5O*upBg+D+Sw~Y~q z4CEOji?9xqaRAaglb{x$1Nn_7YUmGvqz=?`-)jm4kN_V^+xCY~hh-uy7}NaK^L(hE zNLJbwI@4senN)NFfsm?zZEl^lG$PK3MfD_50lLGcwK^$K(;WgEZZxC^06gq_Em6cY zX^-r+f$*b`%Cb4sKB|5+OuKMP5w3&cX}tmfgpeJH(Sfn~(~B+;B>hI;Iy{VaiWpYb zE&#WQpvZ)&Oi|YRt=s^;5(3E$6mcljmD~2~K{(qF<$(R6r-fUdKT{?chiZap3|5zu zDh<^Ez5BqV@WfcB;U>wt6@0#pSr?XS`}9sR+XB{3Z;s>L zo-sH$h(_d=OL(;CjAY%TD;wN=DmdZ^6v`Yq zI-@60D~i1h+iugOGR|DFWF)f2Lb_<%dbfxsszCuk>d)nk2S+#DKZdTmVsamsi3o$z zTN0x8BdzV$s>srp^(O?fwUct25m2iZ=$jIOr9{YZA%Mi%G4Z31iO6Z$tgh;8dq%Z6 zg)_$SA&W0?Ko{vEng^E)G{(+m5jcIz^pZM*RH~*M1o4Q88KTGvs_eUq+2ZaU^s-`+ zvNu7wV2F(v>3)W_v-s?eZT|o_$Ha+{*4&Irouj(3=fup$OH3G$+Mqv42U^Y5w;-E% zJQ#Tc)QabF0@k}*PlZb~Ty8cv^s*XLVR3CYcK!8C=Pph`dAyMU<%_V|wO28-@x~jh zIQVg`!vHri9sRWCD-0TX5ny8+q%C67TEGs$S-gxhu1dnp9TfCl&jzhbET|yId|YKG zB2ovfy2=)ZIOD}CMBSPfT}8)IO=W$&ZCa_rD;Cnwtp^?@MxB(Z0o&646j=WNmmz&i zY)x+GM({N{0?l}ww0E%`hMy|}Vi>GSsNYdKjXP^S`>lZO31U^u$Pt~vB1`=~pHcIy z=&@qRl={rUNVzN4^s*hARaXEg9RR6eoLgvHj;C*0-TG@ff+mL+D4;D8xgg%;Yi}C0 z7GyzD-HGnqsTB#ACOBEpl!{K9h3Yhe9ICXfW`FX}?EGsBIcc^m%?yK)$rXYLNyUkO z%Tdt(02N6d2wpAIAUX8gdPurh_m!%+bLHb?G^)#MXrS0ItqiI885S9{Po)&B6hgf= z{_(Dap2rxrMbpV@P<))H#9fSy8k_X7xb3M^CB`t36$>`&hWd!96k#TLXffVM6cM$4 zjn?b(s;?|Ftp3s_jzEj4L0aA_wsByeI!8U@CM!{lf;AK|LG(+rH#@gT>6 zj_Vui+pe`1B#}jrx&~Q`TriWe#@bZ4I8fv=zC`S*&H{@a2W>tl$;rs;2_>kZ6O6g? zfLT|`8UFx>Rl1Gc3)R!aM>+|R1TiSw#MtwlVkf^YpnL)A&G;F4kV1g z5xJz8`Mlp6^gchxT$G0j%LEppYFE^?%W`sYg&m+Tj_qS2pQq(oCTw)W{M?6ZJ3|6G z>qnT_aY6Z!^xPcxRz*KDr_yJ3kn$@F-l-ZiBR^3T(bNK#7 z>x(Y=2D=E>tZefVJiB!}y9IDr3zv<@!<&rK3E97x(Jg=nvWpwt85p>8K`O~S(gU%Z z#62Z6tJV7V=6t^WWGvyB9lXw2-`<%cU~LO3zD z;Kg)0-%C+ua$A9t7YbNyAd4G!5n5Tvm1wc^(ZuX8>l1KAx{Fsj$foGcc3ay0qV>;u zL#={?%qX?Tp6Y1!MCRmVJt_ zmhyw;D@8c=H)N;0bD`8_{{T*(K5TjNM0i5-qad~3+AU;b=D`F-i89Qjl!*3@ot0IR zIT&tYQF

tFgg^jU4LW$hrk_*T+gMs@%B+D32N(jHLA?MmP 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 z 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

ion>>V@JDK;180|LaB+I_nHCah1@ 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%0A1a+qtl|uo@jAmjir&CFhvE49P|~O2n2Ul??Uwl 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

GNL=axl42B%UhR5YceXmyT(Crs%5H!fzg=7)bM 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 From 421e169e1ee3d7536d78023fcbb15070e2246550 Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Mon, 11 Mar 2013 10:29:18 -0400 Subject: [PATCH 29/60] Update tests with new attributes. --- common/lib/capa/capa/tests/test_inputtypes.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/lib/capa/capa/tests/test_inputtypes.py b/common/lib/capa/capa/tests/test_inputtypes.py index f670a38746..287caad28f 100644 --- a/common/lib/capa/capa/tests/test_inputtypes.py +++ b/common/lib/capa/capa/tests/test_inputtypes.py @@ -102,6 +102,8 @@ class ChoiceGroupTest(unittest.TestCase): 'choices': [('foil1', 'This is foil One.'), ('foil2', 'This is foil Two.'), ('foil3', 'This is foil Three.'), ], + 'show_correctness': 'always', + 'submitted_message': 'Answer received.', 'name_array_suffix': expected_suffix, # what is this for?? } From a1febce86bff258ea3495b7b3ada8209add1de39 Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Mon, 11 Mar 2013 10:33:09 -0400 Subject: [PATCH 30/60] Specify that mitx should use ruby 1.9.3-p374 for consistancy with prod --- .ruby-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ruby-version b/.ruby-version index dd472cffa2..311baaf3e2 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -1.8.7-p371 \ No newline at end of file +1.9.3-p374 From fcb618f04eedd65602914582546c57aed77ad30b Mon Sep 17 00:00:00 2001 From: Brian Wilson Date: Mon, 11 Mar 2013 10:38:32 -0400 Subject: [PATCH 31/60] fix basic alignment issue with html textbook display --- lms/static/sass/course/_textbook.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lms/static/sass/course/_textbook.scss b/lms/static/sass/course/_textbook.scss index af9c2493fd..aba076af5b 100644 --- a/lms/static/sass/course/_textbook.scss +++ b/lms/static/sass/course/_textbook.scss @@ -158,6 +158,10 @@ div.book-wrapper { img { max-width: 100%; } + + div { + text-align: left; + } } } From d38b37f0b4964aaf56c23b47469aa7f7ddc19f37 Mon Sep 17 00:00:00 2001 From: Chris Dodge Date: Mon, 11 Mar 2013 10:47:22 -0400 Subject: [PATCH 32/60] delete_item should update the parent's list of children to reflect the delete operation. Also added unit test --- .../contentstore/tests/test_contentstore.py | 31 +++++++++++++++++++ cms/djangoapps/contentstore/views.py | 11 +++++++ 2 files changed, 42 insertions(+) diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py index c0ab9ec60e..50bbb305f5 100644 --- a/cms/djangoapps/contentstore/tests/test_contentstore.py +++ b/cms/djangoapps/contentstore/tests/test_contentstore.py @@ -103,6 +103,37 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): self.assertEqual(reverse_tabs, course_tabs) + def test_delete(self): + import_from_xml(modulestore(), 'common/test/data/', ['full']) + + ms = modulestore('direct') + course = ms.get_item(Location(['i4x', 'edX', 'full', 'course', '6.002_Spring_2012', None])) + + sequential = ms.get_item(Location(['i4x', 'edX', 'full', 'sequential','Administrivia_and_Circuit_Elements', None])) + + chapter = ms.get_item(Location(['i4x', 'edX', 'full', 'chapter','Week_1', None])) + + # make sure the parent no longer points to the child object which was deleted + self.assertTrue(sequential.location.url() in chapter.definition['children']) + + resp = self.client.post(reverse('delete_item'), json.dumps({'id': sequential.location.url(), 'delete_children':'true'}), "application/json") + + bFound = False + try: + sequential = ms.get_item(Location(['i4x', 'edX', 'full', 'sequential','Administrivia_and_Circuit_Elements', None])) + bFound = True + except ItemNotFoundError: + pass + + self.assertFalse(bFound) + + chapter = ms.get_item(Location(['i4x', 'edX', 'full', 'chapter','Week_1', None])) + + # make sure the parent no longer points to the child object which was deleted + self.assertFalse(sequential.location.url() in chapter.definition['children']) + + + def test_about_overrides(self): ''' This test case verifies that a course can use specialized override for about data, e.g. /about/Fall_2012/effort.html diff --git a/cms/djangoapps/contentstore/views.py b/cms/djangoapps/contentstore/views.py index 34003d71a4..846c0625b1 100644 --- a/cms/djangoapps/contentstore/views.py +++ b/cms/djangoapps/contentstore/views.py @@ -636,6 +636,17 @@ def delete_item(request): if item.location.revision is None and item.location.category == 'vertical' and delete_all_versions: modulestore('direct').delete_item(item.location) + # cdodge: we need to remove our parent's pointer to us so that it is no longer dangling + + parent_locs = modulestore('direct').get_parent_locations(item_loc, None) + + for parent_loc in parent_locs: + parent = modulestore('direct').get_item(parent_loc) + item_url = item_loc.url() + if item_url in parent.definition["children"]: + parent.definition["children"].remove(item_url) + modulestore('direct').update_children(parent.location, parent.definition["children"]) + return HttpResponse() From 2199ae673b1895ae5a004b6dcc88bca67beecf61 Mon Sep 17 00:00:00 2001 From: Brian Wilson Date: Mon, 11 Mar 2013 11:10:08 -0400 Subject: [PATCH 33/60] add checks that book_index is in range --- lms/djangoapps/staticbook/views.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lms/djangoapps/staticbook/views.py b/lms/djangoapps/staticbook/views.py index 72c72e3154..ec34683997 100644 --- a/lms/djangoapps/staticbook/views.py +++ b/lms/djangoapps/staticbook/views.py @@ -1,7 +1,7 @@ from lxml import etree -# from django.conf import settings from django.contrib.auth.decorators import login_required +from django.http import Http404 from mitxmako.shortcuts import render_to_response from courseware.access import has_access @@ -15,6 +15,8 @@ def index(request, course_id, book_index, page=None): staff_access = has_access(request.user, course, 'staff') book_index = int(book_index) + if book_index < 0 or book_index >= len(course.textbooks): + raise Http404("Invalid book index value: {0}".format(book_index)) textbook = course.textbooks[book_index] table_of_contents = textbook.table_of_contents @@ -40,6 +42,8 @@ def pdf_index(request, course_id, book_index, chapter=None, page=None): staff_access = has_access(request.user, course, 'staff') book_index = int(book_index) + if book_index < 0 or book_index >= len(course.pdf_textbooks): + raise Http404("Invalid book index value: {0}".format(book_index)) textbook = course.pdf_textbooks[book_index] def remap_static_url(original_url, course): @@ -74,6 +78,8 @@ def html_index(request, course_id, book_index, chapter=None, anchor_id=None): staff_access = has_access(request.user, course, 'staff') book_index = int(book_index) + if book_index < 0 or book_index >= len(course.html_textbooks): + raise Http404("Invalid book index value: {0}".format(book_index)) textbook = course.html_textbooks[book_index] def remap_static_url(original_url, course): From 588b27c9dc6911e9b8e0728f274b155cf9674c46 Mon Sep 17 00:00:00 2001 From: Julian Arni Date: Mon, 11 Mar 2013 11:17:12 -0400 Subject: [PATCH 34/60] Added Descriptor method, fixed order issue. --- common/lib/xmodule/xmodule/foldit_module.py | 14 ++++++++++---- lms/djangoapps/foldit/models.py | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/common/lib/xmodule/xmodule/foldit_module.py b/common/lib/xmodule/xmodule/foldit_module.py index 920a5aed6d..2bcdda5bc2 100644 --- a/common/lib/xmodule/xmodule/foldit_module.py +++ b/common/lib/xmodule/xmodule/foldit_module.py @@ -86,7 +86,10 @@ class FolditModule(XModule): """ from foldit.models import Score - return [(e['username'], e['score']) for e in Score.get_tops_n(10)] + leaders = [(e['username'], e['score']) for e in Score.get_tops_n(10)] + leaders.sort(key=lambda x: x[1]) + + return leaders def get_html(self): """ @@ -173,7 +176,10 @@ class FolditDescriptor(XmlDescriptor, EditingDescriptor): @classmethod def definition_from_xml(cls, xml_object, system): - """ - Get the xml_object's attributes. - """ + """ Get the xml_object's attributes. """ + return {'metadata': xml_object.attrib} + + def definition_to_xml(self): + xml_object = etree.Element('foldit') + return xml_object diff --git a/lms/djangoapps/foldit/models.py b/lms/djangoapps/foldit/models.py index 7041be1446..0dce956756 100644 --- a/lms/djangoapps/foldit/models.py +++ b/lms/djangoapps/foldit/models.py @@ -59,7 +59,7 @@ class Score(models.Model): scores = Score.objects \ .filter(puzzle_id__in=puzzles) \ .annotate(total_score=models.Sum('best_score')) \ - .order_by('-total_score')[:n] + .order_by('total_score')[:n] num = len(puzzles) return [{'username': s.user.username, From cd95872b52fa1f6b7b5055f5312573049e37a4f3 Mon Sep 17 00:00:00 2001 From: Brian Wilson Date: Mon, 11 Mar 2013 11:56:48 -0400 Subject: [PATCH 35/60] htmlbook-specific styling to make Heroes text presentable. --- lms/static/sass/course/_textbook.scss | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lms/static/sass/course/_textbook.scss b/lms/static/sass/course/_textbook.scss index aba076af5b..b1f3a863b8 100644 --- a/lms/static/sass/course/_textbook.scss +++ b/lms/static/sass/course/_textbook.scss @@ -161,6 +161,15 @@ div.book-wrapper { div { text-align: left; + line-height: 1.6em; + margin-left: 5px; + margin-right: 5px; + margin-top: 5px; + margin-bottom: 5px; + + .Paragraph, h2 { + margin-top: 10px; + } } } } From 81527d60d8d307f372743638c08285b4fc418c55 Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Mon, 11 Mar 2013 12:27:56 -0400 Subject: [PATCH 36/60] Move pep8 and pylint into test suite, so that we can rachet down the number of violations --- jenkins/quality.sh | 16 ---------------- jenkins/test.sh | 5 ++++- 2 files changed, 4 insertions(+), 17 deletions(-) delete mode 100755 jenkins/quality.sh diff --git a/jenkins/quality.sh b/jenkins/quality.sh deleted file mode 100755 index 56217af874..0000000000 --- a/jenkins/quality.sh +++ /dev/null @@ -1,16 +0,0 @@ -#! /bin/bash - -set -e -set -x - -git remote prune origin - -# Reset the submodule, in case it changed -git submodule foreach 'git reset --hard HEAD' - -# Set the IO encoding to UTF-8 so that askbot will start -export PYTHONIOENCODING=UTF-8 - -rake clobber -rake pep8 || echo "pep8 failed, continuing" -rake pylint || echo "pylint failed, continuing" diff --git a/jenkins/test.sh b/jenkins/test.sh index 5b9a5ed9bd..3a572c9808 100755 --- a/jenkins/test.sh +++ b/jenkins/test.sh @@ -38,12 +38,15 @@ pip install -q -r test-requirements.txt yes w | pip install -q -r requirements.txt rake clobber +rake pep8 +rake pylint + TESTS_FAILED=0 rake test_cms[false] || TESTS_FAILED=1 rake test_lms[false] || TESTS_FAILED=1 rake test_common/lib/capa || TESTS_FAILED=1 rake test_common/lib/xmodule || TESTS_FAILED=1 -# Don't run the lms jasmine tests for now because +# Don't run the lms jasmine tests for now because # they mostly all fail anyhow # rake phantomjs_jasmine_lms || true rake phantomjs_jasmine_cms || TESTS_FAILED=1 From 5f95c6848cd9031df7a8b87ae0262b3c005610a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s=20Rocha?= Date: Mon, 11 Mar 2013 12:53:01 -0400 Subject: [PATCH 37/60] Make numeric response handle plus sign exponential correctly NumericResponse was failing to accept as correct an answer with a plus sign in the exponential. For example: 5.0e+1 was marked as incorrect if the answer was 50. However, 5.0e1 was marked as correct. This caused confusion, since the answer shown to students included the plus sign. LMS Lighthouse [#242] --- common/lib/capa/capa/calc.py | 2 +- .../lib/capa/capa/tests/test_responsetypes.py | 55 +++++++++++-------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/common/lib/capa/capa/calc.py b/common/lib/capa/capa/calc.py index 0f062d17d5..c3fe6b656b 100644 --- a/common/lib/capa/capa/calc.py +++ b/common/lib/capa/capa/calc.py @@ -183,7 +183,7 @@ def evaluator(variables, functions, string, cs=False): # 0.33k or -17 number = (Optional(minus | plus) + inner_number - + Optional(CaselessLiteral("E") + Optional("-") + number_part) + + Optional(CaselessLiteral("E") + Optional((plus | minus)) + number_part) + Optional(number_suffix)) number = number.setParseAction(number_parse_action) # Convert to number diff --git a/common/lib/capa/capa/tests/test_responsetypes.py b/common/lib/capa/capa/tests/test_responsetypes.py index 93a7e9628a..e024909d75 100644 --- a/common/lib/capa/capa/tests/test_responsetypes.py +++ b/common/lib/capa/capa/tests/test_responsetypes.py @@ -19,7 +19,7 @@ from capa.xqueue_interface import dateformat class ResponseTest(unittest.TestCase): """ Base class for tests of capa responses.""" - + xml_factory_class = None def setUp(self): @@ -43,7 +43,7 @@ class ResponseTest(unittest.TestCase): for input_str in incorrect_answers: result = problem.grade_answers({'1_2_1': input_str}).get_correctness('1_2_1') - self.assertEqual(result, 'incorrect', + self.assertEqual(result, 'incorrect', msg="%s should be marked incorrect" % str(input_str)) class MultiChoiceResponseTest(ResponseTest): @@ -61,7 +61,7 @@ class MultiChoiceResponseTest(ResponseTest): def test_named_multiple_choice_grade(self): problem = self.build_problem(choices=[False, True, False], choice_names=["foil_1", "foil_2", "foil_3"]) - + # Ensure that we get the expected grades self.assert_grade(problem, 'choice_foil_1', 'incorrect') self.assert_grade(problem, 'choice_foil_2', 'correct') @@ -117,7 +117,7 @@ class ImageResponseTest(ResponseTest): # Anything inside the rectangle (and along the borders) is correct # Everything else is incorrect - correct_inputs = ["[12,19]", "[10,10]", "[20,20]", + correct_inputs = ["[12,19]", "[10,10]", "[20,20]", "[10,15]", "[20,15]", "[15,10]", "[15,20]"] incorrect_inputs = ["[4,6]", "[25,15]", "[15,40]", "[15,4]"] self.assert_multiple_grade(problem, correct_inputs, incorrect_inputs) @@ -259,7 +259,7 @@ class OptionResponseTest(ResponseTest): xml_factory_class = OptionResponseXMLFactory def test_grade(self): - problem = self.build_problem(options=["first", "second", "third"], + problem = self.build_problem(options=["first", "second", "third"], correct_option="second") # Assert that we get the expected grades @@ -374,8 +374,8 @@ class StringResponseTest(ResponseTest): hints = [("wisconsin", "wisc", "The state capital of Wisconsin is Madison"), ("minnesota", "minn", "The state capital of Minnesota is St. Paul")] - problem = self.build_problem(answer="Michigan", - case_sensitive=False, + problem = self.build_problem(answer="Michigan", + case_sensitive=False, hints=hints) # We should get a hint for Wisconsin @@ -543,7 +543,7 @@ class ChoiceResponseTest(ResponseTest): xml_factory_class = ChoiceResponseXMLFactory def test_radio_group_grade(self): - problem = self.build_problem(choice_type='radio', + problem = self.build_problem(choice_type='radio', choices=[False, True, False]) # Check that we get the expected results @@ -601,17 +601,17 @@ class NumericalResponseTest(ResponseTest): correct_responses = ["4", "4.0", "4.00"] incorrect_responses = ["", "3.9", "4.1", "0"] self.assert_multiple_grade(problem, correct_responses, incorrect_responses) - + def test_grade_decimal_tolerance(self): problem = self.build_problem(question_text="What is 2 + 2 approximately?", explanation="The answer is 4", answer=4, tolerance=0.1) - correct_responses = ["4.0", "4.00", "4.09", "3.91"] + correct_responses = ["4.0", "4.00", "4.09", "3.91"] incorrect_responses = ["", "4.11", "3.89", "0"] self.assert_multiple_grade(problem, correct_responses, incorrect_responses) - + def test_grade_percent_tolerance(self): problem = self.build_problem(question_text="What is 2 + 2 approximately?", explanation="The answer is 4", @@ -642,6 +642,15 @@ class NumericalResponseTest(ResponseTest): incorrect_responses = ["", "2.11", "1.89", "0"] self.assert_multiple_grade(problem, correct_responses, incorrect_responses) + def test_exponential_answer(self): + problem = self.build_problem(question_text="What 5 * 10?", + explanation="The answer is 50", + answer="5e+1") + correct_responses = ["50", "50.0", "5e1", "5e+1", "50e0", "500e-1"] + incorrect_responses = ["", "3.9", "4.1", "0", "5.01e1"] + self.assert_multiple_grade(problem, correct_responses, incorrect_responses) + + class CustomResponseTest(ResponseTest): from response_xml_factory import CustomResponseXMLFactory @@ -667,7 +676,7 @@ class CustomResponseTest(ResponseTest): # The code can also set the global overall_message (str) # to pass a message that applies to the whole response inline_script = textwrap.dedent(""" - messages[0] = "Test Message" + messages[0] = "Test Message" overall_message = "Overall message" """) problem = self.build_problem(answer=inline_script) @@ -687,14 +696,14 @@ class CustomResponseTest(ResponseTest): def test_function_code_single_input(self): # For function code, we pass in these arguments: - # + # # 'expect' is the expect attribute of the # # 'answer_given' is the answer the student gave (if there is just one input) # or an ordered list of answers (if there are multiple inputs) - # # - # The function should return a dict of the form + # + # The function should return a dict of the form # { 'ok': BOOL, 'msg': STRING } # script = textwrap.dedent(""" @@ -727,7 +736,7 @@ class CustomResponseTest(ResponseTest): def test_function_code_multiple_input_no_msg(self): # Check functions also have the option of returning - # a single boolean value + # a single boolean value # If true, mark all the inputs correct # If false, mark all the inputs incorrect script = textwrap.dedent(""" @@ -736,7 +745,7 @@ class CustomResponseTest(ResponseTest): answer_given[1] == expect) """) - problem = self.build_problem(script=script, cfn="check_func", + problem = self.build_problem(script=script, cfn="check_func", expect="42", num_inputs=2) # Correct answer -- expect both inputs marked correct @@ -764,10 +773,10 @@ class CustomResponseTest(ResponseTest): # If the has multiple inputs associated with it, # the check function can return a dict of the form: - # + # # {'overall_message': STRING, # 'input_list': [{'ok': BOOL, 'msg': STRING}, ...] } - # + # # 'overall_message' is displayed at the end of the response # # 'input_list' contains dictionaries representing the correctness @@ -784,7 +793,7 @@ class CustomResponseTest(ResponseTest): {'ok': check3, 'msg': 'Feedback 3'} ] } """) - problem = self.build_problem(script=script, + problem = self.build_problem(script=script, cfn="check_func", num_inputs=3) # Grade the inputs (one input incorrect) @@ -821,11 +830,11 @@ class CustomResponseTest(ResponseTest): check1 = (int(answer_given[0]) == 1) check2 = (int(answer_given[1]) == 2) check3 = (int(answer_given[2]) == 3) - return {'ok': (check1 and check2 and check3), + return {'ok': (check1 and check2 and check3), 'msg': 'Message text'} """) - problem = self.build_problem(script=script, + problem = self.build_problem(script=script, cfn="check_func", num_inputs=3) # Grade the inputs (one input incorrect) @@ -862,7 +871,7 @@ class CustomResponseTest(ResponseTest): # Expect that an exception gets raised when we check the answer with self.assertRaises(Exception): problem.grade_answers({'1_2_1': '42'}) - + def test_invalid_dict_exception(self): # Construct a script that passes back an invalid dict format From 53f85f2a07438fe84cfc6cda77537419a619a7fd Mon Sep 17 00:00:00 2001 From: Brian Wilson Date: Mon, 11 Mar 2013 13:52:43 -0400 Subject: [PATCH 38/60] return empty list if no html or pdf textbook appears in policy.json --- common/lib/xmodule/xmodule/course_module.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/lib/xmodule/xmodule/course_module.py b/common/lib/xmodule/xmodule/course_module.py index 3923d3f056..1c9928a502 100644 --- a/common/lib/xmodule/xmodule/course_module.py +++ b/common/lib/xmodule/xmodule/course_module.py @@ -356,14 +356,14 @@ class CourseDescriptor(SequenceDescriptor): """ Return the pdf_textbooks config, as a python object, or None if not specified. """ - return self.metadata.get('pdf_textbooks') + return self.metadata.get('pdf_textbooks', []) @property def html_textbooks(self): """ Return the html_textbooks config, as a python object, or None if not specified. """ - return self.metadata.get('html_textbooks') + return self.metadata.get('html_textbooks', []) @tabs.setter def tabs(self, value): From 78c8358957d29b59a0972511f9c56db3ebfd0fac Mon Sep 17 00:00:00 2001 From: Chris Dodge Date: Mon, 11 Mar 2013 14:51:44 -0400 Subject: [PATCH 39/60] clean up pyling violations from views.py --- cms/djangoapps/contentstore/views.py | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/cms/djangoapps/contentstore/views.py b/cms/djangoapps/contentstore/views.py index 34003d71a4..a4a3b620c4 100644 --- a/cms/djangoapps/contentstore/views.py +++ b/cms/djangoapps/contentstore/views.py @@ -86,12 +86,14 @@ def signup(request): csrf_token = csrf(request)['csrf_token'] return render_to_response('signup.html', {'csrf': csrf_token}) + def old_login_redirect(request): ''' Redirect to the active login url. ''' return redirect('login', permanent=True) + @ssl_login_shortcut @ensure_csrf_cookie def login_page(request): @@ -104,6 +106,7 @@ def login_page(request): 'forgot_password_link': "//{base}/#forgot-password-modal".format(base=settings.LMS_BASE), }) + def howitworks(request): if request.user.is_authenticated(): return index(request) @@ -112,6 +115,7 @@ def howitworks(request): # ==== Views for any logged-in user ================================== + @login_required @ensure_csrf_cookie def index(request): @@ -145,6 +149,7 @@ def index(request): # ==== Views with per-item permissions================================ + def has_access(user, location, role=STAFF_ROLE_NAME): ''' Return True if user allowed to access this piece of data @@ -393,6 +398,7 @@ def preview_component(request, location): 'editor': wrap_xmodule(component.get_html, component, 'xmodule_edit.html')(), }) + @expect_json @login_required @ensure_csrf_cookie @@ -709,6 +715,7 @@ def create_draft(request): return HttpResponse() + @login_required @expect_json def publish_draft(request): @@ -738,6 +745,7 @@ def unpublish_unit(request): return HttpResponse() + @login_required @expect_json def clone_item(request): @@ -768,8 +776,7 @@ def clone_item(request): return HttpResponse(json.dumps({'id': dest_location.url()})) -#@login_required -#@ensure_csrf_cookie + def upload_asset(request, org, course, coursename): ''' cdodge: this method allows for POST uploading of files into the course asset library, which will @@ -831,6 +838,7 @@ def upload_asset(request, org, course, coursename): response['asset_url'] = StaticContent.get_url_path_from_location(content.location) return response + ''' This view will return all CMS users who are editors for the specified course ''' @@ -863,6 +871,7 @@ def create_json_response(errmsg = None): return resp + ''' This POST-back view will add a user - specified by email - to the list of editors for the specified course @@ -895,6 +904,7 @@ def add_user(request, location): return create_json_response() + ''' This POST-back view will remove a user - specified by email - from the list of editors for the specified course @@ -926,6 +936,7 @@ def remove_user(request, location): def landing(request, org, course, coursename): return render_to_response('temp-course-landing.html', {}) + @login_required @ensure_csrf_cookie def static_pages(request, org, course, coursename): @@ -1029,6 +1040,7 @@ def edit_tabs(request, org, course, coursename): 'components': components }) + def not_found(request): return render_to_response('error.html', {'error': '404'}) @@ -1064,6 +1076,7 @@ def course_info(request, org, course, name, provided_id=None): 'handouts_location': Location(['i4x', org, course, 'course_info', 'handouts']).url() }) + @expect_json @login_required @ensure_csrf_cookie @@ -1161,6 +1174,7 @@ def get_course_settings(request, org, course, name): "section": "details"}) }) + @login_required @ensure_csrf_cookie def course_config_graders_page(request, org, course, name): @@ -1184,6 +1198,7 @@ def course_config_graders_page(request, org, course, name): 'course_details': json.dumps(course_details, cls=CourseSettingsEncoder) }) + @login_required @ensure_csrf_cookie def course_config_advanced_page(request, org, course, name): @@ -1207,6 +1222,7 @@ def course_config_advanced_page(request, org, course, name): 'advanced_dict' : json.dumps(CourseMetadata.fetch(location)), }) + @expect_json @login_required @ensure_csrf_cookie @@ -1238,6 +1254,7 @@ def course_settings_updates(request, org, course, name, section): return HttpResponse(json.dumps(manager.update_from_json(request.POST), cls=CourseSettingsEncoder), mimetype="application/json") + @expect_json @login_required @ensure_csrf_cookie @@ -1272,7 +1289,7 @@ def course_grader_updates(request, org, course, name, grader_index=None): return HttpResponse(json.dumps(CourseGradingModel.update_grader_from_json(Location(['i4x', org, course, 'course', name]), request.POST)), mimetype="application/json") - + ## NB: expect_json failed on ["key", "key2"] and json payload @login_required @ensure_csrf_cookie @@ -1363,6 +1380,7 @@ def asset_index(request, org, course, name): def edge(request): return render_to_response('university_profiles/edge.html', {}) + @login_required @expect_json def create_new_course(request): @@ -1418,6 +1436,7 @@ def create_new_course(request): return HttpResponse(json.dumps({'id': new_course.location.url()})) + def initialize_course_tabs(course): # set up the default tabs # I've added this because when we add static tabs, the LMS either expects a None for the tabs list or @@ -1435,6 +1454,7 @@ def initialize_course_tabs(course): modulestore('direct').update_metadata(course.location.url(), course.own_metadata) + @ensure_csrf_cookie @login_required def import_course(request, org, course, name): @@ -1512,6 +1532,7 @@ def import_course(request, org, course, name): course_module.location.name]) }) + @ensure_csrf_cookie @login_required def generate_export_course(request, org, course, name): @@ -1563,6 +1584,7 @@ def export_course(request, org, course, name): 'successful_import_redirect_url': '' }) + def event(request): ''' A noop to swallow the analytics call so that cms methods don't spook and poor developers looking at From 26f442458168d1b1247046fc0357a4fdf56d3861 Mon Sep 17 00:00:00 2001 From: Chris Dodge Date: Mon, 11 Mar 2013 14:55:37 -0400 Subject: [PATCH 40/60] clean up some pylint violations --- cms/djangoapps/contentstore/tests/test_contentstore.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py index c0ab9ec60e..b62f691818 100644 --- a/cms/djangoapps/contentstore/tests/test_contentstore.py +++ b/cms/djangoapps/contentstore/tests/test_contentstore.py @@ -63,7 +63,6 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): self.client = Client() self.client.login(username=uname, password=password) - def check_edit_unit(self, test_course_name): import_from_xml(modulestore(), 'common/test/data/', [test_course_name]) From 4ec3683c3c0bf159bf64a0b7b8c992e4febb8a47 Mon Sep 17 00:00:00 2001 From: Chris Dodge Date: Mon, 11 Mar 2013 14:57:04 -0400 Subject: [PATCH 41/60] clean up some pylint violations --- .../models/settings/course_metadata.py | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/cms/djangoapps/models/settings/course_metadata.py b/cms/djangoapps/models/settings/course_metadata.py index d088d75665..24245a39d5 100644 --- a/cms/djangoapps/models/settings/course_metadata.py +++ b/cms/djangoapps/models/settings/course_metadata.py @@ -10,7 +10,7 @@ class CourseMetadata(object): ''' # __new_advanced_key__ is used by client not server; so, could argue against it being here FILTERED_LIST = XModuleDescriptor.system_metadata_fields + ['start', 'end', 'enrollment_start', 'enrollment_end', 'tabs', 'graceperiod', '__new_advanced_key__'] - + @classmethod def fetch(cls, course_location): """ @@ -18,17 +18,17 @@ class CourseMetadata(object): """ if not isinstance(course_location, Location): course_location = Location(course_location) - + course = {} - + descriptor = get_modulestore(course_location).get_item(course_location) - + for k, v in descriptor.metadata.iteritems(): if k not in cls.FILTERED_LIST: course[k] = v - + return course - + @classmethod def update_from_json(cls, course_location, jsondict): """ @@ -37,7 +37,7 @@ class CourseMetadata(object): Ensures none of the fields are in the blacklist. """ descriptor = get_modulestore(course_location).get_item(course_location) - + dirty = False for k, v in jsondict.iteritems(): @@ -45,26 +45,26 @@ class CourseMetadata(object): if k not in cls.FILTERED_LIST and (k not in descriptor.metadata or descriptor.metadata[k] != v): dirty = True descriptor.metadata[k] = v - + if dirty: get_modulestore(course_location).update_metadata(course_location, descriptor.metadata) - + # Could just generate and return a course obj w/o doing any db reads, but I put the reads in as a means to confirm # it persisted correctly return cls.fetch(course_location) - + @classmethod def delete_key(cls, course_location, payload): ''' Remove the given metadata key(s) from the course. payload can be a single key or [key..] ''' descriptor = get_modulestore(course_location).get_item(course_location) - + for key in payload['deleteKeys']: if key in descriptor.metadata: del descriptor.metadata[key] - + get_modulestore(course_location).update_metadata(course_location, descriptor.metadata) - + return cls.fetch(course_location) \ No newline at end of file From 6e92666a203ed9ec149a44458c24e6d3d1a6be97 Mon Sep 17 00:00:00 2001 From: Julian Arni Date: Mon, 11 Mar 2013 14:57:19 -0400 Subject: [PATCH 42/60] Fixed score order. Less is more. --- lms/djangoapps/foldit/tests.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lms/djangoapps/foldit/tests.py b/lms/djangoapps/foldit/tests.py index 7127651601..afdd678f06 100644 --- a/lms/djangoapps/foldit/tests.py +++ b/lms/djangoapps/foldit/tests.py @@ -143,11 +143,12 @@ class FolditTestCase(TestCase): def test_SetPlayerPuzzleScores_manyplayers(self): """ Check that when we send scores from multiple users, the correct order - of scores is displayed. + of scores is displayed. Note that, before being processed by + display_score, lower scores are better. """ puzzle_id = ['1'] - player1_score = 0.07 - player2_score = 0.08 + player1_score = 0.08 + player2_score = 0.02 response1 = self.make_puzzle_score_request(puzzle_id, player1_score, self.user) @@ -164,8 +165,12 @@ class FolditTestCase(TestCase): self.assertEqual(len(top_10), 2) # Top score should be player2_score. Second should be player1_score - self.assertEqual(top_10[0]['score'], Score.display_score(player2_score)) - self.assertEqual(top_10[1]['score'], Score.display_score(player1_score)) + self.assertAlmostEqual(top_10[0]['score'], + Score.display_score(player2_score), + delta=0.5) + self.assertAlmostEqual(top_10[1]['score'], + Score.display_score(player1_score), + delta=0.5) # Top score user should be self.user2.username self.assertEqual(top_10[0]['username'], self.user2.username) From 1c98d5fc8d095d3b0ef9594cbacf20225e76ec1c Mon Sep 17 00:00:00 2001 From: Jay Zoldak Date: Mon, 11 Mar 2013 15:16:09 -0400 Subject: [PATCH 43/60] Fix modulestore tests for pep8 violations --- .../xmodule/modulestore/tests/factories.py | 8 +++---- .../modulestore/tests/test_location.py | 22 +++++++++---------- .../modulestore/tests/test_modulestore.py | 4 ++-- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/common/lib/xmodule/xmodule/modulestore/tests/factories.py b/common/lib/xmodule/xmodule/modulestore/tests/factories.py index 1259da2690..f2a291d680 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/factories.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/factories.py @@ -46,10 +46,10 @@ class XModuleCourseFactory(Factory): new_course.metadata['start'] = stringify_time(gmtime()) new_course.tabs = [{"type": "courseware"}, - {"type": "course_info", "name": "Course Info"}, - {"type": "discussion", "name": "Discussion"}, - {"type": "wiki", "name": "Wiki"}, - {"type": "progress", "name": "Progress"}] + {"type": "course_info", "name": "Course Info"}, + {"type": "discussion", "name": "Discussion"}, + {"type": "wiki", "name": "Wiki"}, + {"type": "progress", "name": "Progress"}] # Update the data in the mongo datastore store.update_metadata(new_course.location.url(), new_course.own_metadata) diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_location.py b/common/lib/xmodule/xmodule/modulestore/tests/test_location.py index 0772951884..f0f0e8bf48 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/test_location.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/test_location.py @@ -119,11 +119,11 @@ def test_equality(): # All the cleaning functions should do the same thing with these general_pairs = [('', ''), - (' ', '_'), - ('abc,', 'abc_'), - ('ab fg!@//\\aj', 'ab_fg_aj'), - (u"ab\xA9", "ab_"), # no unicode allowed for now - ] + (' ', '_'), + ('abc,', 'abc_'), + ('ab fg!@//\\aj', 'ab_fg_aj'), + (u"ab\xA9", "ab_"), # no unicode allowed for now + ] def test_clean(): @@ -131,7 +131,7 @@ def test_clean(): ('a:b', 'a_b'), # no colons in non-name components ('a-b', 'a-b'), # dashes ok ('a.b', 'a.b'), # dot ok - ] + ] for input, output in pairs: assert_equals(Location.clean(input), output) @@ -141,17 +141,17 @@ def test_clean_for_url_name(): ('a:b', 'a:b'), # colons ok in names ('a-b', 'a-b'), # dashes ok in names ('a.b', 'a.b'), # dot ok in names - ] + ] for input, output in pairs: assert_equals(Location.clean_for_url_name(input), output) def test_clean_for_html(): pairs = general_pairs + [ - ("a:b", "a_b"), # no colons for html use - ("a-b", "a-b"), # dashes ok (though need to be replaced in various use locations. ugh.) - ('a.b', 'a_b'), # no dots. - ] + ("a:b", "a_b"), # no colons for html use + ("a-b", "a-b"), # dashes ok (though need to be replaced in various use locations. ugh.) + ('a.b', 'a_b'), # no dots. + ] for input, output in pairs: assert_equals(Location.clean_for_html(input), output) diff --git a/common/lib/xmodule/xmodule/modulestore/tests/test_modulestore.py b/common/lib/xmodule/xmodule/modulestore/tests/test_modulestore.py index 94ea622907..469eedac05 100644 --- a/common/lib/xmodule/xmodule/modulestore/tests/test_modulestore.py +++ b/common/lib/xmodule/xmodule/modulestore/tests/test_modulestore.py @@ -12,7 +12,7 @@ def check_path_to_location(modulestore): ("edX/toy/2012_Fall", "Overview", "Welcome", None)), ("i4x://edX/toy/chapter/Overview", ("edX/toy/2012_Fall", "Overview", None, None)), - ) + ) course_id = "edX/toy/2012_Fall" for location, expected in should_work: @@ -20,6 +20,6 @@ def check_path_to_location(modulestore): not_found = ( "i4x://edX/toy/video/WelcomeX", "i4x://edX/toy/course/NotHome" - ) + ) for location in not_found: assert_raises(ItemNotFoundError, path_to_location, modulestore, course_id, location) From cc2c26b9240271eb79e334b4c2768ab7684dc592 Mon Sep 17 00:00:00 2001 From: John Hess Date: Mon, 11 Mar 2013 18:04:21 -0400 Subject: [PATCH 44/60] reverted change to definition to/from xml --- common/lib/xmodule/xmodule/foldit_module.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/common/lib/xmodule/xmodule/foldit_module.py b/common/lib/xmodule/xmodule/foldit_module.py index 2bcdda5bc2..65632fa031 100644 --- a/common/lib/xmodule/xmodule/foldit_module.py +++ b/common/lib/xmodule/xmodule/foldit_module.py @@ -176,10 +176,9 @@ class FolditDescriptor(XmlDescriptor, EditingDescriptor): @classmethod def definition_from_xml(cls, xml_object, system): - """ Get the xml_object's attributes. """ + """ + Get the xml_object's attributes. + """ return {'metadata': xml_object.attrib} - def definition_to_xml(self): - xml_object = etree.Element('foldit') - return xml_object From 00c35c95a4140741da9669c7d01965cba98a7170 Mon Sep 17 00:00:00 2001 From: John Hess Date: Mon, 11 Mar 2013 18:05:10 -0400 Subject: [PATCH 45/60] whitespace back to original --- common/lib/xmodule/xmodule/foldit_module.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/common/lib/xmodule/xmodule/foldit_module.py b/common/lib/xmodule/xmodule/foldit_module.py index 65632fa031..152930876d 100644 --- a/common/lib/xmodule/xmodule/foldit_module.py +++ b/common/lib/xmodule/xmodule/foldit_module.py @@ -176,9 +176,7 @@ class FolditDescriptor(XmlDescriptor, EditingDescriptor): @classmethod def definition_from_xml(cls, xml_object, system): - """ + """ Get the xml_object's attributes. """ - return {'metadata': xml_object.attrib} - From ad92eb4d022da3c7aba6df37929905621b2d4610 Mon Sep 17 00:00:00 2001 From: John Hess Date: Mon, 11 Mar 2013 18:05:34 -0400 Subject: [PATCH 46/60] whitespace back to original. for real though. --- common/lib/xmodule/xmodule/foldit_module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/lib/xmodule/xmodule/foldit_module.py b/common/lib/xmodule/xmodule/foldit_module.py index 152930876d..37255bd5cb 100644 --- a/common/lib/xmodule/xmodule/foldit_module.py +++ b/common/lib/xmodule/xmodule/foldit_module.py @@ -177,6 +177,6 @@ class FolditDescriptor(XmlDescriptor, EditingDescriptor): @classmethod def definition_from_xml(cls, xml_object, system): """ - Get the xml_object's attributes. + Get the xml_object's attributes. """ return {'metadata': xml_object.attrib} From b06615298fa71ce6e70d0b756ba1ab6530e8d82f Mon Sep 17 00:00:00 2001 From: Victor Shnayder Date: Mon, 11 Mar 2013 15:24:14 -0700 Subject: [PATCH 47/60] Add logging to debug strange cohort behavior on prod. Strange behavior: - There are 20 cohorts that users should be randomly assigned into in HeroesX - Almost all, but not all (e.g. ~3300 / 3400) users end up in the same group. - testing manually locally and on prod in a django shell shows nothing wrong --- common/djangoapps/course_groups/cohorts.py | 24 ++++++++----- .../djangoapps/course_groups/tests/tests.py | 35 +++++++++++++++++-- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/common/djangoapps/course_groups/cohorts.py b/common/djangoapps/course_groups/cohorts.py index f0234ec71a..c362ed4e89 100644 --- a/common/djangoapps/course_groups/cohorts.py +++ b/common/djangoapps/course_groups/cohorts.py @@ -65,23 +65,23 @@ def is_commentable_cohorted(course_id, commentable_id): ans)) return ans - + def get_cohorted_commentables(course_id): """ Given a course_id return a list of strings representing cohorted commentables """ course = courses.get_course_by_id(course_id) - + if not course.is_cohorted: # this is the easy case :) ans = [] - else: + else: ans = course.cohorted_discussions return ans - - + + def get_cohort(user, course_id): """ Given a django User and a course_id, return the user's cohort in that @@ -120,7 +120,8 @@ def get_cohort(user, course_id): return None choices = course.auto_cohort_groups - if len(choices) == 0: + n = len(choices) + if n == 0: # Nowhere to put user log.warning("Course %s is auto-cohorted, but there are no" " auto_cohort_groups specified", @@ -128,12 +129,19 @@ def get_cohort(user, course_id): return None # Put user in a random group, creating it if needed - group_name = random.choice(choices) + choice = random.randrange(0, n) + group_name = choices[choice] + + # Victor: we are seeing very strange behavior on prod, where almost all users + # end up in the same group. Log at INFO to try to figure out what's going on. + log.info("DEBUG: adding user {0} to cohort {1}. choice={2}".format( + user, group_name,choice)) + group, created = CourseUserGroup.objects.get_or_create( course_id=course_id, group_type=CourseUserGroup.COHORT, name=group_name) - + user.course_groups.add(group) return group diff --git a/common/djangoapps/course_groups/tests/tests.py b/common/djangoapps/course_groups/tests/tests.py index efed39d536..88d9c1f508 100644 --- a/common/djangoapps/course_groups/tests/tests.py +++ b/common/djangoapps/course_groups/tests/tests.py @@ -6,7 +6,7 @@ from django.test.utils import override_settings from course_groups.models import CourseUserGroup from course_groups.cohorts import (get_cohort, get_course_cohorts, - is_commentable_cohorted) + is_commentable_cohorted, get_cohort_by_name) from xmodule.modulestore.django import modulestore, _MODULESTORES @@ -168,7 +168,7 @@ class TestCohorts(django.test.TestCase): self.assertEquals(get_cohort(user3, course.id), None, "No groups->no auto-cohorting") - + # Now make it different self.config_course_cohorts(course, [], cohorted=True, auto_cohort=True, @@ -180,6 +180,37 @@ class TestCohorts(django.test.TestCase): "user2 should still be in originally placed cohort") + def test_auto_cohorting_randomization(self): + """ + Make sure get_cohort() randomizes properly. + """ + course = modulestore().get_course("edX/toy/2012_Fall") + self.assertEqual(course.id, "edX/toy/2012_Fall") + self.assertFalse(course.is_cohorted) + + groups = ["group_{0}".format(n) for n in range(5)] + self.config_course_cohorts(course, [], cohorted=True, + auto_cohort=True, + auto_cohort_groups=groups) + + # Assign 100 users to cohorts + for i in range(100): + user = User.objects.create(username="test_{0}".format(i), + email="a@b{0}.com".format(i)) + get_cohort(user, course.id) + + # Now make sure that the assignment was at least vaguely random: + # each cohort should have at least 1, and fewer than 50 students. + # (with 5 groups, probability of 0 users in any group is about + # .8**100= 2.0e-10) + for cohort_name in groups: + cohort = get_cohort_by_name(course.id, cohort_name) + num_users = cohort.users.count() + self.assertGreater(num_users, 1) + self.assertLess(num_users, 50) + + + def test_get_course_cohorts(self): course1_id = 'a/b/c' course2_id = 'e/f/g' From bf0e5a270183b90becc56ec7f709deef7bb26fd6 Mon Sep 17 00:00:00 2001 From: Chris Dodge Date: Mon, 11 Mar 2013 21:14:24 -0400 Subject: [PATCH 48/60] do a bunch of pylint improvements --- .../contentstore/tests/test_contentstore.py | 159 +++++++++--------- 1 file changed, 78 insertions(+), 81 deletions(-) diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py index 58197b9762..99ef1169b1 100644 --- a/cms/djangoapps/contentstore/tests/test_contentstore.py +++ b/cms/djangoapps/contentstore/tests/test_contentstore.py @@ -9,10 +9,8 @@ from tempdir import mkdtemp_clean import json from fs.osfs import OSFS import copy -from mock import Mock -from json import dumps, loads +from json import loads -from student.models import Registration from django.contrib.auth.models import User from cms.djangoapps.contentstore.utils import get_modulestore @@ -22,12 +20,11 @@ from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory from xmodule.modulestore import Location from xmodule.modulestore.store_utilities import clone_course from xmodule.modulestore.store_utilities import delete_course -from xmodule.modulestore.django import modulestore, _MODULESTORES +from xmodule.modulestore.django import modulestore from xmodule.contentstore.django import contentstore from xmodule.templates import update_templates from xmodule.modulestore.xml_exporter import export_to_xml from xmodule.modulestore.xml_importer import import_from_xml -from xmodule.templates import update_templates from xmodule.capa_module import CapaDescriptor from xmodule.course_module import CourseDescriptor @@ -81,8 +78,8 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): def test_static_tab_reordering(self): import_from_xml(modulestore(), 'common/test/data/', ['full']) - ms = modulestore('direct') - course = ms.get_item(Location(['i4x', 'edX', 'full', 'course', '6.002_Spring_2012', None])) + module_store = modulestore('direct') + course = module_store.get_item(Location(['i4x', 'edX', 'full', 'course', '6.002_Spring_2012', None])) # reverse the ordering reverse_tabs = [] @@ -90,9 +87,9 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): if tab['type'] == 'static_tab': reverse_tabs.insert(0, 'i4x://edX/full/static_tab/{0}'.format(tab['url_slug'])) - resp = self.client.post(reverse('reorder_static_tabs'), json.dumps({'tabs': reverse_tabs}), "application/json") + self.client.post(reverse('reorder_static_tabs'), json.dumps({'tabs': reverse_tabs}), "application/json") - course = ms.get_item(Location(['i4x', 'edX', 'full', 'course', '6.002_Spring_2012', None])) + course = module_store.get_item(Location(['i4x', 'edX', 'full', 'course', '6.002_Spring_2012', None])) # compare to make sure that the tabs information is in the expected order after the server call course_tabs = [] @@ -105,28 +102,29 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): def test_delete(self): import_from_xml(modulestore(), 'common/test/data/', ['full']) - ms = modulestore('direct') - course = ms.get_item(Location(['i4x', 'edX', 'full', 'course', '6.002_Spring_2012', None])) + module_store = modulestore('direct') - sequential = ms.get_item(Location(['i4x', 'edX', 'full', 'sequential','Administrivia_and_Circuit_Elements', None])) + sequential = module_store.get_item(Location(['i4x', 'edX', 'full', 'sequential', 'Administrivia_and_Circuit_Elements', None])) - chapter = ms.get_item(Location(['i4x', 'edX', 'full', 'chapter','Week_1', None])) + chapter = module_store.get_item(Location(['i4x', 'edX', 'full', 'chapter','Week_1', None])) # make sure the parent no longer points to the child object which was deleted self.assertTrue(sequential.location.url() in chapter.definition['children']) - resp = self.client.post(reverse('delete_item'), json.dumps({'id': sequential.location.url(), 'delete_children':'true'}), "application/json") + self.client.post(reverse('delete_item'), + json.dumps({'id': sequential.location.url(), 'delete_children':'true'}), + "application/json") - bFound = False + found = False try: - sequential = ms.get_item(Location(['i4x', 'edX', 'full', 'sequential','Administrivia_and_Circuit_Elements', None])) - bFound = True + module_store.get_item(Location(['i4x', 'edX', 'full', 'sequential', 'Administrivia_and_Circuit_Elements', None])) + found = True except ItemNotFoundError: pass - self.assertFalse(bFound) + self.assertFalse(found) - chapter = ms.get_item(Location(['i4x', 'edX', 'full', 'chapter','Week_1', None])) + chapter = module_store.get_item(Location(['i4x', 'edX', 'full', 'chapter','Week_1', None])) # make sure the parent no longer points to the child object which was deleted self.assertFalse(sequential.location.url() in chapter.definition['children']) @@ -139,22 +137,22 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): while there is a base definition in /about/effort.html ''' import_from_xml(modulestore(), 'common/test/data/', ['full']) - ms = modulestore('direct') - effort = ms.get_item(Location(['i4x', 'edX', 'full', 'about', 'effort', None])) + module_store = modulestore('direct') + effort = module_store.get_item(Location(['i4x', 'edX', 'full', 'about', 'effort', None])) self.assertEqual(effort.definition['data'], '6 hours') # this one should be in a non-override folder - effort = ms.get_item(Location(['i4x', 'edX', 'full', 'about', 'end_date', None])) + effort = module_store.get_item(Location(['i4x', 'edX', 'full', 'about', 'end_date', None])) self.assertEqual(effort.definition['data'], 'TBD') def test_remove_hide_progress_tab(self): import_from_xml(modulestore(), 'common/test/data/', ['full']) - ms = modulestore('direct') - cs = contentstore() + module_store = modulestore('direct') + content_store = contentstore() source_location = CourseDescriptor.id_to_location('edX/full/6.002_Spring_2012') - course = ms.get_item(source_location) + course = module_store.get_item(source_location) self.assertNotIn('hide_progress_tab', course.metadata) def test_clone_course(self): @@ -173,19 +171,19 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): data = parse_json(resp) self.assertEqual(data['id'], 'i4x://MITx/999/course/Robot_Super_Course') - ms = modulestore('direct') - cs = contentstore() + module_store = modulestore('direct') + content_store = contentstore() source_location = CourseDescriptor.id_to_location('edX/full/6.002_Spring_2012') dest_location = CourseDescriptor.id_to_location('MITx/999/Robot_Super_Course') - clone_course(ms, cs, source_location, dest_location) + clone_course(module_store, content_store, source_location, dest_location) # now loop through all the units in the course and verify that the clone can render them, which # means the objects are at least present - items = ms.get_items(Location(['i4x', 'edX', 'full', 'vertical', None])) + items = module_store.get_items(Location(['i4x', 'edX', 'full', 'vertical', None])) self.assertGreater(len(items), 0) - clone_items = ms.get_items(Location(['i4x', 'MITx', '999', 'vertical', None])) + clone_items = module_store.get_items(Location(['i4x', 'MITx', '999', 'vertical', None])) self.assertGreater(len(clone_items), 0) for descriptor in items: new_loc = descriptor.location._replace(org='MITx', course='999') @@ -196,14 +194,14 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): def test_delete_course(self): import_from_xml(modulestore(), 'common/test/data/', ['full']) - ms = modulestore('direct') - cs = contentstore() + module_store = modulestore('direct') + content_store = contentstore() location = CourseDescriptor.id_to_location('edX/full/6.002_Spring_2012') - delete_course(ms, cs, location, commit=True) + delete_course(module_store, content_store, location, commit=True) - items = ms.get_items(Location(['i4x', 'edX', 'full', 'vertical', None])) + items = module_store.get_items(Location(['i4x', 'edX', 'full', 'vertical', None])) self.assertEqual(len(items), 0) def verify_content_existence(self, modulestore, root_dir, location, dirname, category_name, filename_suffix=''): @@ -218,10 +216,10 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): self.assertTrue(fs.exists(item.location.name + filename_suffix)) def test_export_course(self): - ms = modulestore('direct') - cs = contentstore() + module_store = modulestore('direct') + content_store = contentstore() - import_from_xml(ms, 'common/test/data/', ['full']) + import_from_xml(module_store, 'common/test/data/', ['full']) location = CourseDescriptor.id_to_location('edX/full/6.002_Spring_2012') root_dir = path(mkdtemp_clean()) @@ -229,43 +227,43 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): print 'Exporting to tempdir = {0}'.format(root_dir) # export out to a tempdir - export_to_xml(ms, cs, location, root_dir, 'test_export') + export_to_xml(module_store, content_store, location, root_dir, 'test_export') # check for static tabs - self.verify_content_existence(ms, root_dir, location, 'tabs', 'static_tab', '.html') + self.verify_content_existence(module_store, root_dir, location, 'tabs', 'static_tab', '.html') # check for custom_tags - self.verify_content_existence(ms, root_dir, location, 'info', 'course_info', '.html') + self.verify_content_existence(module_store, root_dir, location, 'info', 'course_info', '.html') # check for custom_tags - self.verify_content_existence(ms, root_dir, location, 'custom_tags', 'custom_tag_template') + self.verify_content_existence(module_store, root_dir, location, 'custom_tags', 'custom_tag_template') # check for graiding_policy.json fs = OSFS(root_dir / 'test_export/policies/6.002_Spring_2012') self.assertTrue(fs.exists('grading_policy.json')) - course = ms.get_item(location) + course = module_store.get_item(location) # compare what's on disk compared to what we have in our course - with fs.open('grading_policy.json','r') as grading_policy: - on_disk = loads(grading_policy.read()) + with fs.open('grading_policy.json', 'r') as grading_policy: + on_disk = loads(grading_policy.read()) self.assertEqual(on_disk, course.definition['data']['grading_policy']) #check for policy.json self.assertTrue(fs.exists('policy.json')) # compare what's on disk to what we have in the course module - with fs.open('policy.json','r') as course_policy: + with fs.open('policy.json', 'r') as course_policy: on_disk = loads(course_policy.read()) self.assertIn('course/6.002_Spring_2012', on_disk) self.assertEqual(on_disk['course/6.002_Spring_2012'], course.metadata) # remove old course - delete_course(ms, cs, location) + delete_course(module_store, content_store, location) # reimport - import_from_xml(ms, root_dir, ['test_export']) + import_from_xml(module_store, root_dir, ['test_export']) - items = ms.get_items(Location(['i4x', 'edX', 'full', 'vertical', None])) + items = module_store.get_items(Location(['i4x', 'edX', 'full', 'vertical', None])) self.assertGreater(len(items), 0) for descriptor in items: print "Checking {0}....".format(descriptor.location.url()) @@ -275,11 +273,11 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): shutil.rmtree(root_dir) def test_course_handouts_rewrites(self): - ms = modulestore('direct') - cs = contentstore() + module_store = modulestore('direct') + content_store = contentstore() # import a test course - import_from_xml(ms, 'common/test/data/', ['full']) + import_from_xml(module_store, 'common/test/data/', ['full']) handout_location = Location(['i4x', 'edX', 'full', 'course_info', 'handouts']) @@ -294,32 +292,32 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): self.assertContains(resp, '/c4x/edX/full/asset/handouts_schematic_tutorial.pdf') def test_export_course_with_unknown_metadata(self): - ms = modulestore('direct') - cs = contentstore() + module_store = modulestore('direct') + content_store = contentstore() - import_from_xml(ms, 'common/test/data/', ['full']) + import_from_xml(module_store, 'common/test/data/', ['full']) location = CourseDescriptor.id_to_location('edX/full/6.002_Spring_2012') root_dir = path(mkdtemp_clean()) - course = ms.get_item(location) + course = module_store.get_item(location) # add a bool piece of unknown metadata so we can verify we don't throw an exception course.metadata['new_metadata'] = True - ms.update_metadata(location, course.metadata) + module_store.update_metadata(location, course.metadata) print 'Exporting to tempdir = {0}'.format(root_dir) # export out to a tempdir - bExported = False + exported = False try: - export_to_xml(ms, cs, location, root_dir, 'test_export') - bExported = True + export_to_xml(module_store, content_store, location, root_dir, 'test_export') + exported = True except Exception: pass - self.assertTrue(bExported) + self.assertTrue(exported) class ContentStoreTest(ModuleStoreTestCase): """ @@ -458,7 +456,7 @@ class ContentStoreTest(ModuleStoreTestCase): def test_capa_module(self): """Test that a problem treats markdown specially.""" - course = CourseFactory.create(org='MITx', course='999', display_name='Robot Super Course') + CourseFactory.create(org='MITx', course='999', display_name='Robot Super Course') problem_data = { 'parent_location': 'i4x://MITx/999/course/Robot_Super_Course', @@ -480,10 +478,10 @@ class ContentStoreTest(ModuleStoreTestCase): def test_import_metadata_with_attempts_empty_string(self): import_from_xml(modulestore(), 'common/test/data/', ['simple']) - ms = modulestore('direct') + module_store = modulestore('direct') did_load_item = False try: - ms.get_item(Location(['i4x', 'edX', 'simple', 'problem', 'ps01-simple', None])) + module_store.get_item(Location(['i4x', 'edX', 'simple', 'problem', 'ps01-simple', None])) did_load_item = True except ItemNotFoundError: pass @@ -494,10 +492,10 @@ class ContentStoreTest(ModuleStoreTestCase): def test_metadata_inheritance(self): import_from_xml(modulestore(), 'common/test/data/', ['full']) - ms = modulestore('direct') - course = ms.get_item(Location(['i4x', 'edX', 'full', 'course', '6.002_Spring_2012', None])) + module_store = modulestore('direct') + course = module_store.get_item(Location(['i4x', 'edX', 'full', 'course', '6.002_Spring_2012', None])) - verticals = ms.get_items(['i4x', 'edX', 'full', 'vertical', None, None]) + verticals = module_store.get_items(['i4x', 'edX', 'full', 'vertical', None, None]) # let's assert on the metadata_inheritance on an existing vertical for vertical in verticals: @@ -508,15 +506,15 @@ class ContentStoreTest(ModuleStoreTestCase): new_component_location = Location('i4x', 'edX', 'full', 'html', 'new_component') source_template_location = Location('i4x', 'edx', 'templates', 'html', 'Blank_HTML_Page') - + # crate a new module and add it as a child to a vertical - ms.clone_item(source_template_location, new_component_location) + module_store.clone_item(source_template_location, new_component_location) parent = verticals[0] - ms.update_children(parent.location, parent.definition.get('children', []) + [new_component_location.url()]) + module_store.update_children(parent.location, parent.definition.get('children', []) + [new_component_location.url()]) # flush the cache - ms.get_cached_metadata_inheritance_tree(new_component_location, -1) - new_module = ms.get_item(new_component_location) + module_store.get_cached_metadata_inheritance_tree(new_component_location, -1) + new_module = module_store.get_item(new_component_location) # check for grace period definition which should be defined at the course level self.assertIn('graceperiod', new_module.metadata) @@ -529,11 +527,11 @@ class ContentStoreTest(ModuleStoreTestCase): # now let's define an override at the leaf node level # new_module.metadata['graceperiod'] = '1 day' - ms.update_metadata(new_module.location, new_module.metadata) + module_store.update_metadata(new_module.location, new_module.metadata) # flush the cache and refetch - ms.get_cached_metadata_inheritance_tree(new_component_location, -1) - new_module = ms.get_item(new_component_location) + module_store.get_cached_metadata_inheritance_tree(new_component_location, -1) + new_module = module_store.get_item(new_component_location) self.assertIn('graceperiod', new_module.metadata) self.assertEqual('1 day', new_module.metadata['graceperiod']) @@ -542,15 +540,15 @@ class ContentStoreTest(ModuleStoreTestCase): class TemplateTestCase(ModuleStoreTestCase): def test_template_cleanup(self): - ms = modulestore('direct') + module_store = modulestore('direct') # insert a bogus template in the store bogus_template_location = Location('i4x', 'edx', 'templates', 'html', 'bogus') source_template_location = Location('i4x', 'edx', 'templates', 'html', 'Blank_HTML_Page') - - ms.clone_item(source_template_location, bogus_template_location) - verify_create = ms.get_item(bogus_template_location) + module_store.clone_item(source_template_location, bogus_template_location) + + verify_create = module_store.get_item(bogus_template_location) self.assertIsNotNone(verify_create) # now run cleanup @@ -559,10 +557,9 @@ class TemplateTestCase(ModuleStoreTestCase): # now try to find dangling template, it should not be in DB any longer asserted = False try: - verify_create = ms.get_item(bogus_template_location) + verify_create = module_store.get_item(bogus_template_location) except ItemNotFoundError: asserted = True - self.assertTrue(asserted) - + self.assertTrue(asserted) From 1058b552f2e305748f2702c1fed33026a0d24d71 Mon Sep 17 00:00:00 2001 From: Julian Arni Date: Tue, 12 Mar 2013 11:30:14 -0400 Subject: [PATCH 49/60] Table order fix (again) --- common/lib/xmodule/xmodule/foldit_module.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/lib/xmodule/xmodule/foldit_module.py b/common/lib/xmodule/xmodule/foldit_module.py index 37255bd5cb..88e29b4203 100644 --- a/common/lib/xmodule/xmodule/foldit_module.py +++ b/common/lib/xmodule/xmodule/foldit_module.py @@ -87,7 +87,7 @@ class FolditModule(XModule): from foldit.models import Score leaders = [(e['username'], e['score']) for e in Score.get_tops_n(10)] - leaders.sort(key=lambda x: x[1]) + leaders.sort(key=lambda x: -x[1]) return leaders From 554cb752fa0981aa527d23a1c565b2308692d37f Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Tue, 12 Mar 2013 12:20:11 -0400 Subject: [PATCH 50/60] Pep8 cleanup --- .../xmodule/combined_open_ended_module.py | 12 +- .../combined_open_ended_modulev1.py | 161 ++++++++------- .../combined_open_ended_rubric.py | 145 ++++++++------ .../controller_query_service.py | 14 +- .../grading_service_module.py | 13 +- .../open_ended_image_submission.py | 10 +- .../open_ended_module.py | 61 +++--- .../openendedchild.py | 43 ++-- .../peer_grading_service.py | 9 +- .../self_assessment_module.py | 10 +- .../xmodule/xmodule/peer_grading_module.py | 64 +++--- .../xmodule/tests/test_combined_open_ended.py | 183 +++++++++--------- .../xmodule/tests/test_self_assessment.py | 46 ++--- .../xmodule/tests/test_util_open_ended.py | 18 +- .../open_ended_notifications.py | 24 ++- .../open_ended_grading/staff_grading.py | 1 + .../staff_grading_service.py | 65 ++++--- lms/djangoapps/open_ended_grading/tests.py | 49 +++-- lms/djangoapps/open_ended_grading/views.py | 61 +++--- 19 files changed, 539 insertions(+), 450 deletions(-) diff --git a/common/lib/xmodule/xmodule/combined_open_ended_module.py b/common/lib/xmodule/xmodule/combined_open_ended_module.py index 659590b5b4..0cc69a4a24 100644 --- a/common/lib/xmodule/xmodule/combined_open_ended_module.py +++ b/common/lib/xmodule/xmodule/combined_open_ended_module.py @@ -10,7 +10,6 @@ from xmodule.open_ended_grading_classes.combined_open_ended_modulev1 import Comb log = logging.getLogger("mitx.courseware") - VERSION_TUPLES = ( ('1', CombinedOpenEndedV1Descriptor, CombinedOpenEndedV1Module), ) @@ -18,6 +17,7 @@ VERSION_TUPLES = ( DEFAULT_VERSION = 1 DEFAULT_VERSION = str(DEFAULT_VERSION) + class CombinedOpenEndedModule(XModule): """ This is a module that encapsulates all open ended grading (self assessment, peer assessment, etc). @@ -60,7 +60,7 @@ class CombinedOpenEndedModule(XModule): def __init__(self, system, location, definition, descriptor, instance_state=None, shared_state=None, **kwargs): XModule.__init__(self, system, location, definition, descriptor, - instance_state, shared_state, **kwargs) + instance_state, shared_state, **kwargs) """ Definition file should have one or many task blocks, a rubric block, and a prompt block: @@ -129,13 +129,15 @@ class CombinedOpenEndedModule(XModule): version_index = versions.index(self.version) static_data = { - 'rewrite_content_links' : self.rewrite_content_links, + 'rewrite_content_links': self.rewrite_content_links, } self.child_descriptor = descriptors[version_index](self.system) - self.child_definition = descriptors[version_index].definition_from_xml(etree.fromstring(definition['data']), self.system) + self.child_definition = descriptors[version_index].definition_from_xml(etree.fromstring(definition['data']), + self.system) self.child_module = modules[version_index](self.system, location, self.child_definition, self.child_descriptor, - instance_state = json.dumps(instance_state), metadata = self.metadata, static_data= static_data) + instance_state=json.dumps(instance_state), metadata=self.metadata, + static_data=static_data) def get_html(self): return self.child_module.get_html() diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py index 5c3bfa5b2a..20cedaab75 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py @@ -40,14 +40,15 @@ ACCEPT_FILE_UPLOAD = False TRUE_DICT = ["True", True, "TRUE", "true"] HUMAN_TASK_TYPE = { - 'selfassessment' : "Self Assessment", - 'openended' : "edX Assessment", - } + 'selfassessment': "Self Assessment", + 'openended': "edX Assessment", +} #Default value that controls whether or not to skip basic spelling checks in the controller #Metadata overrides this SKIP_BASIC_CHECKS = False + class CombinedOpenEndedV1Module(): """ This is a module that encapsulates all open ended grading (self assessment, peer assessment, etc). @@ -83,7 +84,7 @@ class CombinedOpenEndedV1Module(): TEMPLATE_DIR = "combinedopenended" def __init__(self, system, location, definition, descriptor, - instance_state=None, shared_state=None, metadata = None, static_data = None, **kwargs): + instance_state=None, shared_state=None, metadata=None, static_data=None, **kwargs): """ Definition file should have one or many task blocks, a rubric block, and a prompt block: @@ -122,7 +123,7 @@ class CombinedOpenEndedV1Module(): self.metadata = metadata self.display_name = metadata.get('display_name', "Open Ended") - self.rewrite_content_links = static_data.get('rewrite_content_links',"") + self.rewrite_content_links = static_data.get('rewrite_content_links', "") # Load instance state @@ -152,10 +153,10 @@ class CombinedOpenEndedV1Module(): self.skip_basic_checks = self.metadata.get('skip_spelling_checks', SKIP_BASIC_CHECKS) display_due_date_string = self.metadata.get('due', None) - + grace_period_string = self.metadata.get('graceperiod', None) try: - self.timeinfo = TimeInfo(display_due_date_string, grace_period_string) + self.timeinfo = TimeInfo(display_due_date_string, grace_period_string) except: log.error("Error parsing due date information in location {0}".format(location)) raise @@ -177,10 +178,10 @@ class CombinedOpenEndedV1Module(): 'rubric': definition['rubric'], 'display_name': self.display_name, 'accept_file_upload': self.accept_file_upload, - 'close_date' : self.timeinfo.close_date, - 's3_interface' : self.system.s3_interface, - 'skip_basic_checks' : self.skip_basic_checks, - } + 'close_date': self.timeinfo.close_date, + 's3_interface': self.system.s3_interface, + 'skip_basic_checks': self.skip_basic_checks, + } self.task_xml = definition['task_xml'] self.location = location @@ -223,15 +224,15 @@ class CombinedOpenEndedV1Module(): child_modules = { 'openended': open_ended_module.OpenEndedModule, 'selfassessment': self_assessment_module.SelfAssessmentModule, - } + } child_descriptors = { 'openended': open_ended_module.OpenEndedDescriptor, 'selfassessment': self_assessment_module.SelfAssessmentDescriptor, - } + } children = { 'modules': child_modules, 'descriptors': child_descriptors, - } + } return children def setup_next_task(self, reset=False): @@ -267,7 +268,8 @@ class CombinedOpenEndedV1Module(): self.current_task_parsed_xml = self.current_task_descriptor.definition_from_xml(etree_xml, self.system) if current_task_state is None and self.current_task_number == 0: self.current_task = child_task_module(self.system, self.location, - self.current_task_parsed_xml, self.current_task_descriptor, self.static_data) + self.current_task_parsed_xml, self.current_task_descriptor, + self.static_data) self.task_states.append(self.current_task.get_instance_state()) self.state = self.ASSESSING elif current_task_state is None and self.current_task_number > 0: @@ -280,18 +282,20 @@ class CombinedOpenEndedV1Module(): 'attempts': 0, 'created': True, 'history': [{'answer': last_response}], - }) + }) self.current_task = child_task_module(self.system, self.location, - self.current_task_parsed_xml, self.current_task_descriptor, self.static_data, - instance_state=current_task_state) + self.current_task_parsed_xml, self.current_task_descriptor, + self.static_data, + instance_state=current_task_state) self.task_states.append(self.current_task.get_instance_state()) self.state = self.ASSESSING else: if self.current_task_number > 0 and not reset: current_task_state = self.overwrite_state(current_task_state) self.current_task = child_task_module(self.system, self.location, - self.current_task_parsed_xml, self.current_task_descriptor, self.static_data, - instance_state=current_task_state) + self.current_task_parsed_xml, self.current_task_descriptor, + self.static_data, + instance_state=current_task_state) return True @@ -307,8 +311,8 @@ class CombinedOpenEndedV1Module(): last_response_data = self.get_last_response(self.current_task_number - 1) current_response_data = self.get_current_attributes(self.current_task_number) - if(current_response_data['min_score_to_attempt'] > last_response_data['score'] - or current_response_data['max_score_to_attempt'] < last_response_data['score']): + if (current_response_data['min_score_to_attempt'] > last_response_data['score'] + or current_response_data['max_score_to_attempt'] < last_response_data['score']): self.state = self.DONE self.allow_reset = True @@ -334,8 +338,8 @@ class CombinedOpenEndedV1Module(): 'display_name': self.display_name, 'accept_file_upload': self.accept_file_upload, 'location': self.location, - 'legend_list' : LEGEND_LIST, - } + 'legend_list': LEGEND_LIST, + } return context @@ -404,7 +408,7 @@ class CombinedOpenEndedV1Module(): task_parsed_xml = task_descriptor.definition_from_xml(etree_xml, self.system) task = children['modules'][task_type](self.system, self.location, task_parsed_xml, task_descriptor, - self.static_data, instance_state=task_state) + self.static_data, instance_state=task_state) last_response = task.latest_answer() last_score = task.latest_score() last_post_assessment = task.latest_post_assessment(self.system) @@ -426,10 +430,10 @@ class CombinedOpenEndedV1Module(): rubric_scores = rubric_data['rubric_scores'] grader_types = rubric_data['grader_types'] feedback_items = rubric_data['feedback_items'] - feedback_dicts = rubric_data['feedback_dicts'] + feedback_dicts = rubric_data['feedback_dicts'] grader_ids = rubric_data['grader_ids'] - submission_ids = rubric_data['submission_ids'] - elif task_type== "selfassessment": + submission_ids = rubric_data['submission_ids'] + elif task_type == "selfassessment": rubric_scores = last_post_assessment grader_types = ['SA'] feedback_items = [''] @@ -446,7 +450,7 @@ class CombinedOpenEndedV1Module(): human_state = task.HUMAN_NAMES[state] else: human_state = state - if len(grader_types)>0: + if len(grader_types) > 0: grader_type = grader_types[0] else: grader_type = "IN" @@ -468,15 +472,15 @@ class CombinedOpenEndedV1Module(): 'correct': last_correctness, 'min_score_to_attempt': min_score_to_attempt, 'max_score_to_attempt': max_score_to_attempt, - 'rubric_scores' : rubric_scores, - 'grader_types' : grader_types, - 'feedback_items' : feedback_items, - 'grader_type' : grader_type, - 'human_grader_type' : human_grader_name, - 'feedback_dicts' : feedback_dicts, - 'grader_ids' : grader_ids, - 'submission_ids' : submission_ids, - } + 'rubric_scores': rubric_scores, + 'grader_types': grader_types, + 'feedback_items': feedback_items, + 'grader_type': grader_type, + 'human_grader_type': human_grader_name, + 'feedback_dicts': feedback_dicts, + 'grader_ids': grader_ids, + 'submission_ids': submission_ids, + } return last_response_dict def update_task_states(self): @@ -519,20 +523,27 @@ class CombinedOpenEndedV1Module(): Output: Dictionary to be rendered via ajax that contains the result html. """ all_responses = [] - loop_up_to_task = self.current_task_number+1 - for i in xrange(0,loop_up_to_task): + loop_up_to_task = self.current_task_number + 1 + for i in xrange(0, loop_up_to_task): all_responses.append(self.get_last_response(i)) - rubric_scores = [all_responses[i]['rubric_scores'] for i in xrange(0,len(all_responses)) if len(all_responses[i]['rubric_scores'])>0 and all_responses[i]['grader_types'][0] in HUMAN_GRADER_TYPE.keys()] - grader_types = [all_responses[i]['grader_types'] for i in xrange(0,len(all_responses)) if len(all_responses[i]['grader_types'])>0 and all_responses[i]['grader_types'][0] in HUMAN_GRADER_TYPE.keys()] - feedback_items = [all_responses[i]['feedback_items'] for i in xrange(0,len(all_responses)) if len(all_responses[i]['feedback_items'])>0 and all_responses[i]['grader_types'][0] in HUMAN_GRADER_TYPE.keys()] - rubric_html = self.rubric_renderer.render_combined_rubric(stringify_children(self.static_data['rubric']), rubric_scores, - grader_types, feedback_items) + rubric_scores = [all_responses[i]['rubric_scores'] for i in xrange(0, len(all_responses)) if + len(all_responses[i]['rubric_scores']) > 0 and all_responses[i]['grader_types'][ + 0] in HUMAN_GRADER_TYPE.keys()] + grader_types = [all_responses[i]['grader_types'] for i in xrange(0, len(all_responses)) if + len(all_responses[i]['grader_types']) > 0 and all_responses[i]['grader_types'][ + 0] in HUMAN_GRADER_TYPE.keys()] + feedback_items = [all_responses[i]['feedback_items'] for i in xrange(0, len(all_responses)) if + len(all_responses[i]['feedback_items']) > 0 and all_responses[i]['grader_types'][ + 0] in HUMAN_GRADER_TYPE.keys()] + rubric_html = self.rubric_renderer.render_combined_rubric(stringify_children(self.static_data['rubric']), + rubric_scores, + grader_types, feedback_items) response_dict = all_responses[-1] context = { 'results': rubric_html, - 'task_name' : 'Scored Rubric', - 'class_name' : 'combined-rubric-container' + 'task_name': 'Scored Rubric', + 'class_name': 'combined-rubric-container' } html = self.system.render_template('{0}/combined_open_ended_results.html'.format(self.TEMPLATE_DIR), context) return {'html': html, 'success': True} @@ -544,8 +555,8 @@ class CombinedOpenEndedV1Module(): Output: Dictionary to be rendered via ajax that contains the result html. """ context = { - 'legend_list' : LEGEND_LIST, - } + 'legend_list': LEGEND_LIST, + } html = self.system.render_template('{0}/combined_open_ended_legend.html'.format(self.TEMPLATE_DIR), context) return {'html': html, 'success': True} @@ -556,15 +567,16 @@ class CombinedOpenEndedV1Module(): Output: Dictionary to be rendered via ajax that contains the result html. """ self.update_task_states() - loop_up_to_task = self.current_task_number+1 - all_responses =[] - for i in xrange(0,loop_up_to_task): + loop_up_to_task = self.current_task_number + 1 + all_responses = [] + for i in xrange(0, loop_up_to_task): all_responses.append(self.get_last_response(i)) context_list = [] for ri in all_responses: - for i in xrange(0,len(ri['rubric_scores'])): - feedback = ri['feedback_dicts'][i].get('feedback','') - rubric_data = self.rubric_renderer.render_rubric(stringify_children(self.static_data['rubric']), ri['rubric_scores'][i]) + for i in xrange(0, len(ri['rubric_scores'])): + feedback = ri['feedback_dicts'][i].get('feedback', '') + rubric_data = self.rubric_renderer.render_rubric(stringify_children(self.static_data['rubric']), + ri['rubric_scores'][i]) if rubric_data['success']: rubric_html = rubric_data['html'] else: @@ -572,23 +584,23 @@ class CombinedOpenEndedV1Module(): context = { 'rubric_html': rubric_html, 'grader_type': ri['grader_type'], - 'feedback' : feedback, - 'grader_id' : ri['grader_ids'][i], - 'submission_id' : ri['submission_ids'][i], + 'feedback': feedback, + 'grader_id': ri['grader_ids'][i], + 'submission_id': ri['submission_ids'][i], } context_list.append(context) feedback_table = self.system.render_template('{0}/open_ended_result_table.html'.format(self.TEMPLATE_DIR), { - 'context_list' : context_list, - 'grader_type_image_dict' : GRADER_TYPE_IMAGE_DICT, - 'human_grader_types' : HUMAN_GRADER_TYPE, + 'context_list': context_list, + 'grader_type_image_dict': GRADER_TYPE_IMAGE_DICT, + 'human_grader_types': HUMAN_GRADER_TYPE, 'rows': 50, 'cols': 50, }) context = { 'results': feedback_table, - 'task_name' : "Feedback", - 'class_name' : "result-container", - } + 'task_name': "Feedback", + 'class_name': "result-container", + } html = self.system.render_template('{0}/combined_open_ended_results.html'.format(self.TEMPLATE_DIR), context) return {'html': html, 'success': True} @@ -617,8 +629,8 @@ class CombinedOpenEndedV1Module(): 'reset': self.reset, 'get_results': self.get_results, 'get_combined_rubric': self.get_rubric, - 'get_status' : self.get_status_ajax, - 'get_legend' : self.get_legend, + 'get_status': self.get_status_ajax, + 'get_legend': self.get_legend, } if dispatch not in handlers: @@ -681,7 +693,7 @@ class CombinedOpenEndedV1Module(): 'task_states': self.task_states, 'attempts': self.attempts, 'ready_to_reset': self.allow_reset, - } + } return json.dumps(state) @@ -699,11 +711,12 @@ class CombinedOpenEndedV1Module(): context = { 'status_list': status, - 'grader_type_image_dict' : GRADER_TYPE_IMAGE_DICT, - 'legend_list' : LEGEND_LIST, - 'render_via_ajax' : render_via_ajax, + 'grader_type_image_dict': GRADER_TYPE_IMAGE_DICT, + 'legend_list': LEGEND_LIST, + 'render_via_ajax': render_via_ajax, } - status_html = self.system.render_template("{0}/combined_open_ended_status.html".format(self.TEMPLATE_DIR), context) + status_html = self.system.render_template("{0}/combined_open_ended_status.html".format(self.TEMPLATE_DIR), + context) return status_html @@ -736,7 +749,7 @@ class CombinedOpenEndedV1Module(): score_dict = { 'score': score, 'total': max_score, - } + } return score_dict @@ -793,7 +806,9 @@ class CombinedOpenEndedV1Descriptor(XmlDescriptor, EditingDescriptor): for child in expected_children: if len(xml_object.xpath(child)) == 0: #This is a staff_facing_error - raise ValueError("Combined Open Ended definition must include at least one '{0}' tag. Contact the learning sciences group for assistance.".format(child)) + raise ValueError( + "Combined Open Ended definition must include at least one '{0}' tag. Contact the learning sciences group for assistance.".format( + child)) def parse_task(k): """Assumes that xml_object has child k""" diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_rubric.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_rubric.py index 8d1bd376fb..f4ea7648a1 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_rubric.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_rubric.py @@ -4,24 +4,26 @@ from lxml import etree log = logging.getLogger(__name__) GRADER_TYPE_IMAGE_DICT = { - 'SA' : '/static/images/self_assessment_icon.png', - 'PE' : '/static/images/peer_grading_icon.png', - 'ML' : '/static/images/ml_grading_icon.png', - 'IN' : '/static/images/peer_grading_icon.png', - 'BC' : '/static/images/ml_grading_icon.png', - } + 'SA': '/static/images/self_assessment_icon.png', + 'PE': '/static/images/peer_grading_icon.png', + 'ML': '/static/images/ml_grading_icon.png', + 'IN': '/static/images/peer_grading_icon.png', + 'BC': '/static/images/ml_grading_icon.png', +} HUMAN_GRADER_TYPE = { - 'SA' : 'Self-Assessment', - 'PE' : 'Peer-Assessment', - 'IN' : 'Instructor-Assessment', - 'ML' : 'AI-Assessment', - 'BC' : 'AI-Assessment', - } + 'SA': 'Self-Assessment', + 'PE': 'Peer-Assessment', + 'IN': 'Instructor-Assessment', + 'ML': 'AI-Assessment', + 'BC': 'AI-Assessment', +} DO_NOT_DISPLAY = ['BC', 'IN'] -LEGEND_LIST = [{'name' : HUMAN_GRADER_TYPE[k], 'image' : GRADER_TYPE_IMAGE_DICT[k]} for k in GRADER_TYPE_IMAGE_DICT.keys() if k not in DO_NOT_DISPLAY ] +LEGEND_LIST = [{'name': HUMAN_GRADER_TYPE[k], 'image': GRADER_TYPE_IMAGE_DICT[k]} for k in GRADER_TYPE_IMAGE_DICT.keys() + if k not in DO_NOT_DISPLAY] + class RubricParsingError(Exception): def __init__(self, msg): @@ -29,15 +31,14 @@ class RubricParsingError(Exception): class CombinedOpenEndedRubric(object): - TEMPLATE_DIR = "combinedopenended/openended" - def __init__ (self, system, view_only = False): + def __init__(self, system, view_only=False): self.has_score = False self.view_only = view_only self.system = system - def render_rubric(self, rubric_xml, score_list = None): + def render_rubric(self, rubric_xml, score_list=None): ''' render_rubric: takes in an xml string and outputs the corresponding html for that xml, given the type of rubric we're generating @@ -50,11 +51,11 @@ class CombinedOpenEndedRubric(object): success = False try: rubric_categories = self.extract_categories(rubric_xml) - if score_list and len(score_list)==len(rubric_categories): - for i in xrange(0,len(rubric_categories)): + if score_list and len(score_list) == len(rubric_categories): + for i in xrange(0, len(rubric_categories)): category = rubric_categories[i] - for j in xrange(0,len(category['options'])): - if score_list[i]==j: + for j in xrange(0, len(category['options'])): + if score_list[i] == j: rubric_categories[i]['options'][j]['selected'] = True rubric_scores = [cat['score'] for cat in rubric_categories] max_scores = map((lambda cat: cat['options'][-1]['points']), rubric_categories) @@ -63,19 +64,20 @@ class CombinedOpenEndedRubric(object): if self.view_only: rubric_template = '{0}/open_ended_view_only_rubric.html'.format(self.TEMPLATE_DIR) html = self.system.render_template(rubric_template, - {'categories': rubric_categories, - 'has_score': self.has_score, - 'view_only': self.view_only, - 'max_score': max_score, - 'combined_rubric' : False - }) + {'categories': rubric_categories, + 'has_score': self.has_score, + 'view_only': self.view_only, + 'max_score': max_score, + 'combined_rubric': False + }) success = True except: #This is a staff_facing_error - error_message = "[render_rubric] Could not parse the rubric with xml: {0}. Contact the learning sciences group for assistance.".format(rubric_xml) + error_message = "[render_rubric] Could not parse the rubric with xml: {0}. Contact the learning sciences group for assistance.".format( + rubric_xml) log.exception(error_message) raise RubricParsingError(error_message) - return {'success' : success, 'html' : html, 'rubric_scores' : rubric_scores} + return {'success': success, 'html': html, 'rubric_scores': rubric_scores} def check_if_rubric_is_parseable(self, rubric_string, location, max_score_allowed, max_score): rubric_dict = self.render_rubric(rubric_string) @@ -83,7 +85,8 @@ class CombinedOpenEndedRubric(object): rubric_feedback = rubric_dict['html'] if not success: #This is a staff_facing_error - error_message = "Could not parse rubric : {0} for location {1}. Contact the learning sciences group for assistance.".format(rubric_string, location.url()) + error_message = "Could not parse rubric : {0} for location {1}. Contact the learning sciences group for assistance.".format( + rubric_string, location.url()) log.error(error_message) raise RubricParsingError(error_message) @@ -101,7 +104,7 @@ class CombinedOpenEndedRubric(object): if total != max_score: #This is a staff_facing_error error_msg = "The max score {0} for problem {1} does not match the total number of points in the rubric {2}. Contact the learning sciences group for assistance.".format( - max_score, location, total) + max_score, location, total) log.error(error_msg) raise RubricParsingError(error_msg) @@ -123,7 +126,9 @@ class CombinedOpenEndedRubric(object): for category in element: if category.tag != 'category': #This is a staff_facing_error - raise RubricParsingError("[extract_categories] Expected a tag: got {0} instead. Contact the learning sciences group for assistance.".format(category.tag)) + raise RubricParsingError( + "[extract_categories] Expected a tag: got {0} instead. Contact the learning sciences group for assistance.".format( + category.tag)) else: categories.append(self.extract_category(category)) return categories @@ -150,13 +155,17 @@ class CombinedOpenEndedRubric(object): # if we are missing the score tag and we are expecting one elif self.has_score: #This is a staff_facing_error - raise RubricParsingError("[extract_category] Category {0} is missing a score. Contact the learning sciences group for assistance.".format(descriptionxml.text)) + raise RubricParsingError( + "[extract_category] Category {0} is missing a score. Contact the learning sciences group for assistance.".format( + descriptionxml.text)) # parse description if descriptionxml.tag != 'description': #This is a staff_facing_error - raise RubricParsingError("[extract_category]: expected description tag, got {0} instead. Contact the learning sciences group for assistance.".format(descriptionxml.tag)) + raise RubricParsingError( + "[extract_category]: expected description tag, got {0} instead. Contact the learning sciences group for assistance.".format( + descriptionxml.tag)) description = descriptionxml.text @@ -167,7 +176,9 @@ class CombinedOpenEndedRubric(object): for option in optionsxml: if option.tag != 'option': #This is a staff_facing_error - raise RubricParsingError("[extract_category]: expected option tag, got {0} instead. Contact the learning sciences group for assistance.".format(option.tag)) + raise RubricParsingError( + "[extract_category]: expected option tag, got {0} instead. Contact the learning sciences group for assistance.".format( + option.tag)) else: pointstr = option.get("points") if pointstr: @@ -177,13 +188,16 @@ class CombinedOpenEndedRubric(object): points = int(pointstr) except ValueError: #This is a staff_facing_error - raise RubricParsingError("[extract_category]: expected points to have int, got {0} instead. Contact the learning sciences group for assistance.".format(pointstr)) + raise RubricParsingError( + "[extract_category]: expected points to have int, got {0} instead. Contact the learning sciences group for assistance.".format( + pointstr)) elif autonumbering: # use the generated one if we're in the right mode points = cur_points cur_points = cur_points + 1 else: - raise Exception("[extract_category]: missing points attribute. Cannot continue to auto-create points values after a points value is explicitly defined.") + raise Exception( + "[extract_category]: missing points attribute. Cannot continue to auto-create points values after a points value is explicitly defined.") selected = score == points optiontext = option.text @@ -193,31 +207,32 @@ class CombinedOpenEndedRubric(object): options = sorted(options, key=lambda option: option['points']) CombinedOpenEndedRubric.validate_options(options) - return {'description': description, 'options': options, 'score' : score} + return {'description': description, 'options': options, 'score': score} - def render_combined_rubric(self,rubric_xml,scores,score_types,feedback_types): - success, score_tuples = CombinedOpenEndedRubric.reformat_scores_for_rendering(scores,score_types,feedback_types) + def render_combined_rubric(self, rubric_xml, scores, score_types, feedback_types): + success, score_tuples = CombinedOpenEndedRubric.reformat_scores_for_rendering(scores, score_types, + feedback_types) rubric_categories = self.extract_categories(rubric_xml) max_scores = map((lambda cat: cat['options'][-1]['points']), rubric_categories) max_score = max(max_scores) - for i in xrange(0,len(rubric_categories)): + for i in xrange(0, len(rubric_categories)): category = rubric_categories[i] - for j in xrange(0,len(category['options'])): + for j in xrange(0, len(category['options'])): rubric_categories[i]['options'][j]['grader_types'] = [] for tuple in score_tuples: - if tuple[1] == i and tuple[2] ==j: + if tuple[1] == i and tuple[2] == j: for grader_type in tuple[3]: rubric_categories[i]['options'][j]['grader_types'].append(grader_type) html = self.system.render_template('{0}/open_ended_combined_rubric.html'.format(self.TEMPLATE_DIR), - {'categories': rubric_categories, - 'has_score': True, - 'view_only': True, - 'max_score': max_score, - 'combined_rubric' : True, - 'grader_type_image_dict' : GRADER_TYPE_IMAGE_DICT, - 'human_grader_types' : HUMAN_GRADER_TYPE, - }) + {'categories': rubric_categories, + 'has_score': True, + 'view_only': True, + 'max_score': max_score, + 'combined_rubric': True, + 'grader_type_image_dict': GRADER_TYPE_IMAGE_DICT, + 'human_grader_types': HUMAN_GRADER_TYPE, + }) return html @@ -228,14 +243,16 @@ class CombinedOpenEndedRubric(object): ''' if len(options) == 0: #This is a staff_facing_error - raise RubricParsingError("[extract_category]: no options associated with this category. Contact the learning sciences group for assistance.") + raise RubricParsingError( + "[extract_category]: no options associated with this category. Contact the learning sciences group for assistance.") if len(options) == 1: return prev = options[0]['points'] for option in options[1:]: if prev == option['points']: #This is a staff_facing_error - raise RubricParsingError("[extract_category]: found duplicate point values between two different options. Contact the learning sciences group for assistance.") + raise RubricParsingError( + "[extract_category]: found duplicate point values between two different options. Contact the learning sciences group for assistance.") else: prev = option['points'] @@ -250,7 +267,7 @@ class CombinedOpenEndedRubric(object): @return: """ success = False - if len(scores)==0: + if len(scores) == 0: #This is a dev_facing_error log.error("Score length is 0 when trying to reformat rubric scores for rendering.") return success, "" @@ -264,25 +281,25 @@ class CombinedOpenEndedRubric(object): score_lists = [] score_type_list = [] feedback_type_list = [] - for i in xrange(0,len(scores)): + for i in xrange(0, len(scores)): score_cont_list = scores[i] - for j in xrange(0,len(score_cont_list)): + for j in xrange(0, len(score_cont_list)): score_list = score_cont_list[j] score_lists.append(score_list) score_type_list.append(score_types[i][j]) feedback_type_list.append(feedback_types[i][j]) score_list_len = len(score_lists[0]) - for i in xrange(0,len(score_lists)): + for i in xrange(0, len(score_lists)): score_list = score_lists[i] - if len(score_list)!=score_list_len: + if len(score_list) != score_list_len: return success, "" score_tuples = [] - for i in xrange(0,len(score_lists)): - for j in xrange(0,len(score_lists[i])): - tuple = [1,j,score_lists[i][j],[],[]] - score_tuples, tup_ind = CombinedOpenEndedRubric.check_for_tuple_matches(score_tuples,tuple) + for i in xrange(0, len(score_lists)): + for j in xrange(0, len(score_lists[i])): + tuple = [1, j, score_lists[i][j], [], []] + score_tuples, tup_ind = CombinedOpenEndedRubric.check_for_tuple_matches(score_tuples, tuple) score_tuples[tup_ind][0] += 1 score_tuples[tup_ind][3].append(score_type_list[i]) score_tuples[tup_ind][4].append(feedback_type_list[i]) @@ -302,14 +319,14 @@ class CombinedOpenEndedRubric(object): category = tuple[1] score = tuple[2] tup_ind = -1 - for t in xrange(0,len(tuples)): + for t in xrange(0, len(tuples)): if tuples[t][1] == category and tuples[t][2] == score: tup_ind = t break if tup_ind == -1: - tuples.append([0,category,score,[],[]]) - tup_ind = len(tuples)-1 + tuples.append([0, category, score, [], []]) + tup_ind = len(tuples) - 1 return tuples, tup_ind diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/controller_query_service.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/controller_query_service.py index 1dd5c57ad4..21715c8e57 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/controller_query_service.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/controller_query_service.py @@ -8,6 +8,7 @@ class ControllerQueryService(GradingService): """ Interface to staff grading backend. """ + def __init__(self, config, system): config['system'] = system super(ControllerQueryService, self).__init__(config) @@ -59,7 +60,7 @@ class ControllerQueryService(GradingService): def get_flagged_problem_list(self, course_id): params = { 'course_id': course_id, - } + } response = self.get(self.flagged_problem_list_url, params) return response @@ -70,20 +71,21 @@ class ControllerQueryService(GradingService): 'student_id': student_id, 'submission_id': submission_id, 'action_type': action_type - } + } response = self.post(self.take_action_on_flags_url, params) return response + def convert_seconds_to_human_readable(seconds): if seconds < 60: human_string = "{0} seconds".format(seconds) elif seconds < 60 * 60: - human_string = "{0} minutes".format(round(seconds/60,1)) - elif seconds < (24*60*60): - human_string = "{0} hours".format(round(seconds/(60*60),1)) + human_string = "{0} minutes".format(round(seconds / 60, 1)) + elif seconds < (24 * 60 * 60): + human_string = "{0} hours".format(round(seconds / (60 * 60), 1)) else: - human_string = "{0} days".format(round(seconds/(60*60*24),1)) + human_string = "{0} days".format(round(seconds / (60 * 60 * 24), 1)) eta_string = "{0}".format(human_string) return eta_string diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/grading_service_module.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/grading_service_module.py index 8a4caa1291..0f961794d5 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/grading_service_module.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/grading_service_module.py @@ -19,6 +19,7 @@ class GradingService(object): """ Interface to staff grading backend. """ + def __init__(self, config): self.username = config['username'] self.password = config['password'] @@ -34,8 +35,8 @@ class GradingService(object): Returns the decoded json dict of the response. """ response = self.session.post(self.login_url, - {'username': self.username, - 'password': self.password, }) + {'username': self.username, + 'password': self.password, }) response.raise_for_status() @@ -47,7 +48,7 @@ class GradingService(object): """ try: op = lambda: self.session.post(url, data=data, - allow_redirects=allow_redirects) + allow_redirects=allow_redirects) r = self._try_with_login(op) except (RequestException, ConnectionError, HTTPError) as err: # reraise as promised GradingServiceError, but preserve stacktrace. @@ -63,8 +64,8 @@ class GradingService(object): """ log.debug(params) op = lambda: self.session.get(url, - allow_redirects=allow_redirects, - params=params) + allow_redirects=allow_redirects, + params=params) try: r = self._try_with_login(op) except (RequestException, ConnectionError, HTTPError) as err: @@ -92,7 +93,7 @@ class GradingService(object): r = self._login() if r and not r.get('success'): log.warning("Couldn't log into staff_grading backend. Response: %s", - r) + r) # try again response = operation() response.raise_for_status() diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_image_submission.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_image_submission.py index edae69854f..6956f336a5 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_image_submission.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_image_submission.py @@ -5,6 +5,7 @@ to send them to S3. try: from PIL import Image + ENABLE_PIL = True except: ENABLE_PIL = False @@ -51,6 +52,7 @@ class ImageProperties(object): """ Class to check properties of an image and to validate if they are allowed. """ + def __init__(self, image_data): """ Initializes class variables @@ -92,7 +94,7 @@ class ImageProperties(object): g = rgb[1] b = rgb[2] check_r = (r > 60) - check_g = (r * 0.4) < g < (r * 0.85) + check_g = (r * 0.4) < g < (r * 0.85) check_b = (r * 0.2) < b < (r * 0.7) colors_okay = check_r and check_b and check_g except: @@ -141,6 +143,7 @@ class URLProperties(object): Checks to see if a URL points to acceptable content. Added to check if students are submitting reasonable links to the peer grading image functionality of the external grading service. """ + def __init__(self, url_string): self.url_string = url_string @@ -212,7 +215,7 @@ def run_image_tests(image): success = image_properties.run_tests() except: log.exception("Cannot run image tests in combined open ended xmodule. May be an issue with a particular image," - "or an issue with the deployment configuration of PIL/Pillow") + "or an issue with the deployment configuration of PIL/Pillow") return success @@ -252,7 +255,8 @@ def upload_to_s3(file_to_upload, keyname, s3_interface): return True, public_url except: #This is a dev_facing_error - error_message = "Could not connect to S3 to upload peer grading image. Trying to utilize bucket: {0}".format(bucketname.lower()) + error_message = "Could not connect to S3 to upload peer grading image. Trying to utilize bucket: {0}".format( + bucketname.lower()) log.error(error_message) return False, error_message diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py index aa805a5290..b16e7f5313 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py @@ -10,7 +10,7 @@ import logging from lxml import etree import capa.xqueue_interface as xqueue_interface -from xmodule.capa_module import ComplexEncoder +from xmodule.capa_module import ComplexEncoder from xmodule.editing_module import EditingDescriptor from xmodule.progress import Progress from xmodule.stringify import stringify_children @@ -104,7 +104,9 @@ class OpenEndedModule(openendedchild.OpenEndedChild): # response types) except TypeError, ValueError: #This is a dev_facing_error - log.exception("Grader payload from external open ended grading server is not a json object! Object: {0}".format(grader_payload)) + log.exception( + "Grader payload from external open ended grading server is not a json object! Object: {0}".format( + grader_payload)) self.initial_display = find_with_default(oeparam, 'initial_display', '') self.answer = find_with_default(oeparam, 'answer_display', 'No answer given.') @@ -148,7 +150,9 @@ class OpenEndedModule(openendedchild.OpenEndedChild): for tag in ['feedback', 'submission_id', 'grader_id', 'score']: if tag not in survey_responses: #This is a student_facing_error - return {'success': False, 'msg': "Could not find needed tag {0} in the survey responses. Please try submitting again.".format(tag)} + return {'success': False, + 'msg': "Could not find needed tag {0} in the survey responses. Please try submitting again.".format( + tag)} try: submission_id = int(survey_responses['submission_id']) grader_id = int(survey_responses['grader_id']) @@ -188,7 +192,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild): } (error, msg) = qinterface.send_to_queue(header=xheader, - body=json.dumps(contents)) + body=json.dumps(contents)) #Convert error to a success value success = True @@ -222,8 +226,8 @@ class OpenEndedModule(openendedchild.OpenEndedChild): str(len(self.history))) xheader = xqueue_interface.make_xheader(lms_callback_url=system.xqueue['callback_url'], - lms_key=queuekey, - queue_name=self.queue_name) + lms_key=queuekey, + queue_name=self.queue_name) contents = self.payload.copy() @@ -241,7 +245,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild): # Submit request. When successful, 'msg' is the prior length of the queue (error, msg) = qinterface.send_to_queue(header=xheader, - body=json.dumps(contents)) + body=json.dumps(contents)) # State associated with the queueing request queuestate = {'key': queuekey, @@ -300,7 +304,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild): # We want to display available feedback in a particular order. # This dictionary specifies which goes first--lower first. - priorities = { # These go at the start of the feedback + priorities = {# These go at the start of the feedback 'spelling': 0, 'grammar': 1, # needs to be after all the other feedback @@ -400,7 +404,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild): if not response_items['success']: return system.render_template("{0}/open_ended_error.html".format(self.TEMPLATE_DIR), - {'errors': feedback}) + {'errors': feedback}) feedback_template = system.render_template("{0}/open_ended_feedback.html".format(self.TEMPLATE_DIR), { 'grader_type': response_items['grader_type'], @@ -437,13 +441,13 @@ class OpenEndedModule(openendedchild.OpenEndedChild): 'valid': False, 'score': 0, 'feedback': '', - 'rubric_scores' : [[0]], - 'grader_types' : [''], - 'feedback_items' : [''], - 'feedback_dicts' : [{}], - 'grader_ids' : [0], - 'submission_ids' : [0], - } + 'rubric_scores': [[0]], + 'grader_types': [''], + 'feedback_items': [''], + 'feedback_dicts': [{}], + 'grader_ids': [0], + 'submission_ids': [0], + } try: score_result = json.loads(score_msg) except (TypeError, ValueError): @@ -470,7 +474,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild): log.error(error_message) fail['feedback'] = error_message return fail - #This is to support peer grading + #This is to support peer grading if isinstance(score_result['score'], list): feedback_items = [] rubric_scores = [] @@ -527,12 +531,12 @@ class OpenEndedModule(openendedchild.OpenEndedChild): 'valid': True, 'score': score, 'feedback': feedback, - 'rubric_scores' : rubric_scores, - 'grader_types' : grader_types, - 'feedback_items' : feedback_items, - 'feedback_dicts' : feedback_dicts, - 'grader_ids' : grader_ids, - 'submission_ids' : submission_ids, + 'rubric_scores': rubric_scores, + 'grader_types': grader_types, + 'feedback_items': feedback_items, + 'feedback_dicts': feedback_dicts, + 'grader_ids': grader_ids, + 'submission_ids': submission_ids, } def latest_post_assessment(self, system, short_feedback=False, join_feedback=True): @@ -545,7 +549,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild): return "" feedback_dict = self._parse_score_msg(self.history[-1].get('post_assessment', ""), system, - join_feedback=join_feedback) + join_feedback=join_feedback) if not short_feedback: return feedback_dict['feedback'] if feedback_dict['valid'] else '' if feedback_dict['valid']: @@ -585,7 +589,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild): #This is a dev_facing_error log.error("Cannot find {0} in handlers in handle_ajax function for open_ended_module.py".format(dispatch)) #This is a dev_facing_error - return json.dumps({'error': 'Error handling action. Please try again.', 'success' : False}) + return json.dumps({'error': 'Error handling action. Please try again.', 'success': False}) before = self.get_progress() d = handlers[dispatch](get, system) @@ -679,7 +683,6 @@ class OpenEndedModule(openendedchild.OpenEndedChild): correct = "" previous_answer = self.initial_display - context = { 'prompt': self.prompt, 'previous_answer': previous_answer, @@ -692,7 +695,7 @@ class OpenEndedModule(openendedchild.OpenEndedChild): 'child_type': 'openended', 'correct': correct, 'accept_file_upload': self.accept_file_upload, - 'eta_message' : eta_string, + 'eta_message': eta_string, } html = system.render_template('{0}/open_ended.html'.format(self.TEMPLATE_DIR), context) return html @@ -723,7 +726,9 @@ class OpenEndedDescriptor(XmlDescriptor, EditingDescriptor): for child in ['openendedparam']: if len(xml_object.xpath(child)) != 1: #This is a staff_facing_error - raise ValueError("Open Ended definition must include exactly one '{0}' tag. Contact the learning sciences group for assistance.".format(child)) + raise ValueError( + "Open Ended definition must include exactly one '{0}' tag. Contact the learning sciences group for assistance.".format( + child)) def parse(k): """Assumes that xml_object has child k""" diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py index 31d26fd3c3..91dec5943d 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py @@ -74,7 +74,7 @@ class OpenEndedChild(object): 'done': 'Done', } - def __init__(self, system, location, definition, descriptor, static_data, + def __init__(self, system, location, definition, descriptor, static_data, instance_state=None, shared_state=None, **kwargs): # Load instance state if instance_state is not None: @@ -108,15 +108,14 @@ class OpenEndedChild(object): self._max_score = static_data['max_score'] if system.open_ended_grading_interface: self.peer_gs = PeerGradingService(system.open_ended_grading_interface, system) - self.controller_qs = controller_query_service.ControllerQueryService(system.open_ended_grading_interface,system) + self.controller_qs = controller_query_service.ControllerQueryService(system.open_ended_grading_interface, + system) else: self.peer_gs = MockPeerGradingService() - self.controller_qs = None - - + self.controller_qs = None self.system = system - + self.location_string = location try: self.location_string = self.location_string.url() @@ -152,7 +151,8 @@ class OpenEndedChild(object): return True, { 'success': False, #This is a student_facing_error - 'error': 'You have attempted this problem {0} times. You are allowed {1} attempts.'.format(self.attempts, self.max_attempts) + 'error': 'You have attempted this problem {0} times. You are allowed {1} attempts.'.format( + self.attempts, self.max_attempts) } else: return False, {} @@ -180,8 +180,8 @@ class OpenEndedChild(object): try: answer = autolink_html(answer) cleaner = Cleaner(style=True, links=True, add_nofollow=False, page_structure=True, safe_attrs_only=True, - host_whitelist=open_ended_image_submission.TRUSTED_IMAGE_DOMAINS, - whitelist_tags=set(['embed', 'iframe', 'a', 'img'])) + host_whitelist=open_ended_image_submission.TRUSTED_IMAGE_DOMAINS, + whitelist_tags=set(['embed', 'iframe', 'a', 'img'])) clean_html = cleaner.clean_html(answer) clean_html = re.sub(r'

$', '', re.sub(r'^

', '', clean_html)) except: @@ -282,7 +282,7 @@ class OpenEndedChild(object): """ #This is a dev_facing_error log.warning("Open ended child state out sync. state: %r, get: %r. %s", - self.state, get, msg) + self.state, get, msg) #This is a student_facing_error return {'success': False, 'error': 'The problem state got out-of-sync. Please try reloading the page.'} @@ -308,7 +308,7 @@ class OpenEndedChild(object): @return: Boolean correct. """ correct = False - if(isinstance(score, (int, long, float, complex))): + if (isinstance(score, (int, long, float, complex))): score_ratio = int(score) / float(self.max_score()) correct = (score_ratio >= 0.66) return correct @@ -342,7 +342,8 @@ class OpenEndedChild(object): try: image_data.seek(0) - success, s3_public_url = open_ended_image_submission.upload_to_s3(image_data, image_key, self.s3_interface) + success, s3_public_url = open_ended_image_submission.upload_to_s3(image_data, image_key, + self.s3_interface) except: log.exception("Could not upload image to S3.") @@ -404,9 +405,9 @@ class OpenEndedChild(object): #In this case, an image was submitted by the student, but the image could not be uploaded to S3. Likely #a config issue (development vs deployment). For now, just treat this as a "success" log.exception("Student AJAX post to combined open ended xmodule indicated that it contained an image, " - "but the image was not able to be uploaded to S3. This could indicate a config" - "issue with this deployment, but it could also indicate a problem with S3 or with the" - "student image itself.") + "but the image was not able to be uploaded to S3. This could indicate a config" + "issue with this deployment, but it could also indicate a problem with S3 or with the" + "student image itself.") overall_success = True elif not has_file_to_upload: #If there is no file to upload, probably the student has embedded the link in the answer text @@ -445,7 +446,7 @@ class OpenEndedChild(object): response = {} #This is a student_facing_error error_string = ("You need to peer grade {0} more in order to make another submission. " - "You have graded {1}, and {2} are required. You have made {3} successful peer grading submissions.") + "You have graded {1}, and {2} are required. You have made {3} successful peer grading submissions.") try: response = self.peer_gs.get_data_for_location(self.location_string, student_id) count_graded = response['count_graded'] @@ -454,16 +455,18 @@ class OpenEndedChild(object): success = True except: #This is a dev_facing_error - log.error("Could not contact external open ended graders for location {0} and student {1}".format(self.location_string,student_id)) + log.error("Could not contact external open ended graders for location {0} and student {1}".format( + self.location_string, student_id)) #This is a student_facing_error error_message = "Could not contact the graders. Please notify course staff." return success, allowed_to_submit, error_message - if count_graded>=count_required: + if count_graded >= count_required: return success, allowed_to_submit, "" else: allowed_to_submit = False #This is a student_facing_error - error_message = error_string.format(count_required-count_graded, count_graded, count_required, student_sub_count) + error_message = error_string.format(count_required - count_graded, count_graded, count_required, + student_sub_count) return success, allowed_to_submit, error_message def get_eta(self): @@ -478,7 +481,7 @@ class OpenEndedChild(object): success = response['success'] if isinstance(success, basestring): - success = (success.lower()=="true") + success = (success.lower() == "true") if success: eta = controller_query_service.convert_seconds_to_human_readable(response['eta']) diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/peer_grading_service.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/peer_grading_service.py index 42c54f0463..5daf1b83b5 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/peer_grading_service.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/peer_grading_service.py @@ -14,6 +14,7 @@ class PeerGradingService(GradingService): """ Interface with the grading controller for peer grading """ + def __init__(self, config, system): config['system'] = system super(PeerGradingService, self).__init__(config) @@ -36,10 +37,11 @@ class PeerGradingService(GradingService): def get_next_submission(self, problem_location, grader_id): response = self.get(self.get_next_submission_url, - {'location': problem_location, 'grader_id': grader_id}) + {'location': problem_location, 'grader_id': grader_id}) return self.try_to_decode(self._render_rubric(response)) - def save_grade(self, location, grader_id, submission_id, score, feedback, submission_key, rubric_scores, submission_flagged): + def save_grade(self, location, grader_id, submission_id, score, feedback, submission_key, rubric_scores, + submission_flagged): data = {'grader_id': grader_id, 'submission_id': submission_id, 'score': score, @@ -89,6 +91,7 @@ class PeerGradingService(GradingService): pass return text + """ This is a mock peer grading service that can be used for unit tests without making actual service calls to the grading controller @@ -122,7 +125,7 @@ class MockPeerGradingService(object): 'max_score': 4}) def save_calibration_essay(self, problem_location, grader_id, - calibration_essay_id, submission_key, score, + calibration_essay_id, submission_key, score, feedback, rubric_scores): return {'success': True, 'actual_score': 2} diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/self_assessment_module.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/self_assessment_module.py index f4be426667..a25d81eeae 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/self_assessment_module.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/self_assessment_module.py @@ -95,7 +95,7 @@ class SelfAssessmentModule(openendedchild.OpenEndedChild): #This is a dev_facing_error log.error("Cannot find {0} in handlers in handle_ajax function for open_ended_module.py".format(dispatch)) #This is a dev_facing_error - return json.dumps({'error': 'Error handling action. Please try again.', 'success' : False}) + return json.dumps({'error': 'Error handling action. Please try again.', 'success': False}) before = self.get_progress() d = handlers[dispatch](get, system) @@ -224,7 +224,7 @@ class SelfAssessmentModule(openendedchild.OpenEndedChild): try: score = int(get['assessment']) score_list = get.getlist('score_list[]') - for i in xrange(0,len(score_list)): + for i in xrange(0, len(score_list)): score_list[i] = int(score_list[i]) except ValueError: #This is a dev_facing_error @@ -268,7 +268,7 @@ class SelfAssessmentModule(openendedchild.OpenEndedChild): 'allow_reset': self._allow_reset()} def latest_post_assessment(self, system): - latest_post_assessment = super(SelfAssessmentModule, self).latest_post_assessment(system) + latest_post_assessment = super(SelfAssessmentModule, self).latest_post_assessment(system) try: rubric_scores = json.loads(latest_post_assessment) except: @@ -305,7 +305,9 @@ class SelfAssessmentDescriptor(XmlDescriptor, EditingDescriptor): for child in expected_children: if len(xml_object.xpath(child)) != 1: #This is a staff_facing_error - raise ValueError("Self assessment definition must include exactly one '{0}' tag. Contact the learning sciences group for assistance.".format(child)) + raise ValueError( + "Self assessment definition must include exactly one '{0}' tag. Contact the learning sciences group for assistance.".format( + child)) def parse(k): """Assumes that xml_object has child k""" diff --git a/common/lib/xmodule/xmodule/peer_grading_module.py b/common/lib/xmodule/xmodule/peer_grading_module.py index 1e52dcf070..2ea8ab0db5 100644 --- a/common/lib/xmodule/xmodule/peer_grading_module.py +++ b/common/lib/xmodule/xmodule/peer_grading_module.py @@ -5,7 +5,7 @@ from lxml import etree from datetime import datetime from pkg_resources import resource_string -from .capa_module import ComplexEncoder +from .capa_module import ComplexEncoder from .editing_module import EditingDescriptor from .stringify import stringify_children from .x_module import XModule @@ -34,7 +34,7 @@ class PeerGradingModule(XModule): resource_string(__name__, 'js/src/peergrading/peer_grading_problem.coffee'), resource_string(__name__, 'js/src/collapsible.coffee'), resource_string(__name__, 'js/src/javascript_loader.coffee'), - ]} + ]} js_module_name = "PeerGrading" css = {'scss': [resource_string(__name__, 'css/combinedopenended/display.scss')]} @@ -42,7 +42,7 @@ class PeerGradingModule(XModule): def __init__(self, system, location, definition, descriptor, instance_state=None, shared_state=None, **kwargs): XModule.__init__(self, system, location, definition, descriptor, - instance_state, shared_state, **kwargs) + instance_state, shared_state, **kwargs) # Load instance state if instance_state is not None: @@ -53,12 +53,11 @@ class PeerGradingModule(XModule): #We need to set the location here so the child modules can use it system.set('location', location) self.system = system - if(self.system.open_ended_grading_interface): + if (self.system.open_ended_grading_interface): self.peer_gs = PeerGradingService(self.system.open_ended_grading_interface, self.system) else: self.peer_gs = MockPeerGradingService() - self.use_for_single_location = self.metadata.get('use_for_single_location', USE_FOR_SINGLE_LOCATION) if isinstance(self.use_for_single_location, basestring): self.use_for_single_location = (self.use_for_single_location in TRUE_DICT) @@ -83,14 +82,13 @@ class PeerGradingModule(XModule): grace_period_string = self.metadata.get('graceperiod', None) try: - self.timeinfo = TimeInfo(display_due_date_string, grace_period_string) + self.timeinfo = TimeInfo(display_due_date_string, grace_period_string) except: log.error("Error parsing due date information in location {0}".format(location)) raise self.display_due_date = self.timeinfo.display_due_date - self.ajax_url = self.system.ajax_url if not self.ajax_url.endswith("/"): self.ajax_url = self.ajax_url + "/" @@ -148,13 +146,13 @@ class PeerGradingModule(XModule): 'save_grade': self.save_grade, 'save_calibration_essay': self.save_calibration_essay, 'problem': self.peer_grading_problem, - } + } if dispatch not in handlers: #This is a dev_facing_error log.error("Cannot find {0} in handlers in handle_ajax function for open_ended_module.py".format(dispatch)) #This is a dev_facing_error - return json.dumps({'error': 'Error handling action. Please try again.', 'success' : False}) + return json.dumps({'error': 'Error handling action. Please try again.', 'success': False}) d = handlers[dispatch](get) @@ -191,9 +189,10 @@ class PeerGradingModule(XModule): except: success, response = self.query_data_for_location() if not success: - log.exception("No instance data found and could not get data from controller for loc {0} student {1}".format( - self.system.location.url(), self.system.anonymous_student_id - )) + log.exception( + "No instance data found and could not get data from controller for loc {0} student {1}".format( + self.system.location.url(), self.system.anonymous_student_id + )) return None count_graded = response['count_graded'] count_required = response['count_required'] @@ -204,7 +203,7 @@ class PeerGradingModule(XModule): score_dict = { 'score': int(count_graded >= count_required), 'total': self.max_grade, - } + } return score_dict @@ -253,7 +252,7 @@ class PeerGradingModule(XModule): .format(self.peer_gs.url, location, grader_id)) #This is a student_facing_error return {'success': False, - 'error': EXTERNAL_GRADER_NO_CONTACT_ERROR} + 'error': EXTERNAL_GRADER_NO_CONTACT_ERROR} def save_grade(self, get): """ @@ -271,7 +270,8 @@ class PeerGradingModule(XModule): error: if there was an error in the submission, this is the error message """ - required = set(['location', 'submission_id', 'submission_key', 'score', 'feedback', 'rubric_scores[]', 'submission_flagged']) + required = set(['location', 'submission_id', 'submission_key', 'score', 'feedback', 'rubric_scores[]', + 'submission_flagged']) success, message = self._check_required(get, required) if not success: return self._err_response(message) @@ -287,14 +287,14 @@ class PeerGradingModule(XModule): try: response = self.peer_gs.save_grade(location, grader_id, submission_id, - score, feedback, submission_key, rubric_scores, submission_flagged) + score, feedback, submission_key, rubric_scores, submission_flagged) return response except GradingServiceError: #This is a dev_facing_error log.exception("""Error saving grade to open ended grading service. server url: {0}, location: {1}, submission_id:{2}, submission_key: {3}, score: {4}""" .format(self.peer_gs.url, - location, submission_id, submission_key, score) + location, submission_id, submission_key, score) ) #This is a student_facing_error return { @@ -382,7 +382,7 @@ class PeerGradingModule(XModule): .format(self.peer_gs.url, location)) #This is a student_facing_error return {'success': False, - 'error': EXTERNAL_GRADER_NO_CONTACT_ERROR} + 'error': EXTERNAL_GRADER_NO_CONTACT_ERROR} # if we can't parse the rubric into HTML, except etree.XMLSyntaxError: #This is a dev_facing_error @@ -390,7 +390,7 @@ class PeerGradingModule(XModule): .format(rubric)) #This is a student_facing_error return {'success': False, - 'error': 'Error displaying submission. Please notify course staff.'} + 'error': 'Error displaying submission. Please notify course staff.'} def save_calibration_essay(self, get): @@ -426,11 +426,13 @@ class PeerGradingModule(XModule): try: response = self.peer_gs.save_calibration_essay(location, grader_id, calibration_essay_id, - submission_key, score, feedback, rubric_scores) + submission_key, score, feedback, rubric_scores) return response except GradingServiceError: #This is a dev_facing_error - log.exception("Error saving calibration grade, location: {0}, submission_id: {1}, submission_key: {2}, grader_id: {3}".format(location, submission_id, submission_key, grader_id)) + log.exception( + "Error saving calibration grade, location: {0}, submission_id: {1}, submission_key: {2}, grader_id: {3}".format( + location, submission_id, submission_key, grader_id)) #This is a student_facing_error return self._err_response('There was an error saving your score. Please notify course staff.') @@ -440,7 +442,7 @@ class PeerGradingModule(XModule): ''' html = self.system.render_template('peer_grading/peer_grading_closed.html', { 'use_for_single_location': self.use_for_single_location - }) + }) return html @@ -503,12 +505,11 @@ class PeerGradingModule(XModule): problem['closed'] = True else: problem['closed'] = False - else: - # if we can't find the due date, assume that it doesn't have one + else: + # if we can't find the due date, assume that it doesn't have one problem['due'] = None problem['closed'] = False - ajax_url = self.ajax_url html = self.system.render_template('peer_grading/peer_grading.html', { 'course_id': self.system.course_id, @@ -519,7 +520,7 @@ class PeerGradingModule(XModule): # Checked above 'staff_access': False, 'use_single_location': self.use_for_single_location, - }) + }) return html @@ -531,7 +532,8 @@ class PeerGradingModule(XModule): if not self.use_for_single_location: #This is an error case, because it must be set to use a single location to be called without get parameters #This is a dev_facing_error - log.error("Peer grading problem in peer_grading_module called with no get parameters, but use_for_single_location is False.") + log.error( + "Peer grading problem in peer_grading_module called with no get parameters, but use_for_single_location is False.") return {'html': "", 'success': False} problem_location = self.link_to_location @@ -547,7 +549,7 @@ class PeerGradingModule(XModule): # Checked above 'staff_access': False, 'use_single_location': self.use_for_single_location, - }) + }) return {'html': html, 'success': True} @@ -560,7 +562,7 @@ class PeerGradingModule(XModule): state = { 'student_data_for_location': self.student_data_for_location, - } + } return json.dumps(state) @@ -596,7 +598,9 @@ class PeerGradingDescriptor(XmlDescriptor, EditingDescriptor): for child in expected_children: if len(xml_object.xpath(child)) == 0: #This is a staff_facing_error - raise ValueError("Peer grading definition must include at least one '{0}' tag. Contact the learning sciences group for assistance.".format(child)) + raise ValueError( + "Peer grading definition must include at least one '{0}' tag. Contact the learning sciences group for assistance.".format( + child)) def parse_task(k): """Assumes that xml_object has child k""" diff --git a/common/lib/xmodule/xmodule/tests/test_combined_open_ended.py b/common/lib/xmodule/xmodule/tests/test_combined_open_ended.py index a524ac2fd9..8a14e03ded 100644 --- a/common/lib/xmodule/xmodule/tests/test_combined_open_ended.py +++ b/common/lib/xmodule/xmodule/tests/test_combined_open_ended.py @@ -14,6 +14,7 @@ from datetime import datetime from . import test_system import test_util_open_ended + """ Tests for the various pieces of the CombinedOpenEndedGrading system @@ -39,41 +40,37 @@ class OpenEndedChildTest(unittest.TestCase): max_score = 1 static_data = { - 'max_attempts': 20, - 'prompt': prompt, - 'rubric': rubric, - 'max_score': max_score, - 'display_name': 'Name', - 'accept_file_upload': False, - 'close_date': None, - 's3_interface' : "", - 'open_ended_grading_interface' : {}, - 'skip_basic_checks' : False, - } + 'max_attempts': 20, + 'prompt': prompt, + 'rubric': rubric, + 'max_score': max_score, + 'display_name': 'Name', + 'accept_file_upload': False, + 'close_date': None, + 's3_interface': "", + 'open_ended_grading_interface': {}, + 'skip_basic_checks': False, + } definition = Mock() descriptor = Mock() def setUp(self): self.test_system = test_system() self.openendedchild = OpenEndedChild(self.test_system, self.location, - self.definition, self.descriptor, self.static_data, self.metadata) - + self.definition, self.descriptor, self.static_data, self.metadata) def test_latest_answer_empty(self): answer = self.openendedchild.latest_answer() self.assertEqual(answer, "") - def test_latest_score_empty(self): answer = self.openendedchild.latest_score() self.assertEqual(answer, None) - def test_latest_post_assessment_empty(self): answer = self.openendedchild.latest_post_assessment(self.test_system) self.assertEqual(answer, "") - def test_new_history_entry(self): new_answer = "New Answer" self.openendedchild.new_history_entry(new_answer) @@ -99,7 +96,6 @@ class OpenEndedChildTest(unittest.TestCase): score = self.openendedchild.latest_score() self.assertEqual(score, 4) - def test_record_latest_post_assessment(self): new_answer = "New Answer" self.openendedchild.new_history_entry(new_answer) @@ -107,7 +103,7 @@ class OpenEndedChildTest(unittest.TestCase): post_assessment = "Post assessment" self.openendedchild.record_latest_post_assessment(post_assessment) self.assertEqual(post_assessment, - self.openendedchild.latest_post_assessment(self.test_system)) + self.openendedchild.latest_post_assessment(self.test_system)) def test_get_score(self): new_answer = "New Answer" @@ -124,24 +120,22 @@ class OpenEndedChildTest(unittest.TestCase): self.assertEqual(score['score'], new_score) self.assertEqual(score['total'], self.static_data['max_score']) - def test_reset(self): self.openendedchild.reset(self.test_system) state = json.loads(self.openendedchild.get_instance_state()) self.assertEqual(state['state'], OpenEndedChild.INITIAL) - def test_is_last_response_correct(self): new_answer = "New Answer" self.openendedchild.new_history_entry(new_answer) self.openendedchild.record_latest_score(self.static_data['max_score']) self.assertEqual(self.openendedchild.is_last_response_correct(), - 'correct') + 'correct') self.openendedchild.new_history_entry(new_answer) self.openendedchild.record_latest_score(0) self.assertEqual(self.openendedchild.is_last_response_correct(), - 'incorrect') + 'incorrect') class OpenEndedModuleTest(unittest.TestCase): @@ -159,18 +153,18 @@ class OpenEndedModuleTest(unittest.TestCase): max_score = 4 static_data = { - 'max_attempts': 20, - 'prompt': prompt, - 'rubric': rubric, - 'max_score': max_score, - 'display_name': 'Name', - 'accept_file_upload': False, - 'rewrite_content_links' : "", - 'close_date': None, - 's3_interface' : test_util_open_ended.S3_INTERFACE, - 'open_ended_grading_interface' : test_util_open_ended.OPEN_ENDED_GRADING_INTERFACE, - 'skip_basic_checks' : False, - } + 'max_attempts': 20, + 'prompt': prompt, + 'rubric': rubric, + 'max_score': max_score, + 'display_name': 'Name', + 'accept_file_upload': False, + 'rewrite_content_links': "", + 'close_date': None, + 's3_interface': test_util_open_ended.S3_INTERFACE, + 'open_ended_grading_interface': test_util_open_ended.OPEN_ENDED_GRADING_INTERFACE, + 'skip_basic_checks': False, + } oeparam = etree.XML(''' @@ -188,25 +182,26 @@ class OpenEndedModuleTest(unittest.TestCase): self.test_system.location = self.location self.mock_xqueue = MagicMock() self.mock_xqueue.send_to_queue.return_value = (None, "Message") - self.test_system.xqueue = {'interface': self.mock_xqueue, 'callback_url': '/', 'default_queuename': 'testqueue', 'waittime': 1} + self.test_system.xqueue = {'interface': self.mock_xqueue, 'callback_url': '/', 'default_queuename': 'testqueue', + 'waittime': 1} self.openendedmodule = OpenEndedModule(self.test_system, self.location, - self.definition, self.descriptor, self.static_data, self.metadata) + self.definition, self.descriptor, self.static_data, self.metadata) def test_message_post(self): get = {'feedback': 'feedback text', - 'submission_id': '1', - 'grader_id': '1', - 'score': 3} + 'submission_id': '1', + 'grader_id': '1', + 'score': 3} qtime = datetime.strftime(datetime.now(), xqueue_interface.dateformat) student_info = {'anonymous_student_id': self.test_system.anonymous_student_id, - 'submission_time': qtime} + 'submission_time': qtime} contents = { - 'feedback': get['feedback'], - 'submission_id': int(get['submission_id']), - 'grader_id': int(get['grader_id']), - 'score': get['score'], - 'student_info': json.dumps(student_info) - } + 'feedback': get['feedback'], + 'submission_id': int(get['submission_id']), + 'grader_id': int(get['grader_id']), + 'score': get['score'], + 'student_info': json.dumps(student_info) + } result = self.openendedmodule.message_post(get, self.test_system) self.assertTrue(result['success']) @@ -220,13 +215,13 @@ class OpenEndedModuleTest(unittest.TestCase): submission = "This is a student submission" qtime = datetime.strftime(datetime.now(), xqueue_interface.dateformat) student_info = {'anonymous_student_id': self.test_system.anonymous_student_id, - 'submission_time': qtime} + 'submission_time': qtime} contents = self.openendedmodule.payload.copy() contents.update({ 'student_info': json.dumps(student_info), 'student_response': submission, 'max_score': self.max_score - }) + }) result = self.openendedmodule.send_to_grader(submission, self.test_system) self.assertTrue(result) self.mock_xqueue.send_to_queue.assert_called_with(body=json.dumps(contents), header=ANY) @@ -234,36 +229,36 @@ class OpenEndedModuleTest(unittest.TestCase): def update_score_single(self): self.openendedmodule.new_history_entry("New Entry") score_msg = { - 'correct': True, - 'score': 4, - 'msg': 'Grader Message', - 'feedback': "Grader Feedback" - } + 'correct': True, + 'score': 4, + 'msg': 'Grader Message', + 'feedback': "Grader Feedback" + } get = {'queuekey': "abcd", - 'xqueue_body': score_msg} + 'xqueue_body': score_msg} self.openendedmodule.update_score(get, self.test_system) def update_score_single(self): self.openendedmodule.new_history_entry("New Entry") feedback = { - "success": True, - "feedback": "Grader Feedback" - } + "success": True, + "feedback": "Grader Feedback" + } score_msg = { - 'correct': True, - 'score': 4, - 'msg': 'Grader Message', - 'feedback': json.dumps(feedback), - 'grader_type': 'IN', - 'grader_id': '1', - 'submission_id': '1', - 'success': True, - 'rubric_scores': [0], - 'rubric_scores_complete': True, - 'rubric_xml': etree.tostring(self.rubric) - } + 'correct': True, + 'score': 4, + 'msg': 'Grader Message', + 'feedback': json.dumps(feedback), + 'grader_type': 'IN', + 'grader_id': '1', + 'submission_id': '1', + 'success': True, + 'rubric_scores': [0], + 'rubric_scores_complete': True, + 'rubric_xml': etree.tostring(self.rubric) + } get = {'queuekey': "abcd", - 'xqueue_body': json.dumps(score_msg)} + 'xqueue_body': json.dumps(score_msg)} self.openendedmodule.update_score(get, self.test_system) def test_latest_post_assessment(self): @@ -296,18 +291,18 @@ class CombinedOpenEndedModuleTest(unittest.TestCase): metadata = {'attempts': '10', 'max_score': max_score} static_data = { - 'max_attempts': 20, - 'prompt': prompt, - 'rubric': rubric, - 'max_score': max_score, - 'display_name': 'Name', - 'accept_file_upload' : False, - 'rewrite_content_links' : "", - 'close_date' : "", - 's3_interface' : test_util_open_ended.S3_INTERFACE, - 'open_ended_grading_interface' : test_util_open_ended.OPEN_ENDED_GRADING_INTERFACE, - 'skip_basic_checks' : False, - } + 'max_attempts': 20, + 'prompt': prompt, + 'rubric': rubric, + 'max_score': max_score, + 'display_name': 'Name', + 'accept_file_upload': False, + 'rewrite_content_links': "", + 'close_date': "", + 's3_interface': test_util_open_ended.S3_INTERFACE, + 'open_ended_grading_interface': test_util_open_ended.OPEN_ENDED_GRADING_INTERFACE, + 'skip_basic_checks': False, + } oeparam = etree.XML(''' @@ -329,23 +324,23 @@ class CombinedOpenEndedModuleTest(unittest.TestCase): ''' task_xml2 = ''' - - Enter essay here. - This is the answer. - {"grader_settings" : "ml_grading.conf", "problem_id" : "6.002x/Welcome/OETest"} - - ''' + + Enter essay here. + This is the answer. + {"grader_settings" : "ml_grading.conf", "problem_id" : "6.002x/Welcome/OETest"} + + ''' definition = {'prompt': etree.XML(prompt), 'rubric': etree.XML(rubric), 'task_xml': [task_xml1, task_xml2]} descriptor = Mock() def setUp(self): self.test_system = test_system() - self.combinedoe = CombinedOpenEndedV1Module(self.test_system, - self.location, - self.definition, - self.descriptor, - static_data = self.static_data, - metadata=self.metadata) + self.combinedoe = CombinedOpenEndedV1Module(self.test_system, + self.location, + self.definition, + self.descriptor, + static_data=self.static_data, + metadata=self.metadata) def test_get_tag_name(self): name = self.combinedoe.get_tag_name("Tag") diff --git a/common/lib/xmodule/xmodule/tests/test_self_assessment.py b/common/lib/xmodule/xmodule/tests/test_self_assessment.py index 362b73df67..a7f2a9fdfe 100644 --- a/common/lib/xmodule/xmodule/tests/test_self_assessment.py +++ b/common/lib/xmodule/xmodule/tests/test_self_assessment.py @@ -10,8 +10,8 @@ from . import test_system import test_util_open_ended -class SelfAssessmentTest(unittest.TestCase): +class SelfAssessmentTest(unittest.TestCase): rubric = ''' Response Quality @@ -24,7 +24,7 @@ class SelfAssessmentTest(unittest.TestCase): 'prompt': prompt, 'submitmessage': 'Shall we submit now?', 'hintprompt': 'Consider this...', - } + } location = Location(["i4x", "edX", "sa_test", "selfassessment", "SampleQuestion"]) @@ -41,22 +41,22 @@ class SelfAssessmentTest(unittest.TestCase): 'attempts': 2}) static_data = { - 'max_attempts': 10, - 'rubric': etree.XML(self.rubric), - 'prompt': self.prompt, - 'max_score': 1, - 'display_name': "Name", - 'accept_file_upload': False, - 'close_date': None, - 's3_interface' : test_util_open_ended.S3_INTERFACE, - 'open_ended_grading_interface' : test_util_open_ended.OPEN_ENDED_GRADING_INTERFACE, - 'skip_basic_checks' : False, - } + 'max_attempts': 10, + 'rubric': etree.XML(self.rubric), + 'prompt': self.prompt, + 'max_score': 1, + 'display_name': "Name", + 'accept_file_upload': False, + 'close_date': None, + 's3_interface': test_util_open_ended.S3_INTERFACE, + 'open_ended_grading_interface': test_util_open_ended.OPEN_ENDED_GRADING_INTERFACE, + 'skip_basic_checks': False, + } self.module = SelfAssessmentModule(test_system(), self.location, - self.definition, self.descriptor, - static_data, - state, metadata=self.metadata) + self.definition, self.descriptor, + static_data, + state, metadata=self.metadata) def test_get_html(self): html = self.module.get_html(self.module.system) @@ -64,14 +64,15 @@ class SelfAssessmentTest(unittest.TestCase): def test_self_assessment_flow(self): responses = {'assessment': '0', 'score_list[]': ['0', '0']} + def get_fake_item(name): return responses[name] - def get_data_for_location(self,location,student): + def get_data_for_location(self, location, student): return { - 'count_graded' : 0, - 'count_required' : 0, - 'student_sub_count': 0, + 'count_graded': 0, + 'count_required': 0, + 'student_sub_count': 0, } mock_query_dict = MagicMock() @@ -82,20 +83,19 @@ class SelfAssessmentTest(unittest.TestCase): self.assertEqual(self.module.get_score()['score'], 0) - self.module.save_answer({'student_answer': "I am an answer"}, + self.module.save_answer({'student_answer': "I am an answer"}, self.module.system) self.assertEqual(self.module.state, self.module.ASSESSING) self.module.save_assessment(mock_query_dict, self.module.system) self.assertEqual(self.module.state, self.module.DONE) - d = self.module.reset({}) self.assertTrue(d['success']) self.assertEqual(self.module.state, self.module.INITIAL) # if we now assess as right, skip the REQUEST_HINT state - self.module.save_answer({'student_answer': 'answer 4'}, + self.module.save_answer({'student_answer': 'answer 4'}, self.module.system) responses['assessment'] = '1' self.module.save_assessment(mock_query_dict, self.module.system) diff --git a/common/lib/xmodule/xmodule/tests/test_util_open_ended.py b/common/lib/xmodule/xmodule/tests/test_util_open_ended.py index 8d1fcd30ce..db580f1e0e 100644 --- a/common/lib/xmodule/xmodule/tests/test_util_open_ended.py +++ b/common/lib/xmodule/xmodule/tests/test_util_open_ended.py @@ -1,14 +1,14 @@ OPEN_ENDED_GRADING_INTERFACE = { - 'url' : 'http://127.0.0.1:3033/', - 'username' : 'incorrect', - 'password' : 'incorrect', - 'staff_grading' : 'staff_grading', - 'peer_grading' : 'peer_grading', - 'grading_controller' : 'grading_controller' + 'url': 'http://127.0.0.1:3033/', + 'username': 'incorrect', + 'password': 'incorrect', + 'staff_grading': 'staff_grading', + 'peer_grading': 'peer_grading', + 'grading_controller': 'grading_controller' } S3_INTERFACE = { - 'aws_access_key' : "", - 'aws_secret_key' : "", - "aws_bucket_name" : "", + 'aws_access_key': "", + 'aws_secret_key': "", + "aws_bucket_name": "", } \ No newline at end of file diff --git a/lms/djangoapps/open_ended_grading/open_ended_notifications.py b/lms/djangoapps/open_ended_grading/open_ended_notifications.py index b4ca20079f..d67e2816d5 100644 --- a/lms/djangoapps/open_ended_grading/open_ended_notifications.py +++ b/lms/djangoapps/open_ended_grading/open_ended_notifications.py @@ -22,7 +22,7 @@ NOTIFICATION_TYPES = ( ('staff_needs_to_grade', 'staff_grading', 'Staff Grading'), ('new_student_grading_to_view', 'open_ended_problems', 'Problems you have submitted'), ('flagged_submissions_exist', 'open_ended_flagged_problems', 'Flagged Submissions') - ) +) def staff_grading_notifications(course, user): @@ -46,7 +46,9 @@ def staff_grading_notifications(course, user): #Non catastrophic error, so no real action notifications = {} #This is a dev_facing_error - log.info("Problem with getting notifications from staff grading service for course {0} user {1}.".format(course_id, student_id)) + log.info( + "Problem with getting notifications from staff grading service for course {0} user {1}.".format(course_id, + student_id)) if pending_grading: img_path = "/static/images/grading_notification.png" @@ -80,7 +82,9 @@ def peer_grading_notifications(course, user): #Non catastrophic error, so no real action notifications = {} #This is a dev_facing_error - log.info("Problem with getting notifications from peer grading service for course {0} user {1}.".format(course_id, student_id)) + log.info( + "Problem with getting notifications from peer grading service for course {0} user {1}.".format(course_id, + student_id)) if pending_grading: img_path = "/static/images/grading_notification.png" @@ -105,7 +109,9 @@ def combined_notifications(course, user): return notification_dict min_time_to_query = user.last_login - last_module_seen = StudentModule.objects.filter(student=user, course_id=course_id, modified__gt=min_time_to_query).values('modified').order_by('-modified') + last_module_seen = StudentModule.objects.filter(student=user, course_id=course_id, + modified__gt=min_time_to_query).values('modified').order_by( + '-modified') last_module_seen_count = last_module_seen.count() if last_module_seen_count > 0: @@ -117,7 +123,8 @@ def combined_notifications(course, user): img_path = "" try: - controller_response = controller_qs.check_combined_notifications(course.id, student_id, user_is_staff, last_time_viewed) + controller_response = controller_qs.check_combined_notifications(course.id, student_id, user_is_staff, + last_time_viewed) log.debug(controller_response) notifications = json.loads(controller_response) if notifications['success']: @@ -127,7 +134,9 @@ def combined_notifications(course, user): #Non catastrophic error, so no real action notifications = {} #This is a dev_facing_error - log.exception("Problem with getting notifications from controller query service for course {0} user {1}.".format(course_id, student_id)) + log.exception( + "Problem with getting notifications from controller query service for course {0} user {1}.".format( + course_id, student_id)) if pending_grading: img_path = "/static/images/grading_notification.png" @@ -151,7 +160,8 @@ def set_value_in_cache(student_id, course_id, notification_type, value): def create_key_name(student_id, course_id, notification_type): - key_name = "{prefix}{type}_{course}_{student}".format(prefix=KEY_PREFIX, type=notification_type, course=course_id, student=student_id) + key_name = "{prefix}{type}_{course}_{student}".format(prefix=KEY_PREFIX, type=notification_type, course=course_id, + student=student_id) return key_name diff --git a/lms/djangoapps/open_ended_grading/staff_grading.py b/lms/djangoapps/open_ended_grading/staff_grading.py index e39b26da56..fad5268294 100644 --- a/lms/djangoapps/open_ended_grading/staff_grading.py +++ b/lms/djangoapps/open_ended_grading/staff_grading.py @@ -15,6 +15,7 @@ class StaffGrading(object): """ Wrap up functionality for staff grading of submissions--interface exposes get_html, ajax views. """ + def __init__(self, course): self.course = course diff --git a/lms/djangoapps/open_ended_grading/staff_grading_service.py b/lms/djangoapps/open_ended_grading/staff_grading_service.py index 79b92dffba..91138bf685 100644 --- a/lms/djangoapps/open_ended_grading/staff_grading_service.py +++ b/lms/djangoapps/open_ended_grading/staff_grading_service.py @@ -20,10 +20,12 @@ log = logging.getLogger(__name__) STAFF_ERROR_MESSAGE = 'Could not contact the external grading server. Please contact the development team. If you do not have a point of contact, you can contact Vik at vik@edx.org.' + class MockStaffGradingService(object): """ A simple mockup of a staff grading service, testing. """ + def __init__(self): self.cnt = 0 @@ -43,15 +45,18 @@ class MockStaffGradingService(object): def get_problem_list(self, course_id, grader_id): self.cnt += 1 return json.dumps({'success': True, - 'problem_list': [ - json.dumps({'location': 'i4x://MITx/3.091x/problem/open_ended_demo1', - 'problem_name': "Problem 1", 'num_graded': 3, 'num_pending': 5, 'min_for_ml': 10}), - json.dumps({'location': 'i4x://MITx/3.091x/problem/open_ended_demo2', - 'problem_name': "Problem 2", 'num_graded': 1, 'num_pending': 5, 'min_for_ml': 10}) - ]}) + 'problem_list': [ + json.dumps({'location': 'i4x://MITx/3.091x/problem/open_ended_demo1', + 'problem_name': "Problem 1", 'num_graded': 3, 'num_pending': 5, + 'min_for_ml': 10}), + json.dumps({'location': 'i4x://MITx/3.091x/problem/open_ended_demo2', + 'problem_name': "Problem 2", 'num_graded': 1, 'num_pending': 5, + 'min_for_ml': 10}) + ]}) - def save_grade(self, course_id, grader_id, submission_id, score, feedback, skipped, rubric_scores, submission_flagged): + def save_grade(self, course_id, grader_id, submission_id, score, feedback, skipped, rubric_scores, + submission_flagged): return self.get_next(course_id, 'fake location', grader_id) @@ -59,6 +64,7 @@ class StaffGradingService(GradingService): """ Interface to staff grading backend. """ + def __init__(self, config): config['system'] = ModuleSystem(None, None, None, render_to_string, None) super(StaffGradingService, self).__init__(config) @@ -109,12 +115,13 @@ class StaffGradingService(GradingService): GradingServiceError: something went wrong with the connection. """ response = self.get(self.get_next_url, - params={'location': location, - 'grader_id': grader_id}) + params={'location': location, + 'grader_id': grader_id}) return json.dumps(self._render_rubric(response)) - def save_grade(self, course_id, grader_id, submission_id, score, feedback, skipped, rubric_scores, submission_flagged): + def save_grade(self, course_id, grader_id, submission_id, score, feedback, skipped, rubric_scores, + submission_flagged): """ Save a score and feedback for a submission. @@ -253,14 +260,14 @@ def get_problem_list(request, course_id): try: response = staff_grading_service().get_problem_list(course_id, unique_id_for_user(request.user)) return HttpResponse(response, - mimetype="application/json") + mimetype="application/json") except GradingServiceError: #This is a dev_facing_error log.exception("Error from staff grading service in open ended grading. server url: {0}" - .format(staff_grading_service().url)) + .format(staff_grading_service().url)) #This is a staff_facing_error return HttpResponse(json.dumps({'success': False, - 'error': STAFF_ERROR_MESSAGE})) + 'error': STAFF_ERROR_MESSAGE})) def _get_next(course_id, grader_id, location): @@ -272,7 +279,7 @@ def _get_next(course_id, grader_id, location): except GradingServiceError: #This is a dev facing error log.exception("Error from staff grading service in open ended grading. server url: {0}" - .format(staff_grading_service().url)) + .format(staff_grading_service().url)) #This is a staff_facing_error return json.dumps({'success': False, 'error': STAFF_ERROR_MESSAGE}) @@ -297,7 +304,7 @@ def save_grade(request, course_id): if request.method != 'POST': raise Http404 - required = set(['score', 'feedback', 'submission_id', 'location','submission_flagged', 'rubric_scores[]']) + required = set(['score', 'feedback', 'submission_id', 'location', 'submission_flagged', 'rubric_scores[]']) actual = set(request.POST.keys()) missing = required - actual if len(missing) > 0: @@ -307,22 +314,23 @@ def save_grade(request, course_id): grader_id = unique_id_for_user(request.user) p = request.POST - location = p['location'] - skipped = 'skipped' in p + skipped = 'skipped' in p try: result_json = staff_grading_service().save_grade(course_id, - grader_id, - p['submission_id'], - p['score'], - p['feedback'], - skipped, - p.getlist('rubric_scores[]'), - p['submission_flagged']) + grader_id, + p['submission_id'], + p['score'], + p['feedback'], + skipped, + p.getlist('rubric_scores[]'), + p['submission_flagged']) except GradingServiceError: #This is a dev_facing_error - log.exception("Error saving grade in the staff grading interface in open ended grading. Request: {0} Course ID: {1}".format(request, course_id)) + log.exception( + "Error saving grade in the staff grading interface in open ended grading. Request: {0} Course ID: {1}".format( + request, course_id)) #This is a staff_facing_error return _err_response(STAFF_ERROR_MESSAGE) @@ -330,13 +338,16 @@ def save_grade(request, course_id): result = json.loads(result_json) except ValueError: #This is a dev_facing_error - log.exception("save_grade returned broken json in the staff grading interface in open ended grading: {0}".format(result_json)) + log.exception( + "save_grade returned broken json in the staff grading interface in open ended grading: {0}".format( + result_json)) #This is a staff_facing_error return _err_response(STAFF_ERROR_MESSAGE) if not result.get('success', False): #This is a dev_facing_error - log.warning('Got success=False from staff grading service in open ended grading. Response: {0}'.format(result_json)) + log.warning( + 'Got success=False from staff grading service in open ended grading. Response: {0}'.format(result_json)) return _err_response(STAFF_ERROR_MESSAGE) # Ok, save_grade seemed to work. Get the next submission to grade. diff --git a/lms/djangoapps/open_ended_grading/tests.py b/lms/djangoapps/open_ended_grading/tests.py index d452883ebb..64123605ce 100644 --- a/lms/djangoapps/open_ended_grading/tests.py +++ b/lms/djangoapps/open_ended_grading/tests.py @@ -7,7 +7,7 @@ django-admin.py test --settings=lms.envs.test --pythonpath=. lms/djangoapps/open from django.test import TestCase from open_ended_grading import staff_grading_service from xmodule.open_ended_grading_classes import peer_grading_service -from xmodule import peer_grading_module +from xmodule import peer_grading_module from django.core.urlresolvers import reverse from django.contrib.auth.models import Group @@ -22,6 +22,7 @@ from xmodule.x_module import ModuleSystem from mitxmako.shortcuts import render_to_string import logging + log = logging.getLogger(__name__) from django.test.utils import override_settings from django.http import QueryDict @@ -36,6 +37,7 @@ class TestStaffGradingService(ct.PageLoader): access control and error handling logic -- all the actual work is on the backend. ''' + def setUp(self): xmodule.modulestore.django._MODULESTORES = {} @@ -50,6 +52,7 @@ class TestStaffGradingService(ct.PageLoader): self.course_id = "edX/toy/2012_Fall" self.toy = modulestore().get_course(self.course_id) + def make_instructor(course): group_name = _course_staff_group_name(course.location) g = Group.objects.create(name=group_name) @@ -130,6 +133,7 @@ class TestPeerGradingService(ct.PageLoader): access control and error handling logic -- all the actual work is on the backend. ''' + def setUp(self): xmodule.modulestore.django._MODULESTORES = {} @@ -148,11 +152,12 @@ class TestPeerGradingService(ct.PageLoader): self.mock_service = peer_grading_service.MockPeerGradingService() self.system = ModuleSystem(location, None, None, render_to_string, None, - s3_interface = test_util_open_ended.S3_INTERFACE, - open_ended_grading_interface=test_util_open_ended.OPEN_ENDED_GRADING_INTERFACE + s3_interface=test_util_open_ended.S3_INTERFACE, + open_ended_grading_interface=test_util_open_ended.OPEN_ENDED_GRADING_INTERFACE ) self.descriptor = peer_grading_module.PeerGradingDescriptor(self.system) - self.peer_module = peer_grading_module.PeerGradingModule(self.system, location, "", self.descriptor) + self.peer_module = peer_grading_module.PeerGradingModule(self.system, location, "", + self.descriptor) self.peer_module.peer_gs = self.mock_service self.logout() @@ -175,18 +180,20 @@ class TestPeerGradingService(ct.PageLoader): def test_save_grade_success(self): data = { - 'rubric_scores[]': [0, 0], - 'location': self.location, - 'submission_id': 1, - 'submission_key': 'fake key', - 'score': 2, - 'feedback': 'feedback', - 'submission_flagged': 'false' - } + 'rubric_scores[]': [0, 0], + 'location': self.location, + 'submission_id': 1, + 'submission_key': 'fake key', + 'score': 2, + 'feedback': 'feedback', + 'submission_flagged': 'false' + } qdict = MagicMock() + def fake_get_item(key): return data[key] + qdict.__getitem__.side_effect = fake_get_item qdict.getlist = fake_get_item qdict.keys = data.keys @@ -237,18 +244,20 @@ class TestPeerGradingService(ct.PageLoader): def test_save_calibration_essay_success(self): data = { - 'rubric_scores[]': [0, 0], - 'location': self.location, - 'submission_id': 1, - 'submission_key': 'fake key', - 'score': 2, - 'feedback': 'feedback', - 'submission_flagged': 'false' - } + 'rubric_scores[]': [0, 0], + 'location': self.location, + 'submission_id': 1, + 'submission_key': 'fake key', + 'score': 2, + 'feedback': 'feedback', + 'submission_flagged': 'false' + } qdict = MagicMock() + def fake_get_item(key): return data[key] + qdict.__getitem__.side_effect = fake_get_item qdict.getlist = fake_get_item qdict.keys = data.keys diff --git a/lms/djangoapps/open_ended_grading/views.py b/lms/djangoapps/open_ended_grading/views.py index 55e8088c3f..2e7f429429 100644 --- a/lms/djangoapps/open_ended_grading/views.py +++ b/lms/djangoapps/open_ended_grading/views.py @@ -50,22 +50,24 @@ def _reverse_without_slash(url_name, course_id): ajax_url = reverse(url_name, kwargs={'course_id': course_id}) return ajax_url + DESCRIPTION_DICT = { - 'Peer Grading': "View all problems that require peer assessment in this particular course.", - 'Staff Grading': "View ungraded submissions submitted by students for the open ended problems in the course.", - 'Problems you have submitted': "View open ended problems that you have previously submitted for grading.", - 'Flagged Submissions': "View submissions that have been flagged by students as inappropriate." - } + 'Peer Grading': "View all problems that require peer assessment in this particular course.", + 'Staff Grading': "View ungraded submissions submitted by students for the open ended problems in the course.", + 'Problems you have submitted': "View open ended problems that you have previously submitted for grading.", + 'Flagged Submissions': "View submissions that have been flagged by students as inappropriate." +} ALERT_DICT = { - 'Peer Grading': "New submissions to grade", - 'Staff Grading': "New submissions to grade", - 'Problems you have submitted': "New grades have been returned", - 'Flagged Submissions': "Submissions have been flagged for review" - } + 'Peer Grading': "New submissions to grade", + 'Staff Grading': "New submissions to grade", + 'Problems you have submitted': "New grades have been returned", + 'Flagged Submissions': "Submissions have been flagged for review" +} STUDENT_ERROR_MESSAGE = "Error occured while contacting the grading service. Please notify course staff." STAFF_ERROR_MESSAGE = "Error occured while contacting the grading service. Please notify the development team. If you do not have a point of contact, please email Vik at vik@edx.org" + @cache_control(no_cache=True, no_store=True, must_revalidate=True) def staff_grading(request, course_id): """ @@ -92,10 +94,10 @@ def peer_grading(request, course_id): #Get the current course course = get_course_with_access(request.user, course_id, 'load') course_id_parts = course.id.split("/") - false_dict = [False,"False", "false", "FALSE"] + false_dict = [False, "False", "false", "FALSE"] #Reverse the base course url - base_course_url = reverse('courses') + base_course_url = reverse('courses') try: #TODO: This will not work with multiple runs of a course. Make it work. The last key in the Location passed #to get_items is called revision. Is this the same as run? @@ -147,7 +149,7 @@ def student_problem_list(request, course_id): success = False error_text = "" problem_list = [] - base_course_url = reverse('courses') + base_course_url = reverse('courses') try: problem_list_json = controller_qs.get_grading_status_list(course_id, unique_id_for_user(request.user)) @@ -174,7 +176,7 @@ def student_problem_list(request, course_id): except: #This is a student_facing_error eta_string = "Error getting ETA." - problem_list[i].update({'eta_string' : eta_string}) + problem_list[i].update({'eta_string': eta_string}) except GradingServiceError: #This is a student_facing_error @@ -215,7 +217,7 @@ def flagged_problem_list(request, course_id): success = False error_text = "" problem_list = [] - base_course_url = reverse('courses') + base_course_url = reverse('courses') try: problem_list_json = controller_qs.get_flagged_problem_list(course_id) @@ -243,14 +245,14 @@ def flagged_problem_list(request, course_id): ajax_url = _reverse_with_slash('open_ended_flagged_problems', course_id) context = { - 'course': course, - 'course_id': course_id, - 'ajax_url': ajax_url, - 'success': success, - 'problem_list': problem_list, - 'error_text': error_text, - # Checked above - 'staff_access': True, + 'course': course, + 'course_id': course_id, + 'ajax_url': ajax_url, + 'success': success, + 'problem_list': problem_list, + 'error_text': error_text, + # Checked above + 'staff_access': True, } return render_to_response('open_ended_problems/open_ended_flagged_problems.html', context) @@ -305,7 +307,7 @@ def combined_notifications(request, course_id): } return render_to_response('open_ended_problems/combined_notifications.html', - combined_dict + combined_dict ) @@ -318,13 +320,14 @@ def take_action_on_flags(request, course_id): if request.method != 'POST': raise Http404 - required = ['submission_id', 'action_type', 'student_id'] for key in required: if key not in request.POST: #This is a staff_facing_error - return HttpResponse(json.dumps({'success': False, 'error': STAFF_ERROR_MESSAGE + 'Missing key {0} from submission. Please reload and try again.'.format(key)}), - mimetype="application/json") + return HttpResponse(json.dumps({'success': False, + 'error': STAFF_ERROR_MESSAGE + 'Missing key {0} from submission. Please reload and try again.'.format( + key)}), + mimetype="application/json") p = request.POST submission_id = p['submission_id'] @@ -338,5 +341,7 @@ def take_action_on_flags(request, course_id): return HttpResponse(response, mimetype="application/json") except GradingServiceError: #This is a dev_facing_error - log.exception("Error taking action on flagged peer grading submissions, submission_id: {0}, action_type: {1}, grader_id: {2}".format(submission_id, action_type, grader_id)) + log.exception( + "Error taking action on flagged peer grading submissions, submission_id: {0}, action_type: {1}, grader_id: {2}".format( + submission_id, action_type, grader_id)) return _err_response(STAFF_ERROR_MESSAGE) From fe0447093c0b32fb2ab00f0ac52079d8c733983a Mon Sep 17 00:00:00 2001 From: Brian Wilson Date: Tue, 12 Mar 2013 14:00:18 -0400 Subject: [PATCH 51/60] add management command to regrade partial-credit problems affected by get_npoints bug. --- .../management/commands/regrade_partial.py | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 lms/djangoapps/courseware/management/commands/regrade_partial.py diff --git a/lms/djangoapps/courseware/management/commands/regrade_partial.py b/lms/djangoapps/courseware/management/commands/regrade_partial.py new file mode 100644 index 0000000000..7bfcb16913 --- /dev/null +++ b/lms/djangoapps/courseware/management/commands/regrade_partial.py @@ -0,0 +1,90 @@ +import json +import logging +from optparse import make_option + +from django.core.management.base import BaseCommand # , CommandError + +from courseware.models import StudentModule +from capa.correctmap import CorrectMap + +# +# This is aimed at fixing a temporary problem encountered where partial credit was awarded for +# code problems, but the resulting score (or grade) was mistakenly set to zero +# because of a bug in CorrectMap.get_npoints(). +# +# The fix here is to recalculate the score/grade based on the partial credit. +# To narrow down the set of problems that might need fixing, the StudentModule +# objects to be checked is filtered down to those: +# +# grade=0.0 (the grade must have been zeroed out) +# created < '2013-03-08 05:19:00' (the problem must have been answered before the fix was installed) +# modified > '2013-03-07 20:18:00' (the problem must have been visited after the bug was introduced) +# state like '%"npoints": 0.%' (the problem must have some form of partial credit). +# + +log = logging.getLogger(__name__) + +class Command(BaseCommand): + + num_visited = 0 + num_changed = 0 + + option_list = BaseCommand.option_list + ( + make_option('--save', + action='store_true', + dest='save_changes', + default=False, + help='Persist the changes that were encountered. If not set, no changes are saved.'), ) + + def fix_studentmodules(self, save_changes): + modules = StudentModule.objects.filter(# module_type='problem', + modified__gt='2013-03-07 20:18:00', + created__lt='2013-03-08 05:19:00', + state__contains='"npoints": 0.', + grade=0.0) + for module in modules: + self.fix_studentmodule(module, save_changes) + + def fix_studentmodule(self, module, save_changes): + module_state = module.state + if module_state is None: + log.info("No state found for {type} module {id} for student {student} in course {course_id}".format( + **{'type':module.module_type, 'id':module.module_state_key, 'student':module.student.username, 'course_id':module.course_id})) + return + + state_dict = json.loads(module_state) + self.num_visited += 1 + + correct_map = CorrectMap() + if 'correct_map' in state_dict: + correct_map.set_dict(state_dict['correct_map']) + + correct = 0 + for key in correct_map: + correct += correct_map.get_npoints(key) + + if module.grade == correct: + log.info("Grade matches for {type} module {id} for student {student} in course {course_id}".format( + **{'type':module.module_type, 'id':module.module_state_key, 'student':module.student.username, 'course_id':module.course_id})) + elif save_changes: + log.info("Grade changing from {0} to {1} for {type} module {id} for student {student} in course {course_id}".format( + module.grade, correct, + **{'type':module.module_type, 'id':module.module_state_key, 'student':module.student.username, 'course_id':module.course_id})) + module.grade = correct + module.save() + self.num_changed += 1 + else: + log.info("Grade would change from {0} to {1} for {type} module {id} for student {student} in course {course_id}".format( + module.grade, correct, + **{'type':module.module_type, 'id':module.module_state_key, 'student':module.student.username, 'course_id':module.course_id})) + self.num_changed += 1 + + def handle(self, **options): + save_changes = 'save_changes' in options and options['save_changes'] + + log.info("Starting run: save_changes = {0}".format(save_changes)) + + self.fix_studentmodules(save_changes) + + log.info("Finished run: updating {0} of {1} modules".format(self.num_changed, self.num_visited)) + From c40ab310c3310a0be8e718afa3e913dcc0212082 Mon Sep 17 00:00:00 2001 From: Vik Paruchuri Date: Tue, 12 Mar 2013 14:24:42 -0400 Subject: [PATCH 52/60] Blank line fixes --- .../combined_open_ended_rubric.py | 8 -------- .../open_ended_grading_classes/open_ended_module.py | 3 --- .../xmodule/open_ended_grading_classes/openendedchild.py | 3 --- .../open_ended_grading_classes/self_assessment_module.py | 2 -- 4 files changed, 16 deletions(-) diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_rubric.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_rubric.py index f4ea7648a1..287aeb5c24 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_rubric.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_rubric.py @@ -133,7 +133,6 @@ class CombinedOpenEndedRubric(object): categories.append(self.extract_category(category)) return categories - def extract_category(self, category): ''' construct an individual category @@ -235,7 +234,6 @@ class CombinedOpenEndedRubric(object): }) return html - @staticmethod def validate_options(options): ''' @@ -328,9 +326,3 @@ class CombinedOpenEndedRubric(object): tuples.append([0, category, score, [], []]) tup_ind = len(tuples) - 1 return tuples, tup_ind - - - - - - diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py index b16e7f5313..fc53a62c06 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/open_ended_module.py @@ -77,7 +77,6 @@ class OpenEndedModule(openendedchild.OpenEndedChild): self.send_to_grader(self.latest_answer(), system) self.created = False - def _parse(self, oeparam, prompt, rubric, system): ''' Parse OpenEndedResponse XML: @@ -270,7 +269,6 @@ class OpenEndedModule(openendedchild.OpenEndedChild): return True - def get_answers(self): """ Gets and shows the answer for this problem. @@ -415,7 +413,6 @@ class OpenEndedModule(openendedchild.OpenEndedChild): return feedback_template, rubric_scores - def _parse_score_msg(self, score_msg, system, join_feedback=True): """ Grader reply is a JSON-dump of the following dict diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py index 91dec5943d..922a4f9b77 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py @@ -490,6 +490,3 @@ class OpenEndedChild(object): eta_string = "" return eta_string - - - diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/self_assessment_module.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/self_assessment_module.py index a25d81eeae..8911e2890f 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/self_assessment_module.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/self_assessment_module.py @@ -73,7 +73,6 @@ class SelfAssessmentModule(openendedchild.OpenEndedChild): html = system.render_template('{0}/self_assessment_prompt.html'.format(self.TEMPLATE_DIR), context) return html - def handle_ajax(self, dispatch, get, system): """ This is called by courseware.module_render, to handle an AJAX call. @@ -159,7 +158,6 @@ class SelfAssessmentModule(openendedchild.OpenEndedChild): return system.render_template('{0}/self_assessment_hint.html'.format(self.TEMPLATE_DIR), context) - def save_answer(self, get, system): """ After the answer is submitted, show the rubric. From 70af75e8525f6d0e9cdfe1ec39396c0852528d86 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 12 Mar 2013 14:34:39 -0400 Subject: [PATCH 53/60] Don't run pylint on migrations, and it's ok to have a global name 'log' --- .pylintrc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pylintrc b/.pylintrc index ce2f2e3b87..4357885133 100644 --- a/.pylintrc +++ b/.pylintrc @@ -12,7 +12,7 @@ profile=no # Add files or directories to the blacklist. They should be base names, not # paths. -ignore=CVS +ignore=CVS, migrations # Pickle collected data for later comparisons. persistent=yes @@ -43,7 +43,7 @@ disable=E1102,W0142 output-format=text # Include message's id in output -include-ids=no +include-ids=yes # Put messages in a separate file for each module / package specified on the # command line instead of printing them on stdout. Reports (if any) will be @@ -97,7 +97,7 @@ bad-functions=map,filter,apply,input module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Regular expression which should only match correct module level names -const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ +const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__)|log)$ # Regular expression which should only match correct class names class-rgx=[A-Z_][a-zA-Z0-9]+$ From 6aed059d5ff70e18335cf7e12e3a5812108060a4 Mon Sep 17 00:00:00 2001 From: Brian Wilson Date: Tue, 12 Mar 2013 14:55:27 -0400 Subject: [PATCH 54/60] Change date and remove filtering by grade. Add check for student_answers. --- .../management/commands/regrade_partial.py | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/lms/djangoapps/courseware/management/commands/regrade_partial.py b/lms/djangoapps/courseware/management/commands/regrade_partial.py index 7bfcb16913..b997cff674 100644 --- a/lms/djangoapps/courseware/management/commands/regrade_partial.py +++ b/lms/djangoapps/courseware/management/commands/regrade_partial.py @@ -16,8 +16,7 @@ from capa.correctmap import CorrectMap # To narrow down the set of problems that might need fixing, the StudentModule # objects to be checked is filtered down to those: # -# grade=0.0 (the grade must have been zeroed out) -# created < '2013-03-08 05:19:00' (the problem must have been answered before the fix was installed) +# created < '2013-03-08 15:45:00' (the problem must have been answered before the fix was installed, on Prod and Edge) # modified > '2013-03-07 20:18:00' (the problem must have been visited after the bug was introduced) # state like '%"npoints": 0.%' (the problem must have some form of partial credit). # @@ -39,15 +38,16 @@ class Command(BaseCommand): def fix_studentmodules(self, save_changes): modules = StudentModule.objects.filter(# module_type='problem', modified__gt='2013-03-07 20:18:00', - created__lt='2013-03-08 05:19:00', - state__contains='"npoints": 0.', - grade=0.0) + created__lt='2013-03-08 15:45:00', + state__contains='"npoints": 0.') + for module in modules: - self.fix_studentmodule(module, save_changes) + self.fix_studentmodule_grade(module, save_changes) - def fix_studentmodule(self, module, save_changes): + def fix_studentmodule_grade(self, module, save_changes): module_state = module.state if module_state is None: + # not likely, since we filter on it. But in general... log.info("No state found for {type} module {id} for student {student} in course {course_id}".format( **{'type':module.module_type, 'id':module.module_state_key, 'student':module.student.username, 'course_id':module.course_id})) return @@ -55,32 +55,50 @@ class Command(BaseCommand): state_dict = json.loads(module_state) self.num_visited += 1 + # LoncapaProblem.get_score() checks student_answers -- if there are none, we will return a grade of 0 + # Check that this is the case, but do so sooner, before we do any of the other grading work. + student_answers = state_dict['student_answers'] + if (not student_answers) or len(student_answers) == 0: + # we should not have a grade here: + if module.grade != 0: + log.error("No answer found but grade {grade} exists for {type} module {id} for student {student} in course {course_id}".format(grade=module.grade, + type=module.module_type, id=module.module_state_key, student=module.student.username, course_id=module.course_id)) + else: + log.debug("No answer and no grade found for {type} module {id} for student {student} in course {course_id}".format(grade=module.grade, + type=module.module_type, id=module.module_state_key, student=module.student.username, course_id=module.course_id)) + return + + # load into a CorrectMap, as done in LoncapaProblem.__init__(): correct_map = CorrectMap() if 'correct_map' in state_dict: correct_map.set_dict(state_dict['correct_map']) + # calculate score the way LoncapaProblem.get_score() works, by deferring to CorrectMap's get_npoints implementation. correct = 0 for key in correct_map: correct += correct_map.get_npoints(key) if module.grade == correct: - log.info("Grade matches for {type} module {id} for student {student} in course {course_id}".format( - **{'type':module.module_type, 'id':module.module_state_key, 'student':module.student.username, 'course_id':module.course_id})) + # nothing to change + log.debug("Grade matches for {type} module {id} for student {student} in course {course_id}".format( + type=module.module_type, id=module.module_state_key, student=module.student.username, course_id=module.course_id)) elif save_changes: + # make the change log.info("Grade changing from {0} to {1} for {type} module {id} for student {student} in course {course_id}".format( module.grade, correct, - **{'type':module.module_type, 'id':module.module_state_key, 'student':module.student.username, 'course_id':module.course_id})) + type=module.module_type, id=module.module_state_key, student=module.student.username, course_id=module.course_id)) module.grade = correct module.save() self.num_changed += 1 else: + # don't make the change, but log that the change would be made log.info("Grade would change from {0} to {1} for {type} module {id} for student {student} in course {course_id}".format( module.grade, correct, - **{'type':module.module_type, 'id':module.module_state_key, 'student':module.student.username, 'course_id':module.course_id})) + type=module.module_type, id=module.module_state_key, student=module.student.username, course_id=module.course_id)) self.num_changed += 1 def handle(self, **options): - save_changes = 'save_changes' in options and options['save_changes'] + save_changes = options['save_changes'] log.info("Starting run: save_changes = {0}".format(save_changes)) From e5ee0a77eddb129efcfd4d9a7aaa28eb11d94fe9 Mon Sep 17 00:00:00 2001 From: Chris Dodge Date: Tue, 12 Mar 2013 15:24:10 -0400 Subject: [PATCH 55/60] hot fix for delete_item. The 'delete_all_versions' is useful in that it is set to true when doing explicit deletes as opposed to 'delete draft'. If delete_all_versions=False, then don't remove the deleted item from the parent children collection --- .../contentstore/tests/test_contentstore.py | 2 +- cms/djangoapps/contentstore/views.py | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cms/djangoapps/contentstore/tests/test_contentstore.py b/cms/djangoapps/contentstore/tests/test_contentstore.py index 99ef1169b1..9d533dffed 100644 --- a/cms/djangoapps/contentstore/tests/test_contentstore.py +++ b/cms/djangoapps/contentstore/tests/test_contentstore.py @@ -112,7 +112,7 @@ class ContentStoreToyCourseTest(ModuleStoreTestCase): self.assertTrue(sequential.location.url() in chapter.definition['children']) self.client.post(reverse('delete_item'), - json.dumps({'id': sequential.location.url(), 'delete_children':'true'}), + json.dumps({'id': sequential.location.url(), 'delete_children':'true', 'delete_all_versions':'true'}), "application/json") found = False diff --git a/cms/djangoapps/contentstore/views.py b/cms/djangoapps/contentstore/views.py index c2c80106fa..6566350f8d 100644 --- a/cms/djangoapps/contentstore/views.py +++ b/cms/djangoapps/contentstore/views.py @@ -643,15 +643,15 @@ def delete_item(request): modulestore('direct').delete_item(item.location) # cdodge: we need to remove our parent's pointer to us so that it is no longer dangling + if delete_all_versions: + parent_locs = modulestore('direct').get_parent_locations(item_loc, None) - parent_locs = modulestore('direct').get_parent_locations(item_loc, None) - - for parent_loc in parent_locs: - parent = modulestore('direct').get_item(parent_loc) - item_url = item_loc.url() - if item_url in parent.definition["children"]: - parent.definition["children"].remove(item_url) - modulestore('direct').update_children(parent.location, parent.definition["children"]) + for parent_loc in parent_locs: + parent = modulestore('direct').get_item(parent_loc) + item_url = item_loc.url() + if item_url in parent.definition["children"]: + parent.definition["children"].remove(item_url) + modulestore('direct').update_children(parent.location, parent.definition["children"]) return HttpResponse() From 47e708e713735fc94cb38f2096057d36cc7410e3 Mon Sep 17 00:00:00 2001 From: Brian Wilson Date: Tue, 12 Mar 2013 15:49:48 -0400 Subject: [PATCH 56/60] fix pylint and pep8 warnings --- .../management/commands/regrade_partial.py | 104 ++++++++++-------- 1 file changed, 59 insertions(+), 45 deletions(-) diff --git a/lms/djangoapps/courseware/management/commands/regrade_partial.py b/lms/djangoapps/courseware/management/commands/regrade_partial.py index b997cff674..c24f84ddfc 100644 --- a/lms/djangoapps/courseware/management/commands/regrade_partial.py +++ b/lms/djangoapps/courseware/management/commands/regrade_partial.py @@ -1,33 +1,36 @@ +''' +This is a one-off command aimed at fixing a temporary problem encountered where partial credit was awarded for +code problems, but the resulting score (or grade) was mistakenly set to zero because of a bug in +CorrectMap.get_npoints(). +''' + import json import logging from optparse import make_option -from django.core.management.base import BaseCommand # , CommandError +from django.core.management.base import BaseCommand from courseware.models import StudentModule from capa.correctmap import CorrectMap -# -# This is aimed at fixing a temporary problem encountered where partial credit was awarded for -# code problems, but the resulting score (or grade) was mistakenly set to zero -# because of a bug in CorrectMap.get_npoints(). -# -# The fix here is to recalculate the score/grade based on the partial credit. -# To narrow down the set of problems that might need fixing, the StudentModule -# objects to be checked is filtered down to those: -# -# created < '2013-03-08 15:45:00' (the problem must have been answered before the fix was installed, on Prod and Edge) -# modified > '2013-03-07 20:18:00' (the problem must have been visited after the bug was introduced) -# state like '%"npoints": 0.%' (the problem must have some form of partial credit). -# +LOG = logging.getLogger(__name__) -log = logging.getLogger(__name__) class Command(BaseCommand): - + ''' + The fix here is to recalculate the score/grade based on the partial credit. + To narrow down the set of problems that might need fixing, the StudentModule + objects to be checked is filtered down to those: + + created < '2013-03-08 15:45:00' (the problem must have been answered before the fix was installed, + on Prod and Edge) + modified > '2013-03-07 20:18:00' (the problem must have been visited after the bug was introduced) + state like '%"npoints": 0.%' (the problem must have some form of partial credit). + ''' + num_visited = 0 num_changed = 0 - + option_list = BaseCommand.option_list + ( make_option('--save', action='store_true', @@ -36,73 +39,84 @@ class Command(BaseCommand): help='Persist the changes that were encountered. If not set, no changes are saved.'), ) def fix_studentmodules(self, save_changes): - modules = StudentModule.objects.filter(# module_type='problem', - modified__gt='2013-03-07 20:18:00', + '''Identify the list of StudentModule objects that might need fixing, and then fix each one''' + modules = StudentModule.objects.filter(modified__gt='2013-03-07 20:18:00', created__lt='2013-03-08 15:45:00', state__contains='"npoints": 0.') for module in modules: self.fix_studentmodule_grade(module, save_changes) - + def fix_studentmodule_grade(self, module, save_changes): + ''' Fix the grade assigned to a StudentModule''' module_state = module.state if module_state is None: # not likely, since we filter on it. But in general... - log.info("No state found for {type} module {id} for student {student} in course {course_id}".format( - **{'type':module.module_type, 'id':module.module_state_key, 'student':module.student.username, 'course_id':module.course_id})) + LOG.info("No state found for {type} module {id} for student {student} in course {course_id}" + .format(type=module.module_type, id=module.module_state_key, + student=module.student.username, course_id=module.course_id)) return - + state_dict = json.loads(module_state) self.num_visited += 1 - + # LoncapaProblem.get_score() checks student_answers -- if there are none, we will return a grade of 0 # Check that this is the case, but do so sooner, before we do any of the other grading work. student_answers = state_dict['student_answers'] if (not student_answers) or len(student_answers) == 0: # we should not have a grade here: if module.grade != 0: - log.error("No answer found but grade {grade} exists for {type} module {id} for student {student} in course {course_id}".format(grade=module.grade, - type=module.module_type, id=module.module_state_key, student=module.student.username, course_id=module.course_id)) + LOG.error("No answer found but grade {grade} exists for {type} module {id} for student {student} " + "in course {course_id}".format(grade=module.grade, + type=module.module_type, id=module.module_state_key, + student=module.student.username, course_id=module.course_id)) else: - log.debug("No answer and no grade found for {type} module {id} for student {student} in course {course_id}".format(grade=module.grade, - type=module.module_type, id=module.module_state_key, student=module.student.username, course_id=module.course_id)) + LOG.debug("No answer and no grade found for {type} module {id} for student {student} " + "in course {course_id}".format(grade=module.grade, + type=module.module_type, id=module.module_state_key, + student=module.student.username, course_id=module.course_id)) return # load into a CorrectMap, as done in LoncapaProblem.__init__(): correct_map = CorrectMap() if 'correct_map' in state_dict: correct_map.set_dict(state_dict['correct_map']) - - # calculate score the way LoncapaProblem.get_score() works, by deferring to CorrectMap's get_npoints implementation. + + # calculate score the way LoncapaProblem.get_score() works, by deferring to + # CorrectMap's get_npoints implementation. correct = 0 for key in correct_map: correct += correct_map.get_npoints(key) - + if module.grade == correct: # nothing to change - log.debug("Grade matches for {type} module {id} for student {student} in course {course_id}".format( - type=module.module_type, id=module.module_state_key, student=module.student.username, course_id=module.course_id)) + LOG.debug("Grade matches for {type} module {id} for student {student} in course {course_id}" + .format(type=module.module_type, id=module.module_state_key, + student=module.student.username, course_id=module.course_id)) elif save_changes: # make the change - log.info("Grade changing from {0} to {1} for {type} module {id} for student {student} in course {course_id}".format( - module.grade, correct, - type=module.module_type, id=module.module_state_key, student=module.student.username, course_id=module.course_id)) + LOG.info("Grade changing from {0} to {1} for {type} module {id} for student {student} " + "in course {course_id}".format(module.grade, correct, + type=module.module_type, id=module.module_state_key, + student=module.student.username, course_id=module.course_id)) module.grade = correct module.save() self.num_changed += 1 else: # don't make the change, but log that the change would be made - log.info("Grade would change from {0} to {1} for {type} module {id} for student {student} in course {course_id}".format( - module.grade, correct, - type=module.module_type, id=module.module_state_key, student=module.student.username, course_id=module.course_id)) + LOG.info("Grade would change from {0} to {1} for {type} module {id} for student {student} " + "in course {course_id}".format(module.grade, correct, + type=module.module_type, id=module.module_state_key, + student=module.student.username, course_id=module.course_id)) self.num_changed += 1 - + def handle(self, **options): + '''Handle management command request''' + save_changes = options['save_changes'] - log.info("Starting run: save_changes = {0}".format(save_changes)) - + LOG.info("Starting run: save_changes = {0}".format(save_changes)) + self.fix_studentmodules(save_changes) - - log.info("Finished run: updating {0} of {1} modules".format(self.num_changed, self.num_visited)) - + + LOG.info("Finished run: updating {0} of {1} modules".format(self.num_changed, self.num_visited)) From 174ba0039d88e8f0b1a161b925c9ff653bb1c291 Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Tue, 12 Mar 2013 12:41:04 -0400 Subject: [PATCH 57/60] Make sure that test-requirements.txt doesn't install versions of libraries that requirements.txt has pinned, and cache pip downloads --- jenkins/test.sh | 5 ++- requirements.txt | 94 +++++++++++++++++++++---------------------- test-requirements.txt | 3 -- 3 files changed, 50 insertions(+), 52 deletions(-) diff --git a/jenkins/test.sh b/jenkins/test.sh index 3a572c9808..f8ffab29fc 100755 --- a/jenkins/test.sh +++ b/jenkins/test.sh @@ -32,10 +32,11 @@ if [ ! -d /mnt/virtualenvs/"$JOB_NAME" ]; then virtualenv /mnt/virtualenvs/"$JOB_NAME" fi +export PIP_DOWNLOAD_CACHE=/mnt/pip-cache + source /mnt/virtualenvs/"$JOB_NAME"/bin/activate pip install -q -r pre-requirements.txt -pip install -q -r test-requirements.txt -yes w | pip install -q -r requirements.txt +yes w | pip install -q -r test-requirements.txt -r requirements.txt rake clobber rake pep8 diff --git a/requirements.txt b/requirements.txt index 204ec85889..3dc732e013 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,61 +1,61 @@ -django==1.4.3 -pip -numpy==1.6.2 -scipy==0.11.0 -Markdown==2.2.1 -pygments==1.5 -lxml==3.0.1 -boto==2.6.0 -mako==0.7.3 -python-memcached==1.48 -python-openid==2.2.5 -path.py -django_debug_toolbar -fs==0.4.0 -beautifulsoup==3.2.1 +-r repo-requirements.txt beautifulsoup4==4.1.3 -feedparser==5.1.3 -requests==0.14.2 -http://sympy.googlecode.com/files/sympy-0.7.1.tar.gz -newrelic==1.8.0.13 -glob2==0.3 -pymongo==2.4.1 -django_nose==1.1 -nosexcover==1.0.7 -rednose==0.3.3 -GitPython==0.3.2.RC1 -mock==0.8.0 -PyYAML==3.10 -South==0.7.6 -pytz==2012h +beautifulsoup==3.2.1 +boto==2.6.0 django-celery==3.0.11 django-countries==1.5 -django-kombu==0.9.4 +django-debug-toolbar-mongo django-followit==0.0.3 django-jasmine==0.3.2 django-keyedcache==1.4-6 +django-kombu==0.9.4 django-mako==0.1.5pre django-masquerade==0.1.6 +django-mptt==0.5.5 django-openid-auth==0.4 django-robots==0.9.1 +django-sekizai==0.6.1 django-ses==0.4.1 django-storages==1.1.5 django-threaded-multihost==1.4-1 -django-sekizai==0.6.1 -django-mptt==0.5.5 -sorl-thumbnail==11.12 -networkx==1.7 -pygraphviz==1.1 --r repo-requirements.txt -nltk==2.0.4 -django-debug-toolbar-mongo -dogstatsd-python==0.2.1 -MySQL-python==1.2.4c1 -sphinx==1.1.3 -factory_boy -Shapely==1.2.16 -ipython==0.13.1 -xmltodict==0.4.1 -paramiko==1.9.0 -Pillow==1.7.8 +django==1.4.3 +django_debug_toolbar +django_nose==1.1 dogapi==1.2.1 +dogstatsd-python==0.2.1 +factory_boy +feedparser==5.1.3 +fs==0.4.0 +GitPython==0.3.2.RC1 +glob2==0.3 +http://sympy.googlecode.com/files/sympy-0.7.1.tar.gz +ipython==0.13.1 +lxml==3.0.1 +mako==0.7.3 +Markdown==2.2.1 +mock==0.8.0 +MySQL-python==1.2.4c1 +networkx==1.7 +newrelic==1.8.0.13 +nltk==2.0.4 +nosexcover==1.0.7 +numpy==1.6.2 +paramiko==1.9.0 +path.py +Pillow==1.7.8 +pip +pygments==1.5 +pygraphviz==1.1 +pymongo==2.4.1 +python-memcached==1.48 +python-openid==2.2.5 +pytz==2012h +PyYAML==3.10 +rednose==0.3.3 +requests==0.14.2 +scipy==0.11.0 +Shapely==1.2.16 +sorl-thumbnail==11.12 +South==0.7.6 +sphinx==1.1.3 +xmltodict==0.4.1 diff --git a/test-requirements.txt b/test-requirements.txt index 4706e239a5..6c3322acbf 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,10 +1,7 @@ -django-nose coverage -nosexcover pylint pep8 lettuce selenium -factory_boy splinter From b05b627c237dc623c02ce5649f71a3d15ac746fd Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 12 Mar 2013 16:10:37 -0400 Subject: [PATCH 58/60] Reduce some more pylint noise --- .pylintrc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.pylintrc b/.pylintrc index 4357885133..d1cdbb4780 100644 --- a/.pylintrc +++ b/.pylintrc @@ -33,7 +33,11 @@ load-plugins= # can either give multiple identifier separated by comma (,) or put this option # multiple time (only on the command line, not in the configuration file where # it should appear only once). -disable=E1102,W0142 +disable= +# W0141: Used builtin function 'map' +# W0142: Used * or ** magic +# R0903: Too few public methods (1/2) + W0141,W0142,R0903 [REPORTS] @@ -97,7 +101,7 @@ bad-functions=map,filter,apply,input module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Regular expression which should only match correct module level names -const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__)|log)$ +const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__)|log|urlpatterns)$ # Regular expression which should only match correct class names class-rgx=[A-Z_][a-zA-Z0-9]+$ @@ -106,7 +110,7 @@ class-rgx=[A-Z_][a-zA-Z0-9]+$ function-rgx=[a-z_][a-z0-9_]{2,30}$ # Regular expression which should only match correct method names -method-rgx=[a-z_][a-z0-9_]{2,30}$ +method-rgx=([a-z_][a-z0-9_]{2,60}|setUp|set[Uu]pClass|tearDown|tear[Dd]ownClass|assert[A-Z]\w*)$ # Regular expression which should only match correct instance attribute names attr-rgx=[a-z_][a-z0-9_]{2,30}$ From 47420fe7c5b29d9aa5b3d0724495f70b73c36a4f Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Tue, 12 Mar 2013 12:41:04 -0400 Subject: [PATCH 59/60] Make sure that test-requirements.txt doesn't install versions of libraries that requirements.txt has pinned, and cache pip downloads --- jenkins/test.sh | 5 ++- requirements.txt | 94 +++++++++++++++++++++---------------------- test-requirements.txt | 3 -- 3 files changed, 50 insertions(+), 52 deletions(-) diff --git a/jenkins/test.sh b/jenkins/test.sh index 3a572c9808..f8ffab29fc 100755 --- a/jenkins/test.sh +++ b/jenkins/test.sh @@ -32,10 +32,11 @@ if [ ! -d /mnt/virtualenvs/"$JOB_NAME" ]; then virtualenv /mnt/virtualenvs/"$JOB_NAME" fi +export PIP_DOWNLOAD_CACHE=/mnt/pip-cache + source /mnt/virtualenvs/"$JOB_NAME"/bin/activate pip install -q -r pre-requirements.txt -pip install -q -r test-requirements.txt -yes w | pip install -q -r requirements.txt +yes w | pip install -q -r test-requirements.txt -r requirements.txt rake clobber rake pep8 diff --git a/requirements.txt b/requirements.txt index 204ec85889..3dc732e013 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,61 +1,61 @@ -django==1.4.3 -pip -numpy==1.6.2 -scipy==0.11.0 -Markdown==2.2.1 -pygments==1.5 -lxml==3.0.1 -boto==2.6.0 -mako==0.7.3 -python-memcached==1.48 -python-openid==2.2.5 -path.py -django_debug_toolbar -fs==0.4.0 -beautifulsoup==3.2.1 +-r repo-requirements.txt beautifulsoup4==4.1.3 -feedparser==5.1.3 -requests==0.14.2 -http://sympy.googlecode.com/files/sympy-0.7.1.tar.gz -newrelic==1.8.0.13 -glob2==0.3 -pymongo==2.4.1 -django_nose==1.1 -nosexcover==1.0.7 -rednose==0.3.3 -GitPython==0.3.2.RC1 -mock==0.8.0 -PyYAML==3.10 -South==0.7.6 -pytz==2012h +beautifulsoup==3.2.1 +boto==2.6.0 django-celery==3.0.11 django-countries==1.5 -django-kombu==0.9.4 +django-debug-toolbar-mongo django-followit==0.0.3 django-jasmine==0.3.2 django-keyedcache==1.4-6 +django-kombu==0.9.4 django-mako==0.1.5pre django-masquerade==0.1.6 +django-mptt==0.5.5 django-openid-auth==0.4 django-robots==0.9.1 +django-sekizai==0.6.1 django-ses==0.4.1 django-storages==1.1.5 django-threaded-multihost==1.4-1 -django-sekizai==0.6.1 -django-mptt==0.5.5 -sorl-thumbnail==11.12 -networkx==1.7 -pygraphviz==1.1 --r repo-requirements.txt -nltk==2.0.4 -django-debug-toolbar-mongo -dogstatsd-python==0.2.1 -MySQL-python==1.2.4c1 -sphinx==1.1.3 -factory_boy -Shapely==1.2.16 -ipython==0.13.1 -xmltodict==0.4.1 -paramiko==1.9.0 -Pillow==1.7.8 +django==1.4.3 +django_debug_toolbar +django_nose==1.1 dogapi==1.2.1 +dogstatsd-python==0.2.1 +factory_boy +feedparser==5.1.3 +fs==0.4.0 +GitPython==0.3.2.RC1 +glob2==0.3 +http://sympy.googlecode.com/files/sympy-0.7.1.tar.gz +ipython==0.13.1 +lxml==3.0.1 +mako==0.7.3 +Markdown==2.2.1 +mock==0.8.0 +MySQL-python==1.2.4c1 +networkx==1.7 +newrelic==1.8.0.13 +nltk==2.0.4 +nosexcover==1.0.7 +numpy==1.6.2 +paramiko==1.9.0 +path.py +Pillow==1.7.8 +pip +pygments==1.5 +pygraphviz==1.1 +pymongo==2.4.1 +python-memcached==1.48 +python-openid==2.2.5 +pytz==2012h +PyYAML==3.10 +rednose==0.3.3 +requests==0.14.2 +scipy==0.11.0 +Shapely==1.2.16 +sorl-thumbnail==11.12 +South==0.7.6 +sphinx==1.1.3 +xmltodict==0.4.1 diff --git a/test-requirements.txt b/test-requirements.txt index 4706e239a5..6c3322acbf 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,10 +1,7 @@ -django-nose coverage -nosexcover pylint pep8 lettuce selenium -factory_boy splinter From db282d891c9b0f4897cb18b65f16984f9ff6520d Mon Sep 17 00:00:00 2001 From: jmclaus Date: Wed, 13 Mar 2013 16:27:56 +0100 Subject: [PATCH 60/60] Problem 5 grades correctly. Also added missing images --- ... 3F4ADBED36D589545A9300A1EA686D36.cache.html} | 4 ++-- ... 73F4B6D6D466BAD6850A60128DF5B80D.cache.html} | 4 ++-- ... BA18AC23ACC5016C5D0799E864BBDFFE.cache.html} | 4 ++-- ... C7B18436BA03373FB13ED589C2CCF417.cache.html} | 4 ++-- ... E1A9A95677AFC620CAD5759B7ACC3E67.cache.html} | 4 ++-- ... FF175D5583BDD5ACF40C7F0AFF9A374B.cache.html} | 4 ++-- common/static/js/capa/genex/genex.css | 13 +++++++++++++ common/static/js/capa/genex/genex.nocache.js | 4 ++-- common/static/js/capa/genex/images/circles.png | Bin 0 -> 1492 bytes .../static/js/capa/genex/images/circles_ie6.png | Bin 0 -> 432 bytes common/static/js/capa/genex/images/corner.png | Bin 0 -> 1140 bytes .../static/js/capa/genex/images/corner_ie6.png | Bin 0 -> 412 bytes common/static/js/capa/genex/images/hborder.png | Bin 0 -> 1995 bytes .../static/js/capa/genex/images/hborder_ie6.png | Bin 0 -> 706 bytes .../static/js/capa/genex/images/thumb_horz.png | Bin 0 -> 222 bytes .../js/capa/genex/images/thumb_vertical.png | Bin 0 -> 231 bytes common/static/js/capa/genex/images/vborder.png | Bin 0 -> 298 bytes .../static/js/capa/genex/images/vborder_ie6.png | Bin 0 -> 189 bytes 18 files changed, 27 insertions(+), 14 deletions(-) rename common/static/js/capa/genex/{2DDA730EDABB80B88A6B0DFA3AFEACA2.cache.html => 3F4ADBED36D589545A9300A1EA686D36.cache.html} (91%) rename common/static/js/capa/genex/{026A6180B5959B8660E084245FEE5E9E.cache.html => 73F4B6D6D466BAD6850A60128DF5B80D.cache.html} (91%) rename common/static/js/capa/genex/{DF3D3A7FAEE63D711CF2D95BDB3F538C.cache.html => BA18AC23ACC5016C5D0799E864BBDFFE.cache.html} (91%) rename common/static/js/capa/genex/{1F433010E1134C95BF6CB43F552F3019.cache.html => C7B18436BA03373FB13ED589C2CCF417.cache.html} (91%) rename common/static/js/capa/genex/{5033ABB047340FB9346B622E2CC7107D.cache.html => E1A9A95677AFC620CAD5759B7ACC3E67.cache.html} (82%) rename common/static/js/capa/genex/{4EEB1DCF4B30D366C27968D1B5C0BD04.cache.html => FF175D5583BDD5ACF40C7F0AFF9A374B.cache.html} (87%) create mode 100644 common/static/js/capa/genex/images/circles.png create mode 100644 common/static/js/capa/genex/images/circles_ie6.png create mode 100644 common/static/js/capa/genex/images/corner.png create mode 100644 common/static/js/capa/genex/images/corner_ie6.png create mode 100644 common/static/js/capa/genex/images/hborder.png create mode 100644 common/static/js/capa/genex/images/hborder_ie6.png create mode 100644 common/static/js/capa/genex/images/thumb_horz.png create mode 100644 common/static/js/capa/genex/images/thumb_vertical.png create mode 100644 common/static/js/capa/genex/images/vborder.png create mode 100644 common/static/js/capa/genex/images/vborder_ie6.png diff --git a/common/static/js/capa/genex/2DDA730EDABB80B88A6B0DFA3AFEACA2.cache.html b/common/static/js/capa/genex/3F4ADBED36D589545A9300A1EA686D36.cache.html similarity index 91% rename from common/static/js/capa/genex/2DDA730EDABB80B88A6B0DFA3AFEACA2.cache.html rename to common/static/js/capa/genex/3F4ADBED36D589545A9300A1EA686D36.cache.html index 743492768b..c5ad0d1b89 100644 --- a/common/static/js/capa/genex/2DDA730EDABB80B88A6B0DFA3AFEACA2.cache.html +++ b/common/static/js/capa/genex/3F4ADBED36D589545A9300A1EA686D36.cache.html @@ -1,4 +1,4 @@ - \ No newline at end of file diff --git a/common/static/js/capa/genex/4EEB1DCF4B30D366C27968D1B5C0BD04.cache.html b/common/static/js/capa/genex/FF175D5583BDD5ACF40C7F0AFF9A374B.cache.html similarity index 87% rename from common/static/js/capa/genex/4EEB1DCF4B30D366C27968D1B5C0BD04.cache.html rename to common/static/js/capa/genex/FF175D5583BDD5ACF40C7F0AFF9A374B.cache.html index 4aa12e55d4..ca07bf3292 100644 --- a/common/static/js/capa/genex/4EEB1DCF4B30D366C27968D1B5C0BD04.cache.html +++ b/common/static/js/capa/genex/FF175D5583BDD5ACF40C7F0AFF9A374B.cache.html @@ -1,4 +1,4 @@ - \ No newline at end of file diff --git a/common/static/js/capa/genex/genex.css b/common/static/js/capa/genex/genex.css index a05f31110b..459c854f92 100644 --- a/common/static/js/capa/genex/genex.css +++ b/common/static/js/capa/genex/genex.css @@ -57,10 +57,15 @@ pre, #dna-strand { background: white; } .gwt-DialogBox .dialogBottomCenter { + background: url(images/hborder.png) repeat-x 0px -2945px; + -background: url(images/hborder_ie6.png) repeat-x 0px -2144px; } .gwt-DialogBox .dialogMiddleLeft { + background: url(images/vborder.png) repeat-y -31px 0px; } .gwt-DialogBox .dialogMiddleRight { + background: url(images/vborder.png) repeat-y -32px 0px; + -background: url(images/vborder_ie6.png) repeat-y -32px 0px; } .gwt-DialogBox .dialogTopLeftInner { width: 10px; @@ -82,12 +87,20 @@ pre, #dna-strand { zoom: 1; } .gwt-DialogBox .dialogTopLeft { + background: url(images/circles.png) no-repeat -20px 0px; + -background: url(images/circles_ie6.png) no-repeat -20px 0px; } .gwt-DialogBox .dialogTopRight { + background: url(images/circles.png) no-repeat -28px 0px; + -background: url(images/circles_ie6.png) no-repeat -28px 0px; } .gwt-DialogBox .dialogBottomLeft { + background: url(images/circles.png) no-repeat 0px -36px; + -background: url(images/circles_ie6.png) no-repeat 0px -36px; } .gwt-DialogBox .dialogBottomRight { + background: url(images/circles.png) no-repeat -8px -36px; + -background: url(images/circles_ie6.png) no-repeat -8px -36px; } * html .gwt-DialogBox .dialogTopLeftInner { width: 10px; diff --git a/common/static/js/capa/genex/genex.nocache.js b/common/static/js/capa/genex/genex.nocache.js index 07da038234..fe892a53dc 100644 --- a/common/static/js/capa/genex/genex.nocache.js +++ b/common/static/js/capa/genex/genex.nocache.js @@ -1,4 +1,4 @@ -function genex(){var P='',xb='" for "gwt:onLoadErrorFn"',vb='" for "gwt:onPropertyErrorFn"',ib='"><\/script>',Z='#',Xb='.cache.html',_='/',lb='//',Qb='026A6180B5959B8660E084245FEE5E9E',Rb='1F433010E1134C95BF6CB43F552F3019',Sb='2DDA730EDABB80B88A6B0DFA3AFEACA2',Tb='4EEB1DCF4B30D366C27968D1B5C0BD04',Ub='5033ABB047340FB9346B622E2CC7107D',Wb=':',pb='::',dc='