make answer options configurable
This commit is contained in:
		
							parent
							
								
									5f81ecfed2
								
							
						
					
					
						commit
						3a6d6a7ddd
					
				
					 3 changed files with 62 additions and 21 deletions
				
			
		|  | @ -55,6 +55,21 @@ class SurveyView(ConceptView): | ||||||
|         if self.editable: |         if self.editable: | ||||||
|             return 'index.html' |             return 'index.html' | ||||||
| 
 | 
 | ||||||
|  |     @Lazy | ||||||
|  |     def answerOptions(self): | ||||||
|  |         opts = self.adapted.answerOptions | ||||||
|  |         if not opts: | ||||||
|  |             opts = [ | ||||||
|  |                 dict(value='none', label=u'No answer',  | ||||||
|  |                         description=u'survey_value_none'), | ||||||
|  |                 dict(value=3, label=u'Fully applies',  | ||||||
|  |                         description=u'survey_value_3'), | ||||||
|  |                 dict(value=2, label=u'', description=u'survey_value_2'), | ||||||
|  |                 dict(value=1, label=u'', description=u'survey_value_1'), | ||||||
|  |                 dict(value=0, label=u'Does not apply',  | ||||||
|  |                         description=u'survey_value_0'),] | ||||||
|  |         return opts | ||||||
|  | 
 | ||||||
|     @Lazy |     @Lazy | ||||||
|     def showFeedbackText(self): |     def showFeedbackText(self): | ||||||
|         sft = self.adapted.showFeedbackText |         sft = self.adapted.showFeedbackText | ||||||
|  | @ -77,7 +92,6 @@ class SurveyView(ConceptView): | ||||||
|         return False |         return False | ||||||
| 
 | 
 | ||||||
|     def getTeamData(self, respManager): |     def getTeamData(self, respManager): | ||||||
|         #result = [myResponse] |  | ||||||
|         result = [] |         result = [] | ||||||
|         pred = self.conceptManager.get('ismember') |         pred = self.conceptManager.get('ismember') | ||||||
|         if pred is None: |         if pred is None: | ||||||
|  | @ -119,6 +133,7 @@ class SurveyView(ConceptView): | ||||||
|                 if value != 'none': |                 if value != 'none': | ||||||
|                     uid = key[len('question_'):] |                     uid = key[len('question_'):] | ||||||
|                     question = adapted(self.getObjectForUid(uid)) |                     question = adapted(self.getObjectForUid(uid)) | ||||||
|  |                     if value.isdigit(): | ||||||
|                         value = int(value) |                         value = int(value) | ||||||
|                     data[uid] = value |                     data[uid] = value | ||||||
|                     response.values[question] = value |                     response.values[question] = value | ||||||
|  | @ -167,7 +182,8 @@ class SurveyView(ConceptView): | ||||||
|         text = qugroup.description |         text = qugroup.description | ||||||
|         info = None |         info = None | ||||||
|         if qugroup.minAnswers in (u'', None): |         if qugroup.minAnswers in (u'', None): | ||||||
|             info = translate(_(u'Please answer all questions.'), target_language=lang) |             info = translate(_(u'Please answer all questions.'),  | ||||||
|  |                 target_language=lang) | ||||||
|         elif qugroup.minAnswers > 0: |         elif qugroup.minAnswers > 0: | ||||||
|             info = translate(_(u'Please answer at least $minAnswers questions.', |             info = translate(_(u'Please answer at least $minAnswers questions.', | ||||||
|                                mapping=dict(minAnswers=qugroup.minAnswers)), |                                mapping=dict(minAnswers=qugroup.minAnswers)), | ||||||
|  | @ -182,10 +198,19 @@ class SurveyView(ConceptView): | ||||||
|             self.data = Responses(self.context).load() |             self.data = Responses(self.context).load() | ||||||
|         if self.data: |         if self.data: | ||||||
|             setting = self.data.get(question.uid) |             setting = self.data.get(question.uid) | ||||||
|         noAnswer = [dict(value='none', checked=(setting == None), |         if setting is None: | ||||||
|                          radio=(not question.required))] |             setting = 'none' | ||||||
|         return noAnswer + [dict(value=i, checked=(setting == i), radio=True)  |         setting = str(setting) | ||||||
|                                 for i in reversed(range(question.answerRange))] |         result = [] | ||||||
|  |         for opt in self.answerOptions: | ||||||
|  |             value = str(opt['value']) | ||||||
|  |             result.append(dict(value=value, checked=(setting == value))) | ||||||
|  |         return result | ||||||
|  |        | ||||||
|  |         #noAnswer = [dict(value='none', checked=(setting == None), | ||||||
|  |         #                 radio=(not question.required))] | ||||||
|  |         #return noAnswer + [dict(value=i, checked=(setting == i), radio=True)  | ||||||
|  |         #                        for i in reversed(range(question.answerRange))] | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class SurveyCsvExport(NodeView): | class SurveyCsvExport(NodeView): | ||||||
|  | @ -198,7 +223,8 @@ class SurveyCsvExport(NodeView): | ||||||
|     @Lazy |     @Lazy | ||||||
|     def questions(self): |     def questions(self): | ||||||
|         result = [] |         result = [] | ||||||
|         for idx1, qug in enumerate(adapted(self.virtualTargetObject).questionGroups): |         for idx1, qug in enumerate( | ||||||
|  |                     adapted(self.virtualTargetObject).questionGroups): | ||||||
|             for idx2, qu in enumerate(qug.questions): |             for idx2, qu in enumerate(qug.questions): | ||||||
|                 result.append((idx1, idx2, qug, qu)) |                 result.append((idx1, idx2, qug, qu)) | ||||||
|         return result |         return result | ||||||
|  |  | ||||||
|  | @ -39,6 +39,26 @@ class IQuestionnaire(IConceptSchema, interfaces.IQuestionnaire): | ||||||
|         default=4, |         default=4, | ||||||
|         required=True) |         required=True) | ||||||
| 
 | 
 | ||||||
