Mercurial > odfcast > odfcast
annotate odfcast/convert.py @ 16:f4920ab1d27c
Add basic html interface for convert
This allow testing the code via the browser
author | Björn Ricks <bjoern.ricks@intevation.de> |
---|---|
date | Mon, 29 Sep 2014 14:02:55 +0200 |
parents | 46f31348fe01 |
children | 585904e7411a |
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 |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
3 import tempfile |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
4 |
16
f4920ab1d27c
Add basic html interface for convert
Björn Ricks <bjoern.ricks@intevation.de>
parents:
4
diff
changeset
|
5 from flask import request, Response, json, render_template |
0
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
6 from flask.views import MethodView |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
7 |
4
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
8 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
|
9 |
0
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
10 ALLOWED_FORMATS = ["pdf", "doc", "docx", "odt"] |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
11 |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
12 MIMETYPES = { |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
13 "odt": "application/vnd.oasis.opendocument.text", |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
14 "doc": "application/msword", |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
15 "docx": "application/vnd.openxmlformats-officedocument" |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
16 ".wordprocessingml.document", |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
17 "pdf": "application/pdf", |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
18 } |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
19 |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
20 DEFAULT_MIMETYPE = "application/octet-stream" |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
21 |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
22 |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
23 class ConvertView(MethodView): |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
24 |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
25 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
|
26 driver_module = self._load_driver_module(pyuno_driver_name) |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
27 self.convertor = driver_module.Convertor(hostname, port) |
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 def _load_driver_module(self, pyuno_driver_name): |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
30 return __import__(pyuno_driver_name, globals(), locals(), |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
31 ["Convertor"]) |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
32 |
3
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
33 def is_format_supported(self, fformat): |
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
34 return fformat and fformat.lower() in ALLOWED_FORMATS |
0
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
35 |
3
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
36 def post(self): |
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
37 ffile = request.files['file'] |
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
38 fformat = request.form['format'] |
0
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 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
|
41 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
|
42 |
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
43 infile = self.save_form_file(ffile) |
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
44 outfile = self.convert(infile, fformat) |
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
45 mimetype = self.get_mimetype_for_format(fformat) |
0
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
46 return Response(outfile, mimetype=mimetype) |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
47 |
16
f4920ab1d27c
Add basic html interface for convert
Björn Ricks <bjoern.ricks@intevation.de>
parents:
4
diff
changeset
|
48 def get(self): |
f4920ab1d27c
Add basic html interface for convert
Björn Ricks <bjoern.ricks@intevation.de>
parents:
4
diff
changeset
|
49 return render_template("convert.html") |
f4920ab1d27c
Add basic html interface for convert
Björn Ricks <bjoern.ricks@intevation.de>
parents:
4
diff
changeset
|
50 |
3
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
51 def save_form_file(self, infile): |
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
52 outfile = tempfile.NamedTemporaryFile() |
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
53 infile.save(outfile.name) |
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
54 return outfile |
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
55 |
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
56 def convert(self, infile, fformat): |
0
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
57 outfile = tempfile.NamedTemporaryFile() |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
58 |
3
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
59 self.convertor.convert(infile.name, outfile.name, fformat) |
0
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
60 |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
61 infile.close() |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
62 return outfile |
4a34f72f036b
Add initial conversion service
Björn Ricks <bjoern.ricks@intevation.de>
parents:
diff
changeset
|
63 |
3
15807d87930c
Refactor ConvertView to be easier reusable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
0
diff
changeset
|
64 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
|
65 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
|
66 |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
67 |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
68 class TemplateConvertView(ConvertView): |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
69 |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
70 def post(self): |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
71 ffile = request.files['file'] |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
72 fformat = request.form['format'] |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
73 datadict = self.get_datadict() |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
74 |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
75 if not self.is_format_supported(fformat): |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
76 return "Format %s not allowed" % fformat, 401 |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
77 |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
78 tfile = self.save_form_file(ffile) |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
79 outfile = tempfile.NamedTemporaryFile() |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
80 t = Template(tfile, outfile.name) |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
81 t.render(datadict) |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
82 |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
83 if fformat != "odt": |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
84 outfile = self.convert(outfile, fformat) |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
85 |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
86 mimetype = self.get_mimetype_for_format(fformat) |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
87 return Response(outfile, mimetype=mimetype) |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
88 |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
89 def get_datadict(self): |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
90 vars = request.form['datadict'] |
46f31348fe01
Implement a TemplateConvertView to allow convert odt templates with variable
Björn Ricks <bjoern.ricks@intevation.de>
parents:
3
diff
changeset
|
91 return json.loads(vars) |