single question report basically working

This commit is contained in:
Helmut Merz 2015-04-21 12:42:18 +02:00
parent 2ea0689a05
commit f935a0efb7
2 changed files with 68 additions and 11 deletions

View file

@ -156,22 +156,26 @@ class SurveyView(InstitutionMixin, ConceptView):
def getTeamData(self, respManager): def getTeamData(self, respManager):
result = [] result = []
pred = self.conceptManager.get('ismember') pred = [self.conceptManager.get('ismember'),
if pred is None: self.conceptManager.get('ismaster')]
if None in pred:
return result return result
inst = self.institution inst = self.institution
instUid = self.getUidForObject(inst) instUid = self.getUidForObject(inst)
if inst: if inst:
for c in inst.getChildren([pred]): for c in inst.getChildren(pred):
uid = self.getUidForObject(c) uid = self.getUidForObject(c)
data = respManager.load(uid, instUid) data = respManager.load(uid, instUid)
if data: if data:
resp = Response(self.adapted, None) resp = Response(self.adapted, None)
for qu in self.adapted.questions: for qu in self.adapted.questions:
if qu.questionType != 'value_selection': if qu.questionType in (None, 'value_selection'):
continue if qu.uid in data:
if qu.uid in data: value = data[qu.uid]
resp.values[qu] = data[qu.uid] if isinstance(value, int) or value.isdigit():
resp.values[qu] = int(value)
else:
resp.texts[qu] = data.get(qu.uid) or u''
qgAvailable = True qgAvailable = True
for qg in self.adapted.questionGroups: for qg in self.adapted.questionGroups:
if qg.uid in data: if qg.uid in data:
@ -244,12 +248,30 @@ class SurveyView(InstitutionMixin, ConceptView):
groups = self.adapted.questionGroups groups = self.adapted.questionGroups
teamValues = response.getTeamResult(groups, self.teamData) teamValues = response.getTeamResult(groups, self.teamData)
for idx, r in enumerate(teamValues): for idx, r in enumerate(teamValues):
item = dict(category=r['group'].title, group = r['group']
item = dict(category=group.title,
average=int(round(r['average'] * 100)), average=int(round(r['average'] * 100)),
teamRank=r['rank']) teamRank=r['rank'])
if group.feedbackItems:
wScore = r['average'] * len(group.feedbackItems) - 0.00001
item['text'] = group.feedbackItems[int(wScore)].text
result.append(item) result.append(item)
return result return result
def getTeamResultsForQuestion(self, question):
result = dict(average=0.0, stddev=0.0)
if self.teamData is None:
respManager = Responses(self.context)
self.teamData = self.getTeamData(respManager)
values = [r.values.get(question) for r in self.teamData]
values = [v for v in values if v is not None]
if values:
average = round(float(sum(values)) / len(values), 2)
result['average'] = average
texts = [r.texts.get(question) for r in self.teamData]
result['texts'] = '<br />'.join([unicode(t) for t in texts if t])
return result
def check(self, response): def check(self, response):
errors = [] errors = []
values = response.values values = response.values

View file

@ -158,8 +158,7 @@
<span tal:content="python:len(teamData)" /></b><br />&nbsp; <span tal:content="python:len(teamData)" /></b><br />&nbsp;
</p> </p>
<div class="button" id="show_questionnaire"> <div class="button" id="show_questionnaire">
<a href="" xxonclick="back(); return false" <a i18n:translate=""
i18n:translate=""
tal:attributes="href string:${request/URL}${item/urlParamString}"> tal:attributes="href string:${request/URL}${item/urlParamString}">
Back to Questionnaire</a> Back to Questionnaire</a>
<br /> <br />
@ -174,7 +173,43 @@
<metal:block define-macro="report_questions"> <metal:block define-macro="report_questions">
<h3 i18n:translate="label_survey_report_questions"></h3> <h3 i18n:translate="label_survey_report_questions"></h3>
<div> <div>
Not yet implemented <table class="listing">
<tal:group repeat="group item/groups">
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr class="vpad">
<td><b tal:content="group/title" /></td>
<td i18n:translate="">Average</td>
</tr>
<tr tal:repeat="question group/questions">
<tal:question
define="qutype python:
question.questionType or 'value_selection';
data python:item.getTeamResultsForQuestion(question)">
<td>
<div tal:content="question/text" />
<div style="width: 90%; margin-left: 20px"
tal:condition="python:qutype == 'text'"
tal:content="structure data/texts" />
</td>
<td class="center">
<span tal:condition="python:qutype == 'value_selection'"
tal:content="data/average" /></td>
</tal:question>
</tr>
</tal:group>
</table>
<p tal:define="teamData item/teamData"
tal:condition="teamData">
<b><span i18n:translate="">Team Size</span>:
<span tal:content="python:len(teamData)" /></b><br />&nbsp;
</p>
<div class="button" id="show_questionnaire">
<a i18n:translate=""
tal:attributes="href string:${request/URL}${item/urlParamString}">
Back to Questionnaire</a></div>
</div> </div>
</metal:block> </metal:block>