Changeset 3114 for trunk


Ignore:
Timestamp:
12/03/10 14:00:03 (9 years ago)
Author:
jukka
Message:

Fixed #2010 and fixed #2007. (problems w. sending and evaluating exercises)

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/CommonMixIn.py

    r3077 r3114  
    592592            roles =[] 
    593593         
    594         v['subView'] = subView = (view_id in ['discussion', 'about_view', 'history_view','collections_list','manage_translations','manage_convert', 'feedback_view'] or version) and not isDeleted 
     594        v['subView'] = subView = (view_id in ['discussion', 'about_view', 'history_view','collections_list','manage_translations','manage_convert', 'feedback_view','sendAnswers'] or version) and not isDeleted 
    595595        v['mainView'] = mainView = not (subView or isDeleted or (isPrivate and not (owner or canManage) )) 
    596596        v['canUndelete'] = canModerate and isDeleted  
  • trunk/ExerciseMaterial.py

    r3086 r3114  
    142142        corrects=wrongs=0 
    143143        results=[question,'\n\n'] 
    144         for i, choice in enumerate(choices): 
    145             a=form.get('exercise_%s_checkbox_%s' % (index, i), '') 
    146             if a: 
    147                 results.append('[x]') 
    148                 if not choice[1]: 
    149                     results.append(' <- [ ]\t') 
    150                     wrongs+=1 
     144        # Check if this is a choice or multiple choice form 
     145        cor=0 
     146        multiple=False 
     147        for q,c in choices: 
     148            if c: 
     149                cor+=1 
     150        if cor!=1: 
     151            multiple=True 
     152         
     153        if multiple: 
     154            for i, choice in enumerate(choices): 
     155                a=form.get('exercise_%s_checkbox_%s' % (index, i), '') 
     156                if a: 
     157                    results.append('[x]') 
     158                    if not choice[1]: 
     159                        results.append(' <- [ ]\t') 
     160                        wrongs+=1 
     161                    else: 
     162                        results.append('\t\t') 
     163                        corrects+=1 
    151164                else: 
     165                    results.append('[ ]') 
     166                    if choice[1]: 
     167                        results.append(' <- [x]\t') 
     168                        wrongs+=1 
     169                    else: 
     170                        results.append('\t\t') 
     171                        corrects+=1                 
     172                results.append(to_unicode(choice[0])) 
     173                results.append('\n') 
     174        else: 
     175            a=int(form.get('exercise_%s_radio' % index, '-1'))          
     176            for i, choice in enumerate(choices): 
     177                if a==i: 
     178                    results.append('[x]') 
     179                    if choice[1]: 
     180                        corrects=1 
     181                    else: 
     182                        wrongs=1                         
    152183                    results.append('\t\t') 
    153                     corrects+=1 
    154             else: 
    155                 results.append('[ ]') 
    156                 if choice[1]: 
    157                     results.append(' <- [x]\t') 
    158                     wrongs+=1 
    159184                else: 
    160                     results.append('\t\t') 
    161                     corrects+=1                 
    162             results.append(to_unicode(choice[0])) 
    163             results.append('\n') 
     185                    results.append('[ ]') 
     186                    if choice[1]: 
     187                        results.append(' <- [x]\t') 
     188                        wrongs=1 
     189                    else: 
     190                        results.append('\t\t') 
     191                results.append(to_unicode(choice[0])) 
     192                results.append('\n') 
    164193        results.append('\n') 
    165194        return u''.join(results), corrects, wrongs                 
    166195 
    167     def checkChoiceFromForm(self, form, question, choices, index): 
    168         """ Checks form for choice test, returns exercise with correct answer marked, correctness as boolean """ 
    169         results=[question,'\n\n'] 
    170         a=int(form.get('exercise_%s_checkbox' % index, -1)) 
    171         correct=False 
    172         for i, choice in enumerate(choices): 
    173             if a==i: 
    174                 results.append('[x]') 
    175                 if choice['is_correct']: 
    176                     correct=True 
    177                     results.append('\t\t') 
    178                 else: 
    179                     results.append(' <- [ ]\t') 
    180             else: 
    181                 results.append('[ ]') 
    182                 if choice['is_correct']: 
    183                     results.append(' <- [x]\t') 
    184                 else:                     
    185                     results.append('\t\t') 
    186             results.append(choice['text']) 
    187             results.append('\n') 
    188         results.append('\n') 
    189         return u''.join(results), correct                 
    190  
    191     def checkPollFromForm(self, form, question, choices, index): 
    192         """ Reports back the selected poll option """ 
    193         results=[question,'\n\n'] 
    194         a=int(form.get('exercise_%s_choice' % index, -1)) 
    195         answer=choices[a]['text'] 
    196         results.append('[x]\t\t') 
    197         results.append(answer) 
    198         results.append('\n') 
    199         return u''.join(results)                 
    200196         
    201197    def checkOpenEndedFromForm(self, form, question, index): 
     
    223219            elif chapter['type']=='open_ended': 
    224220                s=self.checkOpenEndedFromForm(form, text, index) 
    225             elif chapter['type']=='poll': 
    226                 s=self.checkPollFromForm(form, text, chapter['choices'], index) 
    227             elif chapter['type']=='choices': 
    228                 s, cs, ws=self.checkChoiceFromForm(form, text, chapter['choices'], index) 
    229221            elif chapter['type']=='multiple_choices': 
    230222                s, cs, ws=self.checkMultipleChoiceFromForm(form, text, chapter['choices'], index) 
     
    240232        return u''.join(results) 
    241233 
     234 
    242235    def sendAnswers(self, REQUEST): 
    243236        """ Send e-mail to a teacher """ 
     237        msg=self._sendAnswers(REQUEST) 
     238        lt=getToolByName(self, 'lemill_tool') 
     239        lt.addPortalMessage(msg[0]) 
     240        return self.feedback_view() 
     241 
     242    def _sendAnswers(self, REQUEST): 
    244243        mhost=self.MailHost 
    245244        body=[] 
  • trunk/FieldsWidgets.py

    r3113 r3114  
    888888         
    889889    def fixBrokenChoice(self, old_values): 
     890        new_values=[] 
    890891        for vald in old_values: 
    891892            if vald['type']=='choice' and isinstance(vald['text'], list): 
    892893                 # [text, [correct_answers], [wrong_answers]] 
    893                  broken_text=vald['text'] 
    894                  vald['text']=broken_text[0] 
    895                  choices=[(broken_text[1][0], 1)] 
    896                  for item in broken_text[2]: 
    897                     choices.append((item, 0)) 
     894                 print vald 
     895                 text_list=vald['text'] 
     896                 vald['text']=text_list[0] 
     897                 correct_choices=text_list[1] 
     898                 if not isinstance(correct_choices, list): 
     899                    correct_choices=[correct_choices] 
     900                 wrong_choices=text_list[2] 
     901                 if not isinstance(wrong_choices, list): 
     902                    wrong_choices=[wrong_choices] 
     903                 choices=[] 
     904                 for item in correct_choices: 
     905                    choices.append((item, 1)) 
     906                 for item in wrong_choices: 
     907                    choices.append((item, 0))                                 
    898908                 vald['choices']=choices 
    899909                 vald['type']='multiple_choices' 
     
    11111121        return {'hour':as_time/3600,'minute':(as_time % 3600)/60,'second':as_time % 60}            
    11121122 
     1123    def hasOneCorrectChoice(self, chapter): 
     1124        """ Check if this exercise is multiple choice (-> use checkboxes) or has only one correct answer (-> use radio buttons) """ 
     1125        corrects=0 
     1126        for q,c in chapter['choices']: 
     1127            if c: 
     1128                corrects+=1 
     1129        return corrects==1 
     1130                 
     1131 
     1132 
    11131133registerField(ChapterField, 
    11141134    title='Chapter field', 
  • trunk/skins/lemill/feedback_view.pt

    r3045 r3114  
    66        <metal:main fill-slot="main"> 
    77            <tal:macro metal:define-macro="body"> 
    8             <pre tal:content="here/checkExercise"> 
     8            <pre style="white-space: pre-wrap" tal:content="here/checkExercise"> 
    99                Exercise results here 
    1010            </pre> 
  • trunk/skins/lemill/lemill_grid.css

    r3112 r3114  
    632632 
    633633 
    634 div.field label { 
     634div.field label, label.exercise_choice { 
    635635    font-weight:normal; 
    636636    } 
  • trunk/skins/lemill/master.js

    r3113 r3114  
    232232    chapter=here.parents('div.chapter_edit:first'); 
    233233    question=chapter.find('#choice_question').val(); 
     234    corrects=0 
     235    chapter.find('input.correct_choice:checked').each(function(){ 
     236        val=$(this).val(); 
     237        corrects+=parseInt(val); 
     238    }); 
     239    if (corrects==1) { 
     240        input_type='radio'; 
     241    } else { 
     242        input_type='checkbox'; 
     243    } 
    234244    choices=[]; 
    235245    chapter.find('textarea.multiple_choice_answer').each(function(){ 
    236246        val=$(this).val(); 
    237247        if (val) { 
    238             row='<p><input type="radio" name="preview" value="" />'+$(this).val()+'</p>'; 
     248            row='<p><input type="'+input_type+'" name="preview" value="" />'+$(this).val()+'</p>'; 
    239249            choices.push(row); 
    240250            } 
  • trunk/skins/lemill/widget_exercise.pt

    r3097 r3114  
    1212 
    1313<metal:view_macro define-macro="view" tal:define="value accessor">  
    14   <form method="post" tal:attributes="action string:$here_url/feedback_view"> 
     14  <form method="post" tal:attributes="action string:$here_url/sendAnswers"> 
    1515    <tal:chapters repeat="chapter value">             
    1616      <tal:defs tal:define="text chapter/text; 
     
    7979        </td> 
    8080    </tr> 
    81     <tr> 
    82         <td tal:define="choices chapter/choices"> 
     81    <tr tal:define="is_radio python:field.hasOneCorrectChoice(chapter)" > 
     82        <td> 
    8383            <span tal:repeat="choice chapter/choices" tal:omit-tag=""> 
    8484            <p tal:define="aindex repeat/choice/index"> 
    85                 <input type="checkbox" value="1" 
    86                     tal:attributes="id python:'exercise_%s_checkbox_%s' % (index,aindex); 
    87                     name python:'exercise_%s_checkbox_%s' % (index,aindex);" /> 
    88                 <span tal:replace="structure python:choice[0]"></span> 
     85                <input type="radio" tal:condition="is_radio" tal:attributes="name python:'exercise_%s_radio' % index; id python:'exercise_%s_choice_%s' % (index, aindex); value aindex"/>  
     86                <input type="checkbox" tal:condition="not:is_radio" value="1" tal:attributes="id python:'exercise_%s_choice_%s' % (index,aindex); name python:'exercise_%s_checkbox_%s' % (index,aindex);" /> 
     87                <label class="exercise_choice" tal:content="structure python:choice[0]" tal:attributes="for python:'exercise_%s_choice_%s' % (index,aindex)"></label> 
    8988            </p> 
    9089            </span> 
     
    167166 
    168167 
    169 <metal:edit_view_poll define-macro="edit_view_poll"> 
    170 <metal:use use-macro="radio_choice" /> 
    171 </metal:edit_view_poll> 
    172  
    173 <metal:edit_view_choice define-macro="edit_view_choice"> 
    174 <metal:radio_choice define-macro="radio_choice"><table> 
    175   <tr> 
    176     <td valign="middle" align="left"> 
    177       <p tal:content="structure cleaned_chapter/text">PLACEHOLDER</p> 
    178     </td> 
    179   </tr> 
    180   <tr> 
    181    <td> 
    182      <span tal:repeat="choice cleaned_chapter/choices" tal:omit-tag=""> 
    183      <p tal:define="aindex repeat/choice/index"> 
    184        <input type="radio" tal:attributes="value aindex; id python:'choices_%s' % index; name python:'choices_%s' % index" /> 
    185        <span tal:content="structure python:choice[0]"></span> 
    186      </p> 
    187      </span> 
    188     </td> 
    189   </tr> 
    190 </table></metal:radio_choice> 
    191 </metal:edit_view_choice> 
    192  
    193  
    194  
    195168<metal:edit_view_multiple_choices define-macro="edit_view_multiple_choices"> 
    196169<table> 
     
    200173    </td> 
    201174  </tr> 
    202   <tr> 
    203    <td> 
    204      <span tal:repeat="choice cleaned_chapter/choices" tal:omit-tag=""> 
    205      <p tal:define="aindex repeat/choice/index"> 
    206        <input type="checkbox" value="" tal:attributes="id python:'choices_%s_answer_%s' % (index,aindex); 
    207           name python:'choices_%s_answer_%s' % (index,aindex)" /> 
    208        <span tal:content="structure python:choice[0]"></span> 
    209      </p> 
    210      </span> 
    211     </td> 
    212   </tr> 
     175    <tr tal:define="is_radio python:field.hasOneCorrectChoice(cleaned_chapter)" > 
     176        <td> 
     177            <span tal:repeat="choice cleaned_chapter/choices" tal:omit-tag=""> 
     178            <p tal:define="aindex repeat/choice/index"> 
     179                <input type="radio" tal:condition="is_radio" tal:attributes="name python:'exercise_%s_radio' % index; id python:'exercise_%s_choice_%s' % (index, aindex); value aindex"/>  
     180                <input type="checkbox" tal:condition="not:is_radio" value="1" tal:attributes="id python:'exercise_%s_choice_%s' % (index,aindex); name python:'exercise_%s_checkbox_%s' % (index,aindex);" /> 
     181                <label class="exercise_choice" tal:content="structure python:choice[0]" tal:attributes="for python:'exercise_%s_choice_%s' % (index,aindex)"></label> 
     182            </p> 
     183            </span> 
     184        </td>                     
     185    </tr> 
    213186</table> 
    214187</metal:edit_view_multiple_choices> 
     
    392365     <tal:loop repeat="choicetuple choices"> 
    393366      <tr class="sortable_row" tal:define="index repeat/choicetuple/index"> 
    394        <td><input type="radio" value="1" name="answer_0_correct" id="answer_0_correct" tal:attributes="name string:answer_${index}_correct; id string:answer_${index}_correct; checked python:choicetuple[1];"/></td>  
     367       <td><input type="radio" class="correct_choice" value="1" name="answer_0_correct" id="answer_0_correct" tal:attributes="name string:answer_${index}_correct; id string:answer_${index}_correct; checked python:choicetuple[1];"/></td>  
    395368       <td><input type="radio" value="0" name="answer_0_correct" id="answer_0_correct" tal:attributes="name string:answer_${index}_correct; id string:answer_${index}_correct; checked python:not choicetuple[1];"/></td> 
    396369       <td> 
Note: See TracChangeset for help on using the changeset viewer.