make team reports callable independent of filling a questionnaire

This commit is contained in:
Helmut Merz 2015-04-21 10:06:28 +02:00
parent 57aee009b6
commit 2ea0689a05
5 changed files with 119 additions and 48 deletions

View file

@ -3,7 +3,7 @@
<metal:institution define-macro="select_institution"> <metal:institution define-macro="select_institution">
<form method="post"> <form method="post">
<div style="font-size: 120%; padding-bottom: 10px"> <div style="font-size: 120%; padding: 10px 0 10px 0">
<span i18n:translate="">Organisation/Team</span>: <span i18n:translate="">Organisation/Team</span>:
<b tal:content="item/institution/title" /> <b tal:content="item/institution/title" />
<img tal:condition="python:len(item.institutions) > 1" <img tal:condition="python:len(item.institutions) > 1"

View file

@ -35,6 +35,7 @@ from loops.common import adapted, baseObject
from loops.knowledge.browser import InstitutionMixin from loops.knowledge.browser import InstitutionMixin
from loops.knowledge.survey.response import Responses from loops.knowledge.survey.response import Responses
from loops.organize.party import getPersonForUser from loops.organize.party import getPersonForUser
from loops.security.common import checkPermission
from loops.util import getObjectForUid from loops.util import getObjectForUid
from loops.util import _ from loops.util import _
@ -72,6 +73,23 @@ class SurveyView(InstitutionMixin, ConceptView):
if self.editable: if self.editable:
return 'index.html' return 'index.html'
def getUrlParamString(self):
qs = super(SurveyView, self).getUrlParamString()
if qs.startswith('?report='):
return ''
return qs
@Lazy
def report(self):
return self.request.form.get('report')
def teamReports(self):
if self.adapted.teamBasedEvaluation:
if checkPermission('loops.ViewRestricted', self.context):
return [dict(name='standard', label='label_survey_report_standard'),
dict(name='questions',
label='label_survey_report_questions')]
def update(self): def update(self):
instUid = self.request.form.get('select_institution') instUid = self.request.form.get('select_institution')
if instUid: if instUid:
@ -123,8 +141,12 @@ class SurveyView(InstitutionMixin, ConceptView):
cols = [ cols = [
dict(name='text', label=u'Response'), dict(name='text', label=u'Response'),
dict(name='score', label=u'Score')] dict(name='score', label=u'Score')]
if self.report == 'standard':
cols = [c for c in cols if c['name'] in self.teamColumns]
return cols return cols
teamColumns = ['category', 'average', 'stddev', 'teamRank', 'text']
@Lazy @Lazy
def showTeamResults(self): def showTeamResults(self):
for c in self.feedbackColumns: for c in self.feedbackColumns:
@ -137,9 +159,6 @@ class SurveyView(InstitutionMixin, ConceptView):
pred = self.conceptManager.get('ismember') pred = self.conceptManager.get('ismember')
if pred is None: if pred is None:
return result return result
#personId = respManager.personId
#person = self.getObjectForUid(personId)
#inst = person.getParents([pred])
inst = self.institution inst = self.institution
instUid = self.getUidForObject(inst) instUid = self.getUidForObject(inst)
if inst: if inst:
@ -167,6 +186,8 @@ class SurveyView(InstitutionMixin, ConceptView):
return result return result
def results(self): def results(self):
if self.report:
return self.teamResults(self.report)
form = self.request.form form = self.request.form
action = None action = None
for k in ('submit', 'save'): for k in ('submit', 'save'):
@ -208,12 +229,27 @@ class SurveyView(InstitutionMixin, ConceptView):
for r in values] for r in values]
if self.showTeamResults: if self.showTeamResults:
self.teamData = self.getTeamData(respManager) self.teamData = self.getTeamData(respManager)
teamValues = response.getTeamResult(values, self.teamData) groups = [r['group'] for r in values]
teamValues = response.getTeamResult(groups, self.teamData)
for idx, r in enumerate(teamValues): for idx, r in enumerate(teamValues):
result[idx]['average'] = int(round(r['average'] * 100)) result[idx]['average'] = int(round(r['average'] * 100))
result[idx]['teamRank'] = r['rank'] result[idx]['teamRank'] = r['rank']
return result return result
def teamResults(self, report):
result = []
respManager = Responses(self.context)
self.teamData = self.getTeamData(respManager)
response = Response(self.adapted, None)
groups = self.adapted.questionGroups
teamValues = response.getTeamResult(groups, self.teamData)
for idx, r in enumerate(teamValues):
item = dict(category=r['group'].title,
average=int(round(r['average'] * 100)),
teamRank=r['rank'])
result.append(item)
return result
def check(self, response): def check(self, response):
errors = [] errors = []
values = response.values values = response.values

View file

