diff --git a/ed_lrr_gui/web/__init__.py b/ed_lrr_gui/web/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ed_lrr_gui/web/__main__.py b/ed_lrr_gui/web/__main__.py new file mode 100644 index 0000000..56b20c9 --- /dev/null +++ b/ed_lrr_gui/web/__main__.py @@ -0,0 +1,87 @@ +from flask import Flask,jsonify +import uuid +import json +from webargs import fields,validate +from webargs.flaskparser import use_args +from flask_sqlalchemy import SQLAlchemy +from sqlalchemy_utils import Timestamp,generic_repr +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import scoped_session, sessionmaker, relationship, backref +from sqlalchemy.types import Float,String,Boolean + +app=Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///jobs.db' +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False + +db=SQLAlchemy(app) + +@generic_repr +class Job(db.Model,Timestamp): + id = db.Column(db.String,default=lambda :str(uuid.uuid4()),primary_key=True) + jump_range = db.Column(db.Float,nullable=False) + mode = db.Column(db.String,default="bfs") + systems = db.Column(db.String) + permute= db.Column(db.String,default=None,nullable=True) + primary= db.Column(db.Boolean,default=False) + factor = db.Column(db.Float,default=0.5) + done = db.Column(db.DateTime,nullable=True,default=None) + started = db.Column(db.DateTime,nullable=True,default=None) + progress = db.Column(db.Float,default=0.0) + + #============================================================ + + @classmethod + def new(cls,**kwargs): + obj=cls(**kwargs) + db.session.add(obj) + db.session.commit() + print(obj) + return obj + + @property + def dict(self): + ret={} + for col in self.__table__.columns: + ret[col.name]=getattr(self,col.name) + ret['systems']=json.loads(ret['systems']) + return ret + + @dict.setter + def set_dict(self,*args,**kwargs): + raise NotImplementedError + +db.create_all() +db.session.commit() + +@app.errorhandler(422) +@app.errorhandler(400) +def handle_error(err): + headers = err.data.get("headers", None) + messages = err.data.get("messages", ["Invalid request."]) + if headers: + return jsonify({"errors": messages}), err.code, headers + else: + return jsonify({"errors": messages}), err.code + +@app.route("/route",methods=["GET","POST"]) +@use_args({ + "jump_range":fields.Float(required=True), + "mode": fields.String(missing="bfs",validate=validate.OneOf(["bfs","greedy","a-star"])), + "systems": fields.DelimitedList(fields.String,required=True), + "permute": fields.String(missing=None,validate=validate.OneOf(["all", "keep_first", "keep_last", "keep_both"])), + "primary": fields.Boolean(missing=False), + "factor": fields.Float(missing=0.5) +}) +def route(args): + args['systems']=json.dumps(args['systems']) + for k,v in args.items(): + print(k,v) + return jsonify({'id':Job.new(**args).id}) + +@app.route("/status/") +def status(job_id): + job=db.session.query(Job).get_or_404(str(job_id)) + return jsonify(job.dict) + +if __name__=="__main__": + app.run(host="0.0.0.0",port=3777,debug=True) \ No newline at end of file