minor: insert primitive possibility for invoice

It's ugly. Future updates will make it more beautiful.
This commit is contained in:
Lunaresk 2022-03-23 13:45:45 +01:00
parent 050fed33b2
commit f26dee5489
5 changed files with 58 additions and 9 deletions

View File

@ -14,8 +14,9 @@ class User(UserMixin, db.Model):
username = db.Column(db.String(64), nullable=False, unique=True) username = db.Column(db.String(64), nullable=False, unique=True)
password_hash = db.Column(db.String(128), nullable=False) password_hash = db.Column(db.String(128), nullable=False)
# Bought = db.relationship("Bought", backref='User', lazy='dynamic')
LoginToken = db.relationship("LoginToken", backref='User', lazy='dynamic') LoginToken = db.relationship("LoginToken", backref='User', lazy='dynamic')
Bought = db.relationship("Bought", secondary="login_token",
lazy='dynamic', overlaps="User,LoginToken")
def set_password(self, password): def set_password(self, password):
self.password_hash = generate_password_hash(password) self.password_hash = generate_password_hash(password)
@ -32,6 +33,8 @@ class Establishment(db.Model):
owner = db.Column(db.ForeignKey('user.id'), nullable=False) owner = db.Column(db.ForeignKey('user.id'), nullable=False)
LoginToken = db.relationship("LoginToken", backref='Establishment', lazy='dynamic') LoginToken = db.relationship("LoginToken", backref='Establishment', lazy='dynamic')
Bought = db.relationship("Bought", secondary="login_token",
lazy='dynamic', overlaps="Establishment,LoginToken,Bought")
def __repr__(self) -> str: def __repr__(self) -> str:
return f"<Establishment {self.id} ({self.name})>" return f"<Establishment {self.id} ({self.name})>"

View File

@ -1,6 +1,6 @@
from app import app, db, LOGGER from app import app, db, LOGGER
from app.forms import NewItemForm, LoginForm, RegistrationForm from app.forms import NewItemForm, LoginForm, RegistrationForm
from app.models import LoginToken, User, Item, Brand, PriceChange, AmountChange from app.models import Establishment, LoginToken, User, Item, Brand, PriceChange, AmountChange
from app.utils import view_utils, database_utils from app.utils import view_utils, database_utils
from app.utils.routes_utils import render_custom_template as render_template from app.utils.routes_utils import render_custom_template as render_template
from datetime import date from datetime import date
@ -116,7 +116,8 @@ def get_report_from_user():
abort(400) abort(400)
LOGGER.info("Getting results.") LOGGER.info("Getting results.")
results = database_utils.get_report(**request.args) results = database_utils.get_report(**request.args)
LOGGER.debug(f"Results received: {results}") LOGGER.debug(f"Results received.")
# LOGGER.debug(str(results))
if results: if results:
result_list = view_utils.group_results(results) result_list = view_utils.group_results(results)
else: else:
@ -124,10 +125,25 @@ def get_report_from_user():
if request.content_type == "application/json": if request.content_type == "application/json":
return jsonify(result_list) return jsonify(result_list)
else: else:
return render_template("overview.html", results=result_list) if "establishment" in request.args:
return render_template("overview.html", results=result_list, establishment = Establishment.query.get(int(request.args['establishment'])))
else:
return render_template("overview.html", results=result_list)
@app.route(f'/{APPNAME}/overview/register_boughts', methods=['GET']) @app.route(f'/{APPNAME}/overview/register_boughts', methods=['GET'])
@login_required @login_required
def check_unregistered_items(): def check_unregistered_items():
if current_user.is_anonymous: if current_user.is_anonymous or not request.args or 'establishment' not in request.args:
abort(403) abort(403)
establishment = Establishment.query.get(int(request.args['establishment']))
if current_user.id != establishment.owner:
abort(403)
results = database_utils.get_unregistered_and_register(establishment.id)
if results:
result_list = view_utils.group_results(results)
else:
result_list = []
if request.content_type == "application/json":
return jsonify(result_list)
else:
return render_template("overview.html", results=result_list)

View File

@ -10,6 +10,7 @@
{% else %} {% else %}
<title>Scan2Kasse</title> <title>Scan2Kasse</title>
{% endif %} {% endif %}
<!-- <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> -->
</head> </head>
<body> <body>
<main> <main>
@ -91,9 +92,11 @@
{% endwith %} {% endwith %}
<div style="width: 280px;"></div> <div style="width: 280px;"></div>
<div class="container"> <div class="container">
<div class="row my-3"></div>
<div class="row-md-3"> <div class="row-md-3">
{% block content %}{% endblock %} {% block content %}{% endblock %}
</div> </div>
<div class="row my-3"></div>
</div> </div>
</main> </main>
</body> </body>

