provide survey data export
This commit is contained in:
parent
cd2eeaeed2
commit
55354b780e
5 changed files with 65 additions and 1 deletions
|
@ -21,15 +21,20 @@ Definition of view classes and other browser related stuff for
|
||||||
surveys and self-assessments.
|
surveys and self-assessments.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import csv
|
||||||
|
from cStringIO import StringIO
|
||||||
from zope.app.pagetemplate import ViewPageTemplateFile
|
from zope.app.pagetemplate import ViewPageTemplateFile
|
||||||
from zope.cachedescriptors.property import Lazy
|
from zope.cachedescriptors.property import Lazy
|
||||||
from zope.i18n import translate
|
from zope.i18n import translate
|
||||||
|
|
||||||
from cybertools.knowledge.survey.questionnaire import Response
|
from cybertools.knowledge.survey.questionnaire import Response
|
||||||
|
from cybertools.util.date import formatTimeStamp
|
||||||
from loops.browser.concept import ConceptView
|
from loops.browser.concept import ConceptView
|
||||||
|
from loops.browser.node import NodeView
|
||||||
from loops.common import adapted
|
from loops.common import adapted
|
||||||
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.util import getObjectForUid
|
||||||
from loops.util import _
|
from loops.util import _
|
||||||
|
|
||||||
|
|
||||||
|
@ -116,3 +121,54 @@ class SurveyView(ConceptView):
|
||||||
return noAnswer + [dict(value=i, checked=(setting == i), radio=True)
|
return noAnswer + [dict(value=i, checked=(setting == i), radio=True)
|
||||||
for i in reversed(range(question.answerRange))]
|
for i in reversed(range(question.answerRange))]
|
||||||
|
|
||||||
|
|
||||||
|
class SurveyCsvExport(NodeView):
|
||||||
|
|
||||||
|
encoding = 'ISO8859-15'
|
||||||
|
|
||||||
|
def encode(self, text):
|
||||||
|
text.encode(self.encoding)
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def questions(self):
|
||||||
|
result = []
|
||||||
|
for idx1, qug in enumerate(adapted(self.virtualTargetObject).questionGroups):
|
||||||
|
for idx2, qu in enumerate(qug.questions):
|
||||||
|
result.append((idx1, idx2, qug, qu))
|
||||||
|
return result
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def columns(self):
|
||||||
|
infoCols = ['Name', 'Timestamp']
|
||||||
|
dataCols = ['%02i-%02i' % (item[0], item[1]) for item in self.questions]
|
||||||
|
return infoCols + dataCols
|
||||||
|
|
||||||
|
def getRows(self):
|
||||||
|
for tr in Responses(self.virtualTargetObject).getAllTracks():
|
||||||
|
p = adapted(getObjectForUid(tr.userName))
|
||||||
|
name = p and p.title or u'???'
|
||||||
|
ts = formatTimeStamp(tr.timeStamp)
|
||||||
|
cells = [tr.data.get(qu.uid, -1)
|
||||||
|
for (idx1, idx2, qug, qu) in self.questions]
|
||||||
|
yield [name, ts] + cells
|
||||||
|
|
||||||
|
def __call__(self):
|
||||||
|
f = StringIO()
|
||||||
|
writer = csv.writer(f, delimiter=',')
|
||||||
|
writer.writerow(self.columns)
|
||||||
|
for row in self.getRows():
|
||||||
|
writer.writerow(row)
|
||||||
|
text = f.getvalue()
|
||||||
|
self.setDownloadHeader(text)
|
||||||
|
return text
|
||||||
|
|
||||||
|
def setDownloadHeader(self, text):
|
||||||
|
response = self.request.response
|
||||||
|
filename = 'survey_data.csv'
|
||||||
|
response.setHeader('Content-Disposition',
|
||||||
|
'attachment; filename=%s' % filename)
|
||||||
|
response.setHeader('Cache-Control', '')
|
||||||
|
response.setHeader('Pragma', '')
|
||||||
|
response.setHeader('Content-Length', len(text))
|
||||||
|
response.setHeader('Content-Type', 'text/csv')
|
||||||
|
|
||||||
|
|
|
@ -68,4 +68,9 @@
|
||||||
factory="loops.knowledge.survey.browser.SurveyView"
|
factory="loops.knowledge.survey.browser.SurveyView"
|
||||||
permission="zope.View" />
|
permission="zope.View" />
|
||||||
|
|
||||||
|
<browser:page name="survey_data.csv"
|
||||||
|
for="loops.interfaces.IView"
|
||||||
|
class="loops.knowledge.survey.browser.SurveyCsvExport"
|
||||||
|
permission="zope.View" />
|
||||||
|
|
||||||
</configure>
|
</configure>
|
||||||
|
|
|
@ -51,6 +51,9 @@ class Responses(BaseRecordManager):
|
||||||
return tracks[0].data
|
return tracks[0].data
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
def getAllTracks(self):
|
||||||
|
return self.storage.query(taskId=self.uid)
|
||||||
|
|
||||||
|
|
||||||
class Response(Track):
|
class Response(Track):
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -3,7 +3,7 @@ msgstr ""
|
||||||
|
|
||||||
"Project-Id-Version: 0.13.0\n"
|
"Project-Id-Version: 0.13.0\n"
|
||||||
"POT-Creation-Date: 2007-05-22 12:00 CET\n"
|
"POT-Creation-Date: 2007-05-22 12:00 CET\n"
|
||||||
"PO-Revision-Date: 2013-03-18 12:00 CET\n"
|
"PO-Revision-Date: 2013-03-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"
|
||||||
|
|
Loading…
Add table
Reference in a new issue