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"