def buildCSV(formItem, items): items = list(items) keys = set() map(lambda item: keys.update(item.data.keys()), items) keys = ['ctime'] + list(keys) def genRows(): # Headers yield dict([(k,k) for k in keys]) # Answer set for item in items: rv = {} rv.update( dict([(key,item.data.get(key,'') or '') for key in keys]) ) rv['ctime'] = str(item.ctime) yield rv buf = StringIO() writer = csv.DictWriter(buf, keys) writer.writerows(csvutil.encodeDictFilter(genRows())) buf.flush() from nevow import inevow, static filename=str('%s_data.csv'%formItem.name) inevow.IRequest(ctx).setHeader('Cache-Control', 'no-cache, must-revalidate, no-store') inevow.IRequest(ctx).setHeader('Content-disposition', 'attachement ; filename=%s'%filename) return static.Data(buf.getvalue(), mimetypes.guess_type(filename)[0])
def gotAnswers(answers): questionnaire, questions = csvpack.parse(self.questionnaire._CSVPackDir()) keys = [n[-1].fullKey for n in questionnaire.walk() if n[-1].isQuestion()] def genRows(): # Headers yield dict([(k,k) for k in keys]) # Answer set for answer in answers: yield dict([(key,answer.answers.get(key,'') or '') for key in keys]) buf = StringIO() writer = csv.DictWriter(buf, keys) writer.writerows(csvutil.encodeDictFilter(genRows())) buf.flush() from nevow import inevow, static inevow.IRequest(ctx).setHeader('Cache-Control', 'no-cache, must-revalidate, no-store') return static.Data(buf.getvalue(), mimetypes.guess_type(name)[0])