View File

@ -1,6 +1,13 @@
{% extends "base.html" %} {% extends "base.html" %}
{% block content %} {% block content %}
{% if establishment %}
{% if current_user.id == establishment.owner %}
<button type="button" class="btn btn-outline-dark px-2" data-bs-toggle="button" autocomplete="off" onclick="window.location.href='{{ url_for('check_unregistered_items', establishment=establishment.id) }}'">
Abrechnung
</button>
{% endif %}
{% endif %}
{% for user in results %} {% for user in results %}
<div class="card"> <div class="card">
<button class="btn btn-primary" data-bs-toggle="collapse" data-bs-target="#b{{ user.id }}" aria-expanded="true"> <button class="btn btn-primary" data-bs-toggle="collapse" data-bs-target="#b{{ user.id }}" aria-expanded="true">

View File

@ -6,7 +6,7 @@ from datetime import date as dtdate, timedelta
from flask_login import current_user from flask_login import current_user
from psycopg2 import errors from psycopg2 import errors
from random import choice as rndchoice from random import choice as rndchoice
from sqlalchemy import text from sqlalchemy import and_, text
from sqlalchemy.dialects.postgresql import insert from sqlalchemy.dialects.postgresql import insert
from string import ascii_letters, digits from string import ascii_letters, digits
@ -42,7 +42,7 @@ def get_report(**kwargs):
else: else:
_filter = db.session.query(LoginToken.token).filter_by(establishment = int(establishment), user=current_user.id) _filter = db.session.query(LoginToken.token).filter_by(establishment = int(establishment), user=current_user.id)
query_select = query_select.filter(bwp.c.token.in_(_filter)) query_select = query_select.filter(bwp.c.token.in_(_filter))
LOGGER.debug(str(query_select)) # LOGGER.debug(str(query_select))
match kwargs: match kwargs:
case {"month": month}: case {"month": month}:
LOGGER.debug("Month present") LOGGER.debug("Month present")
@ -52,10 +52,30 @@ def get_report(**kwargs):
LOGGER.debug("Year present") LOGGER.debug("Year present")
query_select = query_select.filter(bwp.c.date.between(dtdate(int(year), 1, 1), dtdate(int(year), 12, 31))) query_select = query_select.filter(bwp.c.date.between(dtdate(int(year), 1, 1), dtdate(int(year), 12, 31)))
query_select = query_select.order_by(bwp.c.token, bwp.c.date, bwp.c.item) query_select = query_select.order_by(bwp.c.token, bwp.c.date, bwp.c.item)
LOGGER.debug(str(query_select)) # LOGGER.debug(str(query_select))
results = query_select.all() results = query_select.all()
return tuple(results) return tuple(results)
def get_unregistered_and_register(intEstablishment: int):
LOGGER.debug("Getting unregistered")
establishment = Establishment.query.get(intEstablishment)
if current_user.id != establishment.owner:
LOGGER.debug("!!!Wrong User!!!")
return False
query_select = db.session.query(bwp.c.token, User.username, bwp.c.date, bwp.c.item, Item.name, bwp.c.amount, bwp.c.price)
query_select = query_select.select_from(bwp).join(LoginToken, LoginToken.token==bwp.c.token).join(User, LoginToken.user==User.id)
query_select = query_select.join(Item, Item.id==bwp.c.item).join(Bought, and_(Bought.token==bwp.c.token, Bought.item==bwp.c.item, Bought.date==bwp.c.date))
query_select = query_select.filter(bwp.c.token.in_(db.session.query(LoginToken.token).filter_by(establishment = intEstablishment)))
query_select = query_select.filter(Bought.registered == False)
query_select = query_select.order_by(bwp.c.token, bwp.c.date, bwp.c.item)
results = query_select.all()
unregistered_boughts = establishment.Bought.filter_by(registered = False).all()
for x in unregistered_boughts:
x.registered = True
db.session.commit()
return results
def generate_token(length = 15, allowed_chars = ascii_letters + digits): def generate_token(length = 15, allowed_chars = ascii_letters + digits):
new_token = "".join((rndchoice(allowed_chars) for i in range(length))) new_token = "".join((rndchoice(allowed_chars) for i in range(length)))
if not LoginToken.query.filter_by(token=new_token).first(): if not LoginToken.query.filter_by(token=new_token).first():