|  |     answerOptions = Records( | ||||||
|  |         title=_(u'Answer Options'), | ||||||
|  |         description=_(u'Values to select from with corresponding column ' | ||||||
|  |                         u'labels and descriptions. There should be at ' | ||||||
|  |                         u'least answer range items with numeric values.'), | ||||||
|  |         default=[], | ||||||
|  |         required=False) | ||||||
|  | 
 | ||||||
|  |     answerOptions.column_types = [ | ||||||
|  |             schema.Text(__name__='value', title=u'Value',), | ||||||
|  |             schema.Text(__name__='label', title=u'Label'), | ||||||
|  |             schema.Text(__name__='description', title=u'Description'),] | ||||||
|  | 
 | ||||||
|  |     noGrouping = schema.Bool( | ||||||
|  |         title=_(u'No Grouping of Questions'), | ||||||
|  |         description=_(u'The questions should be presented in a linear manner, ' | ||||||
|  |                         u'not grouped by categories or question groups.'), | ||||||
|  |         default=False, | ||||||
|  |         required=False) | ||||||
|  | 
 | ||||||
|     feedbackColumns = Records( |     feedbackColumns = Records( | ||||||
|         title=_(u'Feedback Columns'), |         title=_(u'Feedback Columns'), | ||||||
|         description=_(u'Column definitions for the results table ' |         description=_(u'Column definitions for the results table ' | ||||||
|  |  | ||||||
|  | @ -9,6 +9,7 @@ | ||||||
|   <tal:description condition="not:feedback"> |   <tal:description condition="not:feedback"> | ||||||
|     <metal:title use-macro="item/conceptMacros/conceptdescription" /> |     <metal:title use-macro="item/conceptMacros/conceptdescription" /> | ||||||
|   </tal:description> |   </tal:description> | ||||||
|  | 
 | ||||||
|   <div tal:condition="feedback"> |   <div tal:condition="feedback"> | ||||||
|     <h3 i18n:translate="">Feedback</h3> |     <h3 i18n:translate="">Feedback</h3> | ||||||
|     <div tal:define="header item/adapted/feedbackHeader" |     <div tal:define="header item/adapted/feedbackHeader" | ||||||
|  | @ -44,8 +45,10 @@ | ||||||
|     </div> |     </div> | ||||||
|     <div tal:define="footer item/adapted/feedbackFooter" |     <div tal:define="footer item/adapted/feedbackFooter" | ||||||
|          tal:condition="footer" |          tal:condition="footer" | ||||||
|          tal:content="structure python:item.renderText(footer, 'text/restructured')" /> |          tal:content="structure python: | ||||||
|  |                         item.renderText(footer, 'text/restructured')" /> | ||||||
|   </div> |   </div> | ||||||
|  | 
 | ||||||
|   <div id="questionnaire" |   <div id="questionnaire" | ||||||
|        tal:condition="not:feedback"> |        tal:condition="not:feedback"> | ||||||
|     <h3 i18n:translate="">Questionnaire</h3> |     <h3 i18n:translate="">Questionnaire</h3> | ||||||
|  | @ -68,13 +71,10 @@ | ||||||
|                 <span tal:content="structure infoText" /> |                 <span tal:content="structure infoText" /> | ||||||
|               </div> |               </div> | ||||||
|             </td> |             </td> | ||||||
|             <td style="text-align: center" |             <td tal:repeat="opt item/answerOptions" | ||||||
|                 i18n:translate="">No answer</td> |                 style="text-align: center" | ||||||
|             <td colspan="2" |                 i18n:translate="" | ||||||
|                 i18n:translate="">Fully applies</td> |                 tal:content="opt/label" /> | ||||||
|             <td colspan="2" |  | ||||||
|                 style="text-align: right" |  | ||||||
|                 i18n:translate="">Does not apply</td> |  | ||||||
|           </tr> |           </tr> | ||||||
|           <tr class="vpad" |           <tr class="vpad" | ||||||
|               tal:repeat="question qugroup/questions"> |               tal:repeat="question qugroup/questions"> | ||||||
|  | @ -83,16 +83,11 @@ | ||||||
|                 tal:repeat="value python:item.getValues(question)"> |                 tal:repeat="value python:item.getValues(question)"> | ||||||
|                 <input type="radio" |                 <input type="radio" | ||||||
|                        i18n:attributes="title" |                        i18n:attributes="title" | ||||||
|                        tal:condition="value/radio"       |  | ||||||
|                        tal:attributes=" |                        tal:attributes=" | ||||||
|                             name string:question_${question/uid}; |                             name string:question_${question/uid}; | ||||||
|                             value value/value; |                             value value/value; | ||||||
|                             checked value/checked; |                             checked value/checked; | ||||||
|                             title string:survey_value_${value/value}" /> |                             title string:survey_value_${value/value}" /> | ||||||
|                 <span tal:condition="not:value/radio" |  | ||||||
|                       title="Obligatory question, must be answered" |  | ||||||
|                       i18n:attributes="title">*** |  | ||||||
|                 </span> |  | ||||||
|             </td> |             </td> | ||||||
|           </tr> |           </tr> | ||||||
|         </tal:qugroup> |         </tal:qugroup> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue