feature(Web Interface): Add basic HTTP API and Job database
This commit is contained in:
		
							parent
							
								
									634af758ff
								
							
						
					
					
						commit
						5b54cf18a8
					
				
					 2 changed files with 87 additions and 0 deletions
				
			
		
							
								
								
									
										0
									
								
								ed_lrr_gui/web/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								ed_lrr_gui/web/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
								
								
									
										87
									
								
								ed_lrr_gui/web/__main__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								ed_lrr_gui/web/__main__.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -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/<uuid:job_id>") | ||||
| 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) | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue