diff --git a/knowledge/survey/browser.py b/knowledge/survey/browser.py index a614d7f..6b6c767 100644 --- a/knowledge/survey/browser.py +++ b/knowledge/survey/browser.py @@ -21,15 +21,20 @@ Definition of view classes and other browser related stuff for surveys and self-assessments. """ +import csv +from cStringIO import StringIO from zope.app.pagetemplate import ViewPageTemplateFile from zope.cachedescriptors.property import Lazy from zope.i18n import translate from cybertools.knowledge.survey.questionnaire import Response +from cybertools.util.date import formatTimeStamp from loops.browser.concept import ConceptView +from loops.browser.node import NodeView from loops.common import adapted from loops.knowledge.survey.response import Responses from loops.organize.party import getPersonForUser +from loops.util import getObjectForUid from loops.util import _ @@ -116,3 +121,54 @@ class SurveyView(ConceptView): return noAnswer + [dict(value=i, checked=(setting == i), radio=True) 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') + diff --git a/knowledge/survey/configure.zcml b/knowledge/survey/configure.zcml index dd27bff..423889d 100644 --- a/knowledge/survey/configure.zcml +++ b/knowledge/survey/configure.zcml @@ -68,4 +68,9 @@ factory="loops.knowledge.survey.browser.SurveyView" permission="zope.View" /> + + diff --git a/knowledge/survey/response.py b/knowledge/survey/response.py index 647af14..b27979e 100644 --- a/knowledge/survey/response.py +++ b/knowledge/survey/response.py @@ -51,6 +51,9 @@ class Responses(BaseRecordManager): return tracks[0].data return {} + def getAllTracks(self): + return self.storage.query(taskId=self.uid) + class Response(Track): diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index 4b3d58f..fca2a64 100644 Binary files a/locales/de/LC_MESSAGES/loops.mo and b/locales/de/LC_MESSAGES/loops.mo differ diff --git a/locales/de/LC_MESSAGES/loops.po b/locales/de/LC_MESSAGES/loops.po index 4b39018..a73d55a 100644 --- a/locales/de/LC_MESSAGES/loops.po +++ b/locales/de/LC_MESSAGES/loops.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: 0.13.0\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 \n" "Language-Team: loops developers \n" "MIME-Version: 1.0\n"