@ -4,6 +4,9 @@
<metal:block define-macro="survey" <metal:block define-macro="survey"
tal:define="feedback item/results; tal:define="feedback item/results;
report request/report|nothing;
reportMacro python:
'report_' + (report or 'standard');
errors item/errors; errors item/errors;
message item/message; message item/message;
dummy item/update"> dummy item/update">
@ -16,48 +19,7 @@
</tal:description> </tal:description>
<div tal:condition="feedback"> <div tal:condition="feedback">
<h3 i18n:translate="">Feedback</h3> <metal:block use-macro="item/template/macros/?reportMacro" />
<div tal:define="header item/adapted/feedbackHeader"
tal:condition="header"
tal:content="structure python:
item.renderText(header, 'text/restructured')" />
<table class="listing">
<tr>
<th i18n:translate="">Category</th>
<th tal:repeat="col item/feedbackColumns"
i18n:translate=""
tal:attributes="class python:
col['name'] != 'text' and 'center' or None"
tal:content="col/label" />
</tr>
<tr style="vertical-align: top"
tal:repeat="fbitem feedback">
<td style="vertical-align: top"
tal:content="fbitem/category" />
<tal:cols repeat="col item/feedbackColumns">
<td style="vertical-align: top"
tal:define="name col/name"
tal:attributes="class python:name != 'text' and 'center' or None"
tal:content="fbitem/?name" />
</tal:cols>
</tr>
</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 href="" xxonclick="back(); return false"
i18n:translate=""
tal:attributes="href string:${request/URL}${item/urlParamString}">
Back to Questionnaire</a>
<br />
</div>
<div tal:define="footer item/adapted/feedbackFooter"
tal:condition="footer"
tal:content="structure python:
item.renderText(footer, 'text/restructured')" />
</div> </div>
<div id="questionnaire" <div id="questionnaire"
@ -65,6 +27,16 @@
<tal:inst condition="item/adapted/teamBasedEvaluation"> <tal:inst condition="item/adapted/teamBasedEvaluation">
<metal:inst use-macro="item/knowledge_macros/select_institution" /> <metal:inst use-macro="item/knowledge_macros/select_institution" />
</tal:inst> </tal:inst>
<div class="button"
tal:define="reports item/teamReports"
tal:condition="reports">
<b i18n:translate="label_survey_show_report">Show Report</b>: &nbsp;
<a tal:repeat="report reports"
tal:attributes="href string:${request/URL}?report=${report/name}"
i18n:translate=""
tal:content="report/label" />
<br /><br />
</div>
<h3 i18n:translate="">Questionnaire</h3> <h3 i18n:translate="">Questionnaire</h3>
<div class="error" <div class="error"
tal:condition="errors"> tal:condition="errors">
@ -153,4 +125,58 @@
</metal:block> </metal:block>
<metal:block define-macro="report_standard">
<h3 i18n:translate="">Feedback</h3>
<div tal:define="header item/adapted/feedbackHeader"
tal:condition="header"
tal:content="structure python:
item.renderText(header, 'text/restructured')" />
<table class="listing">
<tr>
<th i18n:translate="">Category</th>
<th tal:repeat="col item/feedbackColumns"
i18n:translate=""
tal:attributes="class python:
col['name'] != 'text' and 'center' or None"
tal:content="col/label" />
</tr>
<tr style="vertical-align: top"
tal:repeat="fbitem feedback">
<td style="vertical-align: top"
tal:content="fbitem/category" />
<tal:cols repeat="col item/feedbackColumns">
<td style="vertical-align: top"
tal:define="name col/name"
tal:attributes="class python:name != 'text' and 'center' or None"
tal:content="fbitem/?name|string:" />
</tal:cols>
</tr>
</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 href="" xxonclick="back(); return false"
i18n:translate=""
tal:attributes="href string:${request/URL}${item/urlParamString}">
Back to Questionnaire</a>
<br />
</div>
<div tal:define="footer item/adapted/feedbackFooter"
tal:condition="footer"
tal:content="structure python:
item.renderText(footer, 'text/restructured')" />
</metal:block>
<metal:block define-macro="report_questions">
<h3 i18n:translate="label_survey_report_questions"></h3>
<div>
Not yet implemented
</div>
</metal:block>
</html> </html>

Binary file not shown.

View file

@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: 0.13.1\n" "Project-Id-Version: 0.13.1\n"
"POT-Creation-Date: 2007-05-22 12:00 CET\n" "POT-Creation-Date: 2007-05-22 12:00 CET\n"
"PO-Revision-Date: 2015-04-20 12:00 CET\n" "PO-Revision-Date: 2015-04-21 12:00 CET\n"
"Last-Translator: Helmut Merz <helmutm@cy55.de>\n" "Last-Translator: Helmut Merz <helmutm@cy55.de>\n"
"Language-Team: loops developers <helmutm@cy55.de>\n" "Language-Team: loops developers <helmutm@cy55.de>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -285,6 +285,15 @@ msgstr "Trifft eher zu"
msgid "survey_value_3" msgid "survey_value_3"
msgstr "Trifft für unser Unternehmen voll und ganz zu" msgstr "Trifft für unser Unternehmen voll und ganz zu"
msgid "label_survey_show_report"
msgstr "Auswertung anzeigen"
msgid "label_survey_report_standard"
msgstr "Standard-Auswertung"
msgid "label_survey_report_questions"
msgstr "Einzelfragen-Auswertung"
msgid "Evaluate Questionnaire" msgid "Evaluate Questionnaire"
msgstr "Fragebogen auswerten" msgstr "Fragebogen auswerten"