diff options
Diffstat (limited to 'lib/Server.py')
| -rw-r--r-- | lib/Server.py | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/Server.py b/lib/Server.py new file mode 100644 index 0000000..00bae9f --- /dev/null +++ b/lib/Server.py @@ -0,0 +1,73 @@ +from flask import Flask +from flask import abort, redirect, url_for, request, jsonify +import sys, os +sys.path.append("./lib") +from Pb import * + +class InvalidUsage(Exception): + status_code = 400 + + def __init__(self, message, status_code=None, payload=None): + Exception.__init__(self) + self.message = message + if status_code is not None: + self.status_code = status_code + self.payload = payload + + def to_dict(self): + rv = dict(self.payload or ()) + rv['message'] = self.message + return rv + +class Server(object): + def __init__(self): + self.app = Flask(__name__) + @self.app.route('/<pb_classname>', methods=['POST']) + def pb(pb_classname): + return self._response_post(pb_classname, request.form.to_dict()) + + @self.app.errorhandler(InvalidUsage) + def handle_invalid_usage(error): + response = jsonify(error.to_dict()) + response.status_code = error.status_code + return response + + self._classname_aliases = { + 'generate' : 'PbGenerate', + 'imgrid' : 'PbGrid', + 'imbreak' : 'PbBreak', + 'impattern' : 'PbPattern', + 'imgradient' : 'PbGradient', + 'landscape' : 'PbLandscape', + } + + def _find_class_by_name(self, pb_classname): + pb_classname = self._classname_aliases.get(pb_classname, None) or pb_classname + try: + return filter(lambda c: c.__name__ == pb_classname, Pb.__subclasses__())[0] + except IndexError: + raise InvalidUsage('No such api', status_code=410) + + def _response_post(self, pb_classname, request_form): + pb_class = self._find_class_by_name(pb_classname) + classnames = map(lambda c: c.__name__, Pb.__subclasses__()) + try: + pb = pb_class(**request_form) + pb.create(); + pb.file_s3move() + pb.db_send(); + return jsonify(pb.file_dict()); + + #FIXME handle BadParamsError and PbError separately + except Exception as e: + sys.stderr.write("%s failure" % pb_class.__name__) + sys.stderr.write("params:\n") + sys.stderr.write(str(e)) + for i in request_form.keys(): + sys.stderr.write("{}:{}\n".format(i, request_form[i])) + raise; + return jsonify({ 'error' : 'Request could not be processed' }) + + def run(self): + self.app.run() + |
