This commit is contained in:
Askill 2020-03-15 20:02:37 +01:00
parent 5bb69eef31
commit 536a0b2f6d
19 changed files with 414 additions and 0 deletions

7
Dockerfile Normal file
View File

@ -0,0 +1,7 @@
FROM python
COPY ./certs /certs
COPY ./ /app
RUN pip install -r /app/requirements.txt
CMD python /app/run.py

View File

@ -1 +1,7 @@
BioSys BioSys
# Notes
FingerprintID: 0 is the left pinky 9 is the right pinky, people with more than 10 fingers may use another system.

Binary file not shown.

Binary file not shown.

21
application/__init__.py Normal file
View File

@ -0,0 +1,21 @@
from flask import Flask, request, g, render_template
from flask_restful import Resource, reqparse
from flask_restful_swagger_3 import Api
from flask_cors import CORS
import os
from json import dumps
import application.endpoints as endpoints
import application.config as config
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
api = Api(app, version='1', contact={"name":""}, license={"name":"Online Dienst Dokumentation"}, api_spec_url='/api/swagger')
api.add_resource(endpoints.PersonList,'/api/v1/person/<string:id>')
@app.route("/")
def index():
"""serve the ui"""
return render_template("index.html")

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

2
application/config.py Normal file
View File

@ -0,0 +1,2 @@
debug = True

39
application/db.py Normal file
View File

@ -0,0 +1,39 @@
import sqlalchemy as db
from sqlalchemy import Column, String, Integer, Numeric, Table, DateTime, ARRAY, ForeignKey, create_engine, LargeBinary, Enum
from sqlalchemy.orm import sessionmaker, relationship, column_property
from datetime import datetime
from sqlalchemy.ext.declarative import declarative_base
import enum
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
engine = db.create_engine('sqlite:///./test.sqlite', echo=True)
connection = engine.connect()
Base = declarative_base()
Session = sessionmaker(bind=engine)
class Gender(enum.Enum):
other = "other"
male = "male"
female = "female"
class Person(Base):
__tablename__ = "person"
person_id = Column('person_id', Integer, primary_key=True, autoincrement=True)
timestamp = Column('timestamp', DateTime, default=datetime.utcnow)
fname = Column('fname', String(50))
lname = Column('lname', String(50))
yob = Column('yob', Integer)
gender = Column('gender', Enum(Gender))
face = Column('face', LargeBinary)
fingerprints = relationship("Fingerprint", foreign_keys='Fingerprint.person_id')
class Fingerprint(Base):
__tablename__ = "fingerprint"
person_id = Column('person_id', Integer, ForeignKey('person.person_id'), primary_key=True)
fingerprint_id = Column('fingerprint_id', Integer, primary_key=True) # 0: left pinky; 9: right pinky
timestamp = Column('timestamp', DateTime, default=datetime.utcnow)
fingerprint = Column('fingerprint', LargeBinary)
Base.metadata.create_all(engine)

54
application/endpoints.py Normal file
View File

@ -0,0 +1,54 @@
from flask_restful import Resource, reqparse
import flask
import requests
import application.config as config
import json
from application.db import Session, Person
class PersonList(Resource):
def post(self, id):
""" """
try:
data = ""
return flask.make_response(flask.jsonify({'data': data}), 201)
except Exception as e:
print("error: -", e)
return flask.make_response(flask.jsonify({'error': str(e)}), 400)
def get(self, id):
""" """
try:
session = Session()
person = Person(fname="hi")
session.add(person)
session.commit()
data = list(session.query(Person).all())
arr = []
for x in data:
arr.append(json.loads(x))
print(arr)
return flask.make_response(flask.jsonify({'data': arr}), 200)
except Exception as e:
print("error: -", e)
return flask.make_response(flask.jsonify({'error': str(e)}), 400)
def put(self, id):
""" """
try:
data = ""
return flask.make_response(flask.jsonify({'data': data}), 200)
except Exception as e:
print("error: -", e)
return flask.make_response(flask.jsonify({'error': str(e)}), 400)
def delete(self, id):
""" """
try:
data = ""
return flask.make_response(flask.jsonify({'data': data}), 204)
except Exception as e:
print("error: -", e)
return flask.make_response(flask.jsonify({'error': str(e)}), 400)

View File

@ -0,0 +1,23 @@
.demo{
max-width: 60%;
min-width: 100px;
padding: 20px;
}
.container{
padding:0 !important;
}
.demo2{
margin-left: -10px;
}
.bg-primary1{
background-color: rgb(255, 230, 183) !important;
}
.bg-warning1{
background-color: rgb(255, 250, 175)!important;
}
.bg-info1{
background-color: rgb(210, 253, 193)!important;
}

137
application/static/main.js Normal file
View File

@ -0,0 +1,137 @@
var rootKontext = "/od1";
//var rootKontext = "";
var customeStyle = false;
function loadOD1(){
try{
let ksession = $.cookie("KSESSIONID");
var xmlHttp = new XMLHttpRequest();
xmlHttp.open( "GET", rootKontext, false );
xmlHttp.send();
document.getElementById("od1").innerHTML = xmlHttp.responseText;
$('link[title="custom"]').prop('disabled', true);
loadData();
}
catch(e){
document.getElementById("od1").innerHTML = "Ein Fehler ist beim Laden des Dienstes aufgetreten, bitte versuchen Sie es später erneut.";
}
}
function nextTab(){
$('#navMenu1 a').removeClass("disabled");
$('#navMenu1 a').tab('show');
}
function getJSON (url, callback) {
let ksession = $.cookie("KSESSIONID");
var xhr = new XMLHttpRequest();
xhr.open('GET', url + "?session_id=" + ksession, true);
xhr.responseType = 'json';
xhr.onload = function() {
var status = xhr.status;
if (status < 400) {
callback(null, xhr.response);
} else {
console.log("failed getting");
console.log(status);
}
};
xhr.send();
};
function putJSON (url, data, callback) {
let ksession = $.cookie("KSESSIONID");
var xhr = new XMLHttpRequest();
xhr.open('PUT', url + "?session_id=" + ksession, true);
xhr.responseType = 'json';
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function() {
var status = xhr.status;
if (status < 400) {
callback(null, xhr.response);
} else {
console.log("failed posting");
console.log(status);
}
};
xhr.send(data);
};
function sendVorhaben(){
let data = document.getElementById("form1");
data = {};
data["name"] = document.getElementById("form1")["name"].value;
data["reason"] = document.getElementById("form1")["reason"].value;
data["note"] = document.getElementById("form1")["note"].value;
data["partial_application_id"] = document.getElementById("form1")["partial_application_id"].value;
putJSON(rootKontext + "/api/v1/vorhaben/" + data["partial_application_id"], JSON.stringify(data), function(error, data){
document.getElementById("status").innerHTML = "Daten erfolgreich erneuert";
loadData();
nextTab();
});
}
function queryString(string)
{
let queryString = window.location.search;
let varArray = queryString.split("&");
for (let i=0;i<varArray.length;i++) {
let param = varArray[i].split("=");
if(param[0] == string ){
return param[1]
}
}
}
function loadData(){
let encodedID = queryString("?partialApplicationId");
//encodedID = "d05e6d3a-1774-46a0-abb0-89abfe2ff5a3";
getJSON(rootKontext + "/api/v1/vorhaben/" + encodedID,
function(error, data){
console.log(data)
populateForm(data["data"], "form1")
populateForm(data["data"], "form2")
}
);
}
function populateForm(data, formId){
console.log(data)
inputs = document.forms[formId];
for(var i = 0; i < 8; i++){
if(inputs[i] !== undefined && data[inputs[i].name] !== undefined){
inputs[i].value = data[inputs[i].name];
}
else{
console.log(inputs);
}
}
}
function loadNewStyle(){
customeStyle = !customeStyle;
if(customeStyle){
$('link[title="custom"]').prop('disabled', false);
$('link[title="default"]').prop('disabled', true);
console.log("StyleSheet: Custom");
alert("StyleSheet: Custom");
}
else{
$('link[title="default"]').prop('disabled', false);
$('link[title="custom"]').prop('disabled', true);
console.log("StyleSheet: Default");
alert("StyleSheet: Default");
}
}

View File

@ -0,0 +1,116 @@
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--Bootstrap-->
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<link rel="stylesheet" title="default" href="/od1/static/main.css">
<link rel="stylesheet" title="default" href="/static/main.css">
<link rel="stylesheet" title="custom" href="/static/main2.css">
<link rel="stylesheet" title="custom" href="/od1/static/main2.css">
<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<!-- Popper JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js"></script>
<script src="/od1/static/main.js"></script>
<script src="/static/main.js"></script>
</head>
<body>
<div class="container">
<h2>Online Dienst 1</h2>
<ul class="nav nav-tabs">
<li id="navMenu0" class="nav-item">
<a data-toggle="tab" class="nav-link active" href="#home">Eingabe</a>
</li>
<li id="navMenu1" class="nav-item ">
<a href="#menu1" data-toggle="tab" class="nav-link disabled">Übersicht</a>
</li>
</ul>
<div class="tab-content">
<div id="home" class="tab-pane container active">
<div id="header">
<input type="button" value="Aussehen ändern" class="btn btn-dark float-right" onclick="loadNewStyle()">
</div>
<form id="form1">
<div class="bg-info1 demo">
<div class="demo2">eAst POST zu OD</div>
partial_application_id:<br>
<input type="text" class="form-control" name="partial_application_id" placeholder="partial_application_id" readonly><br>
</div>
<div class="bg-warning1 demo">
<div class="demo2">OD GET an eAst</div>
sent_date:<br>
<input type="text" class="form-control" name="sent_date" placeholder="sent_date" readonly><br>
application_id:<br>
<input type="text" class="form-control" name="application_id" placeholder="application_id" readonly><br>
official_letter_required:<br>
<input type="text" class="form-control" name="official_letter_required" placeholder="official_letter_required"
readonly><br>
name:<br>
<input type="text" class="form-control" name="name" placeholder="name"><br>
status:<br>
<input type="text" class="form-control" name="status" placeholder="status" readonly><br><br>
</div>
<div class="bg-primary1 demo">
<div class="demo2">Daten des OD</div>
Grund:<br>
<input type="text" class="form-control" name="reason" placeholder="Grund"><br>
Notiz:<br>
<input type="text" class="form-control" name="note" placeholder="Notitz"><br>
</div>
<input type="button" value="Speichern" class="btn btn-dark float-right" onclick="sendVorhaben()">
</form>
</div>
<div id="menu1" class="tab-pane container">
<h2 id="status"></h2>
<form id="form2">
<div class="demo">
partial_application_id:<br>
<input type="text" class="form-control" name="partial_application_id" placeholder="partial_application_id" readonly><br>
sent_date:<br>
<input type="text" class="form-control" name="sent_date" placeholder="sent_date" readonly><br>
application_id:<br>
<input type="text" class="form-control" name="application_id" placeholder="application_id" readonly><br>
official_letter_required:<br>
<input type="text" class="form-control" name="official_letter_required" placeholder="official_letter_required"
readonly><br>
name:<br>
<input type="text" class="form-control" name="name" placeholder="name" readonly><br>
status:<br>
<input type="text" class="form-control" name="status" placeholder="status" readonly><br><br>
</div>
<div class="bg-primary1 demo">
<div class="demo2">Geänderte Daten</div>
Grund:<br>
<input type="text" class="form-control" name="reason" placeholder="Grund" readonly><br>
Notiz:<br>
<input type="text" class="form-control" name="note" placeholder="Notitz" readonly><br>
</div>
</form>
</div>
</div>
</div>
<script>loadData();</script>
</body>
</html>

5
requirements.txt Normal file
View File

@ -0,0 +1,5 @@
flask
flask_restful
sqlalchemy
requests
flask-restful-swagger-3

4
run.py Normal file
View File

@ -0,0 +1,4 @@
from application import app
app.run(host="0.0.0.0",port='10024', debug=True)

BIN
test.sqlite Normal file

Binary file not shown.