1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 | import zipfile
import StringIO
from django import http
from django.template import Context, Template
def print_odf( request, odf_path, context ):
"""
odf_path - path to the template document
context - dictionary to create context from
"""
c = Context()
for key, value in context.items():
if callable( value ):
c[key] = value()
else:
c[key] = value
# default mimetype
mimetype = 'application/vnd.oasis.opendocument.text'
# ODF is just a zipfile
input = zipfile.ZipFile( template_name, "r" )
# we cannot write directly to HttpResponse, so use StringIO
text = StringIO.StringIO()
# output document
output = zipfile.ZipFile( text, "a" )
# go through the files in source
for zi in input.filelist:
out = input.read( zi.filename )
# waut for the only interesting file
if zi.filename == 'content.xml':
# un-escape the quotes (in filters etc.)
t = Template( out.replace( '"', '"' ) )
# render the document
out = t.render( c )
elif zi.filename == 'mimetype':
# mimetype is stored within the ODF
mimetype = out
output.writestr( zi.filename, out )
# close and finish
output.close()
return http.HttpResponse( content=text.getvalue(), mimetype=mimetype )
|
Comments
HttpResponse can take file-likes directly: return http.HttpResponse(text)
#
thanks, I updated the snippet
#
Another approach to generating OpenOffice documents from Django: http://code.google.com/p/django-opendocument/
#
Line 23 should probably use "odf_path" instead of "template_name".
#