single question report basically working
This commit is contained in:
parent
2ea0689a05
commit
f935a0efb7
2 changed files with 68 additions and 11 deletions
|
@ -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:
|
||||||
resp.values[qu] = data[qu.uid]
|
value = 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
|
||||||
|
|
|
@ -158,8 +158,7 @@
|
||||||
<span tal:content="python:len(teamData)" /></b><br />
|
<span tal:content="python:len(teamData)" /></b><br />
|
||||||
</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> </td>
|
||||||
|
<td> </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 />
|
||||||
|
</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>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue