structure for adding items

This commit is contained in:
2022-10-06 01:34:31 +02:00
parent c6dc363c68
commit 8092e8b6bb
3 changed files with 96 additions and 15 deletions

View File

@@ -0,0 +1,60 @@
{% extends "base.html" %}
{% block content %}
<h1>Neuer Inventareintrag</h1>
<h2>{{oe.name}}</h2>
<form method=post>
<label>
Beschreibung
<textarea name=description></textarea>
</label>
<br>
<label>
IA-Nummer
<input type=text name=innenauftrag>
<label>
<br>
<label>
Seriennummer
<input type=text name=serial>
<label>
<br>
<label>
Ort
<input type=text name=location>
<label>
<br>
<label>
Legacy-Inventarnummer
<input type=text name=old_inventory_id>
<label>
<br>
<label>
Kaufdatum
<input type=date name=purchase_date>
<label>
<br>
<label>
Kaufpreis
<input type=number step=0.01 name=purchase_price>
<label>
<br>
<input type=submit>
</form>
{% endblock %}

View File

@@ -1,7 +1,7 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block content %} {% block content %}
<h1>Inventar</h1> <h1>Inventar</h1>
<h2>{{oe_name}}</h2> <h2>{{oe.name}}</h2>
<table> <table>
<tr> <tr>
@@ -20,4 +20,6 @@
</table> </table>
<a href={{url_for("new_inventory", oe=oe.id)}}>Neuer Eintrag</a>
{% endblock %} {% endblock %}

View File

@@ -8,8 +8,14 @@ from inventorysystem import app
def show_message(message): def show_message(message):
return flask.render_template("message.html", message=message) return flask.render_template("message.html", message=message)
def get_db():
return psycopg2.connect(app.config["DSN"], cursor_factory=psycopg2.extras.NamedTupleCursor)
def current_user_has_permission(permission, oe=None):
return user_has_permission(session["user_id"], permission, oe)
def user_has_permission(user_id, permission, oe=None): def user_has_permission(user_id, permission, oe=None):
db = psycopg2.connect(app.config["DSN"]) db = get_db()
cur = db.cursor() cur = db.cursor()
cur.execute("select count(*) from permissions where \"user\"=%s and permission=%s and (oe=%s or oe is NULL)", (user_id, permission, oe)) cur.execute("select count(*) from permissions where \"user\"=%s and permission=%s and (oe=%s or oe is NULL)", (user_id, permission, oe))
allowed = cur.fetchone()[0] > 0 allowed = cur.fetchone()[0] > 0
@@ -29,7 +35,7 @@ def permission_required(f, permission, oe=None):
def inner_function(*args, **kwargs): def inner_function(*args, **kwargs):
if "username" not in session: if "username" not in session:
return flask.redirect(flask.url_for("login")) return flask.redirect(flask.url_for("login"))
if not user_has_permission(session["user_id"], permission, oe): if not current_user_has_permission(permission, oe):
return show_message("Permission denied") return show_message("Permission denied")
return f(*args, **kwargs) return f(*args, **kwargs)
return inner_function return inner_function
@@ -44,28 +50,28 @@ def login():
return flask.render_template("login.html") return flask.render_template("login.html")
elif request.method == "POST": elif request.method == "POST":
db = psycopg2.connect(app.config["DSN"])
username = request.form["user"] username = request.form["user"]
password = request.form["pass"] password = request.form["pass"]
#FIXME hash password #FIXME hash password
cur = db.cursor(cursor_factory=psycopg2.extras.RealDictCursor) db = get_db()
cur = db.cursor()
cur.execute("select id,full_name from users where username=%s and password=%s",(username,password)) cur.execute("select id,full_name from users where username=%s and password=%s",(username,password))
result = cur.fetchall() result = cur.fetchall()
if not result: if not result:
return show_message("Failed to log in, are username and password correct?") return show_message("Failed to log in, are username and password correct?")
else: else:
session["username"] = username session["username"] = username
session["user_id"] = result[0]["id"] session["user_id"] = result[0].id
session["full_name"] = result[0]["full_name"] session["full_name"] = result[0].full_name
return flask.redirect(flask.url_for("index")) return flask.redirect(flask.url_for("index"))
@app.route('/') @app.route('/')
@login_required @login_required
def index(): def index():
db = psycopg2.connect(app.config["DSN"]) db = get_db()
cur = db.cursor(cursor_factory=psycopg2.extras.RealDictCursor) cur = db.cursor()
cur.execute("select id, name from organizational_units") cur.execute("select id, name from organizational_units")
result = cur.fetchall() result = cur.fetchall()
db.close() db.close()
@@ -79,7 +85,7 @@ def list_of_dicts_to_table(l, headers, default=None):
for d in l: for d in l:
tmp_list = [] tmp_list = []
for header in headers: for header in headers:
tmp_list.append(d.get(header,default)) tmp_list.append(getattr(d, header, default))
table["rows"].append(tmp_list) table["rows"].append(tmp_list)
return table return table
@@ -88,17 +94,30 @@ def show_inventory(oe):
if not user_has_permission(session["user_id"], "show_inventory", oe): if not user_has_permission(session["user_id"], "show_inventory", oe):
return show_message("Permission denied"), 403 return show_message("Permission denied"), 403
db = psycopg2.connect(app.config["DSN"]) db = get_db()
cur = db.cursor(cursor_factory=psycopg2.extras.RealDictCursor) cur = db.cursor()
cur.execute("select id,serial,innenauftrag,description,location,purchase_date,purchase_price,old_inventory_id from inventory where oe=%s", (oe,)) cur.execute("select id,serial,innenauftrag,description,location,purchase_date,purchase_price,old_inventory_id from inventory where oe=%s", (oe,))
result = cur.fetchall() result = cur.fetchall()
cur.execute("select name from organizational_units where id=%s", (oe,)) cur.execute("select id,name from organizational_units where id=%s", (oe,))
oe_name = cur.fetchone()["name"] oe = cur.fetchone()
db.close() db.close()
table = list_of_dicts_to_table(result, ["id", "serial", "description", "location", "innenauftrag", "purchase_date", "purchase_price", "old_inventory_id"]) table = list_of_dicts_to_table(result, ["id", "serial", "description", "location", "innenauftrag", "purchase_date", "purchase_price", "old_inventory_id"])
return flask.render_template("show_inventory.html", table=table, oe_name=oe_name) return flask.render_template("show_inventory.html", table=table, oe=oe)
@app.route("/inventory/<int:oe>/new", methods=["GET", "POST"])
def new_inventory(oe):
if not user_has_permission(session["user_id"], "create_inventory_entry", oe):
return show_message("Permission denied"), 403
if request.method == "GET":
db = get_db()
cur = db.cursor()
cur.execute("select id,name from organizational_units where id=%s", (oe,))
oe = cur.fetchone()
db.close()
return flask.render_template("new_inventory.html", oe=oe)