annotate odfcast/convert.py @ 41:a1100ec32be2

Log exception on rendering errors
author Björn Ricks <bjoern.ricks@intevation.de>
date Mon, 20 Oct 2014 16:16:53 +0200
parents 89ffa12bd48d
children 6d511e93a331
rev   line source
0
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
2
29
1dadc59c4b9a Make the conversion more error prone
Björn Ricks <bjoern.ricks@intevation.de>
parents: 22
diff changeset
3 import logging
0
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
4 import tempfile
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
5
16
f4920ab1d27c Add basic html interface for convert
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4
diff changeset
6 from flask import request, Response, json, render_template
0
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
7 from flask.views import MethodView
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
8
4
46f31348fe01 Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 3
diff changeset
9 from py3o.template import Template
46f31348fe01 Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 3
diff changeset
10
19
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
11 from PyPDF2 import PdfFileMerger
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
12
29
1dadc59c4b9a Make the conversion more error prone
Björn Ricks <bjoern.ricks@intevation.de>
parents: 22
diff changeset
13 log = logging.getLogger(__name__)
19
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
14
0
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
15 ALLOWED_FORMATS = ["pdf", "doc", "docx", "odt"]
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
16
19
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
17 PDF_MIMETYPE = "application/pdf"
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
18
0
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
19 MIMETYPES = {
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
20 "odt": "application/vnd.oasis.opendocument.text",
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
21 "doc": "application/msword",
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
22 "docx": "application/vnd.openxmlformats-officedocument"
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
23 ".wordprocessingml.document",
19
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
24 "pdf": PDF_MIMETYPE,
0
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
25 }
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
26
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
27 DEFAULT_MIMETYPE = "application/octet-stream"
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
28
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
29
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
30 class ConvertView(MethodView):
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
31
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
32 def __init__(self, pyuno_driver_name="", hostname="localhost", port=2001):
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
33 driver_module = self._load_driver_module(pyuno_driver_name)
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
34 self.convertor = driver_module.Convertor(hostname, port)
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
35
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
36 def _load_driver_module(self, pyuno_driver_name):
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
37 return __import__(pyuno_driver_name, globals(), locals(),
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
38 ["Convertor"])
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
39
3
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
40 def is_format_supported(self, fformat):
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
41 return fformat and fformat.lower() in ALLOWED_FORMATS
0
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
42
3
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
43 def post(self):
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
44 ffile = request.files['file']
29
1dadc59c4b9a Make the conversion more error prone
Björn Ricks <bjoern.ricks@intevation.de>
parents: 22
diff changeset
45 if not ffile.filename:
1dadc59c4b9a Make the conversion more error prone
Björn Ricks <bjoern.ricks@intevation.de>
parents: 22
diff changeset
46 return "Please upload a file for conversion", 401
1dadc59c4b9a Make the conversion more error prone
Björn Ricks <bjoern.ricks@intevation.de>
parents: 22
diff changeset
47
3
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
48 fformat = request.form['format']
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
49 if not self.is_format_supported(fformat):
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
50 return "Format %s not allowed" % fformat, 401
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
51
30
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
52 datadict = self.get_datadict()
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
53
29
1dadc59c4b9a Make the conversion more error prone
Björn Ricks <bjoern.ricks@intevation.de>
parents: 22
diff changeset
54 mimetype = self.get_mimetype_for_format(fformat)
1dadc59c4b9a Make the conversion more error prone
Björn Ricks <bjoern.ricks@intevation.de>
parents: 22
diff changeset
55
30
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
56 outfile = self.save_form_file(ffile)
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
57
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
58 if datadict:
31
83bca7dc9bfe Return error response when a template couldn't be rendered
Björn Ricks <bjoern.ricks@intevation.de>
parents: 30
diff changeset
59 try:
83bca7dc9bfe Return error response when a template couldn't be rendered
Björn Ricks <bjoern.ricks@intevation.de>
parents: 30
diff changeset
60 tfile = tempfile.NamedTemporaryFile()
83bca7dc9bfe Return error response when a template couldn't be rendered
Björn Ricks <bjoern.ricks@intevation.de>
parents: 30
diff changeset
61 t = Template(outfile, tfile)
83bca7dc9bfe Return error response when a template couldn't be rendered
Björn Ricks <bjoern.ricks@intevation.de>
parents: 30
diff changeset
62 t.render(datadict)
83bca7dc9bfe Return error response when a template couldn't be rendered
Björn Ricks <bjoern.ricks@intevation.de>
parents: 30
diff changeset
63 outfile.close()
83bca7dc9bfe Return error response when a template couldn't be rendered
Björn Ricks <bjoern.ricks@intevation.de>
parents: 30
diff changeset
64 outfile = tfile
83bca7dc9bfe Return error response when a template couldn't be rendered
Björn Ricks <bjoern.ricks@intevation.de>
parents: 30
diff changeset
65 except:
41
a1100ec32be2 Log exception on rendering errors
Björn Ricks <bjoern.ricks@intevation.de>
parents: 34
diff changeset
66 log.exception("Template error")
31
83bca7dc9bfe Return error response when a template couldn't be rendered
Björn Ricks <bjoern.ricks@intevation.de>
parents: 30
diff changeset
67 return "Template error", 500
30
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
68
32
e6f2f1481de2 Fix we must check the fformat variable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 31
diff changeset
69 if fformat != "odt":
30
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
70 try:
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
71 outfile = self.convert(outfile, fformat)
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
72 except:
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
73 log.exception("Conversion error")
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
74 return "Conversion error", 500
29
1dadc59c4b9a Make the conversion more error prone
Björn Ricks <bjoern.ricks@intevation.de>
parents: 22
diff changeset
75
0
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
76 return Response(outfile, mimetype=mimetype)
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
77
16
f4920ab1d27c Add basic html interface for convert
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4
diff changeset
78 def get(self):
f4920ab1d27c Add basic html interface for convert
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4
diff changeset
79 return render_template("convert.html")
f4920ab1d27c Add basic html interface for convert
Björn Ricks <bjoern.ricks@intevation.de>
parents: 4
diff changeset
80
3
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
81 def save_form_file(self, infile):
33
00e12392f8d4 Fix saving uploaded form file to a temporary file
Björn Ricks <bjoern.ricks@intevation.de>
parents: 32
diff changeset
82 outfile = tempfile.NamedTemporaryFile()
30
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
83 infile.save(outfile)
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
84 infile.close()
33
00e12392f8d4 Fix saving uploaded form file to a temporary file
Björn Ricks <bjoern.ricks@intevation.de>
parents: 32
diff changeset
85 outfile.seek(0)
3
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
86 return outfile
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
87
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
88 def convert(self, infile, fformat):
0
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
89 outfile = tempfile.NamedTemporaryFile()
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
90
3
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
91 self.convertor.convert(infile.name, outfile.name, fformat)
0
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
92
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
93 infile.close()
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
94 return outfile
4a34f72f036b Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff changeset
95
3
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
96 def get_mimetype_for_format(self, fformat):
15807d87930c Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 0
diff changeset
97 return MIMETYPES.get(fformat, DEFAULT_MIMETYPE)
4
46f31348fe01 Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 3
diff changeset
98
46f31348fe01 Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 3
diff changeset
99 def get_datadict(self):
34
89ffa12bd48d Allow to not passing any datadict to the conversion form
Björn Ricks <bjoern.ricks@intevation.de>
parents: 33
diff changeset
100 vars = request.form.get('datadict')
30
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
101 if not vars:
9d65de2ebe22 Merge TemplateConvertView into ConvertView
Björn Ricks <bjoern.ricks@intevation.de>
parents: 29
diff changeset
102 return None
4
46f31348fe01 Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents: 3
diff changeset
103 return json.loads(vars)
18
585904e7411a Add html for converting a odf with a template
Björn Ricks <bjoern.ricks@intevation.de>
parents: 16
diff changeset
104
19
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
105
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
106 class MergeView(MethodView):
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
107
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
108 def get(self):
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
109 return render_template("merge.html")
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
110
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
111 def post(self):
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
112 merger = PdfFileMerger()
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
113 ffiles = request.files.getlist('files')
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
114
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
115 for ffile in ffiles:
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
116 merger.append(ffile)
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
117
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
118 outfile = tempfile.NamedTemporaryFile()
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
119
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
120 merger.write(outfile.name)
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
121
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
122 merger.close()
2f627039d2b4 Add a MergeView to merge pdfs based on PyPDF2
Björn Ricks <bjoern.ricks@intevation.de>
parents: 18
diff changeset
123 return Response(outfile, mimetype=PDF_MIMETYPE)
22
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
124
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
125
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
126 class TemplateView(MethodView):
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
127
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
128 template_name = ""
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
129
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
130 def __init__(self, template_name=None):
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
131 if template_name:
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
132 self.template_name = template_name
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
133
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
134 def get_template_name(self):
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
135 return self.template_name
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
136
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
137 def get(self):
0e40926735e1 Add a generic View to display a template for a get request
Björn Ricks <bjoern.ricks@intevation.de>
parents: 19
diff changeset
138 return render_template(self.get_template_name())
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)