# HG changeset patch # User Björn Ricks # Date 1411734081 -7200 # Node ID 4a34f72f036bb24d516ea7922be470538f960dcb Add initial conversion service diff -r 000000000000 -r 4a34f72f036b .hgignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Fri Sep 26 14:21:21 2014 +0200 @@ -0,0 +1,18 @@ +syntax: glob +**/*.pyc +**/*.pyo +*.swp +.tmp* +*.egg-info +dist/* +build/* +lib/* +*.orig +*.log +.settings/* +data/* +storage/* +.project +.pydevproject +*.db + diff -r 000000000000 -r 4a34f72f036b castclient.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/castclient.py Fri Sep 26 14:21:21 2014 +0200 @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import optparse +import sys + +import requests + +url = "http://127.0.0.1:5000/convert/" + + +def main(): + usage = "usage: %prog [options] infile outfile" + parser = optparse.OptionParser(usage=usage) + parser.add_option("-f", "--format", default="pdf") + parser.add_option("-s", "--host", default="localhost") + parser.add_option("-p", "--port", default="5000") + (options, args) = parser.parse_args() + + if len(args) < 2: + parser.print_usage() + sys.exit(1) + + url = "http://%s:%s/convert/" % (options.host, options.port) + infilename = args[0] + outfilename = args[1] + format = options.format + + files = {'file': open(infilename, 'rb')} + data = {'format': format} + + r = requests.post(url, data=data, files=files) + + if r.status_code == 200: + with open(outfilename, "wb") as f: + f.write(r.content) + print "OK" + else: + print "An error has occured" + print r.status_code, r.headers + sys.exit(2) + + +if __name__ == "__main__": + main() diff -r 000000000000 -r 4a34f72f036b main.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.py Fri Sep 26 14:21:21 2014 +0200 @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- + +from flask import Flask + +from odfcast.convert import ConvertView + +app = Flask(__name__) +app.config.from_object('odfcast.settings') +app.config.from_envvar('ODFCAST_SETTINGS', silent=True) + + +app.add_url_rule("/convert/", + view_func=ConvertView.as_view( + "convert", + app.config["PY3O_UNO_DRIVER"], + app.config["PY3O_UNO_SERVER_HOSTNAME"], + app.config["PY3O_UNO_SERVER_PORT"], + )) + +if __name__ == "__main__": + app.run() diff -r 000000000000 -r 4a34f72f036b odfcast/convert.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/odfcast/convert.py Fri Sep 26 14:21:21 2014 +0200 @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- + +import tempfile + +from flask import request, Response +from flask.views import MethodView + +ALLOWED_FORMATS = ["pdf", "doc", "docx", "odt"] + +MIMETYPES = { + "odt": "application/vnd.oasis.opendocument.text", + "doc": "application/msword", + "docx": "application/vnd.openxmlformats-officedocument" + ".wordprocessingml.document", + "pdf": "application/pdf", +} + +DEFAULT_MIMETYPE = "application/octet-stream" + + +class ConvertView(MethodView): + + def __init__(self, pyuno_driver_name="", hostname="localhost", port=2001): + driver_module = self._load_driver_module(pyuno_driver_name) + self.convertor = driver_module.Convertor(hostname, port) + + def _load_driver_module(self, pyuno_driver_name): + return __import__(pyuno_driver_name, globals(), locals(), + ["Convertor"]) + + def post(self): + file = request.files['file'] + format = request.form['format'] + + if format not in ALLOWED_FORMATS: + return "Format %s not allowed" % format, 401 + + outfile = self.convert(file, format) + mimetype = self.get_mimetype_for_format(format) + return Response(outfile, mimetype=mimetype) + + def convert(self, file, format): + infile = tempfile.NamedTemporaryFile() + file.save(infile.name) + outfile = tempfile.NamedTemporaryFile() + + self.convertor.convert(infile.name, outfile.name, format) + + infile.close() + return outfile + + def get_mimetype_for_format(self, format): + return MIMETYPES.get(format, DEFAULT_MIMETYPE) diff -r 000000000000 -r 4a34f72f036b odfcast/settings.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/odfcast/settings.py Fri Sep 26 14:21:21 2014 +0200 @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- + +DEBUG = True + +MAX_CONTENT_LENGTH = 50 * 1024 * 1024 # allow 200 MB upload files + +PY3O_UNO_DRIVER = "py3o.renderers.pyuno" +PY3O_UNO_SERVER_HOSTNAME = "localhost" +PY3O_UNO_SERVER_PORT = 2001