Alpha release
This commit is contained in:
parent
62681acd16
commit
eeda5062ae
14 changed files with 842 additions and 1 deletions
77
Server/DB/handler.py
Normal file
77
Server/DB/handler.py
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import datetime
|
||||
import os
|
||||
|
||||
from typing import List
|
||||
|
||||
from sqlalchemy import create_engine, BLOB, Column, Boolean, Float, Integer, String, JSON, DateTime, ForeignKey
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.orm import DeclarativeBase, sessionmaker, relationship, Mapped, mapped_column
|
||||
from loguru import logger
|
||||
|
||||
from flask_login import UserMixin
|
||||
|
||||
# create an in-memory SQLite database
|
||||
engine = create_engine('sqlite:///db.sqlite', echo=True)
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
class User(UserMixin, Base):
|
||||
__tablename__ = 'User'
|
||||
username = Column(String, primary_key=True, unique=True)
|
||||
hashed_password = Column(String)
|
||||
salt = Column(String)
|
||||
class Log(Base): #TODO uSe
|
||||
__tablename__ = 'Log'
|
||||
number = Column(Integer, primary_key=True)
|
||||
created_at = Column(DateTime, default=datetime.datetime.now)
|
||||
desk_ = Column(Integer)
|
||||
ip = Column(Integer)
|
||||
def __init__(self, desk, ip, tel_nr):
|
||||
self.desk = desk
|
||||
self.ip = ip
|
||||
|
||||
class QR(Base): #TODO: Decide if encryption Salting hasing and anti rainbow attack is eeded for the qr codes?
|
||||
__tablename__ = 'qr'
|
||||
desk = Column(Integer, primary_key=True)
|
||||
qr_secret = Column(Integer)
|
||||
qr_img = Column(BLOB)
|
||||
|
||||
def __init__(self, desk, qr_img, qr_secret=0):
|
||||
self.desk = desk
|
||||
self.qr_secret = qr_secret
|
||||
self.qr_img = qr_img
|
||||
|
||||
class Product(Base):
|
||||
__tablename__ = 'product'
|
||||
id = mapped_column(Integer, primary_key=True)
|
||||
name = Column(String)
|
||||
quantity = Column(Integer)
|
||||
order_id = mapped_column(ForeignKey("order.id"))
|
||||
order = relationship("Order", back_populates="order")
|
||||
|
||||
def __init__(self, quantity,name, order_id):
|
||||
self.quantity = quantity
|
||||
self.name = name
|
||||
self.order_id = order_id
|
||||
self.date = datetime.datetime.now()
|
||||
|
||||
class Order(Base):
|
||||
__tablename__ = 'order'
|
||||
id = mapped_column(Integer, primary_key=True)
|
||||
order = relationship("Product", back_populates="order")
|
||||
desk_number = Column(Integer)
|
||||
finished = Column(Boolean)
|
||||
|
||||
def __init__(self, desk_number, finished=False, ):
|
||||
self.desk_number = desk_number
|
||||
self.desk = 1
|
||||
#TODO: replace product-order.json whit json object POST from flask
|
||||
# That means a UI for setting all values.
|
||||
self.finished = finished
|
||||
|
||||
Base.metadata.create_all(engine)
|
||||
147
Server/DB/querys.py
Normal file
147
Server/DB/querys.py
Normal file
|
|
@ -0,0 +1,147 @@
|
|||
|
||||
from loguru import logger
|
||||
import json
|
||||
import bcrypt
|
||||
|
||||
from Server.DB.handler import QR, Product, Order, session, User
|
||||
|
||||
class compare:
|
||||
def is_user_pass_valid(username, password):
|
||||
session_username = session.query(User).filter(User.username == username).one()
|
||||
session.commit()
|
||||
print(session_username.hashed_password)
|
||||
if bcrypt.hashpw(password.encode('utf-8'), session_username.salt) == session_username.hashed_password.encode('utf-8'):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def is_QRSecret_valid(desk, secret):#TODO FIX! #Feature = True #TODO:Encryption Salting hasing and anti rainbow attack
|
||||
q = session.query(QR).\
|
||||
filter(QR.desk.like(int(desk))).\
|
||||
order_by(QR.qr_secret)
|
||||
q_QR = q.with_session(session).one()
|
||||
if q_QR.qr_secret == secret:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def process_main(ordered_list, desk):
|
||||
'''
|
||||
Get all verified Products from the order to the db entry
|
||||
|
||||
Input: Array ordered_list, INT desk
|
||||
|
||||
OUT: True, False if succeded adding to db
|
||||
'''
|
||||
|
||||
if compare.verifie_order(ordered_list):
|
||||
#products = Product()
|
||||
order = Order(desk)
|
||||
session.add(order)
|
||||
session.commit()
|
||||
for product in ordered_list:
|
||||
if int(product[0]) > 0: #dont add not ordered to list
|
||||
productDB = Product(quantity=int(product[0]),name=product[1],order_id = order.id)
|
||||
|
||||
session.add(productDB)
|
||||
session.commit()
|
||||
logger.success("Order at desk "+ str(desk) +" resived")
|
||||
# add a new ordered_list to the database
|
||||
return True
|
||||
|
||||
else:
|
||||
print("There was an invalid order! Someone messing whit source?")
|
||||
return False
|
||||
#TODO: Placeholder
|
||||
|
||||
def verifie_order(ordered_list):
|
||||
'''
|
||||
if self.desk > self.desk_numbers:
|
||||
return False
|
||||
'''
|
||||
valid_products_list = get.valid_products()
|
||||
|
||||
for product in ordered_list:
|
||||
print(product[1],' ', valid_products_list)
|
||||
if product[1] in valid_products_list: #product[0] is quantiiy 1 is name_product
|
||||
pass
|
||||
else:
|
||||
return False
|
||||
return True
|
||||
|
||||
class add:
|
||||
def _create_user(username, password):
|
||||
if session.query(User).filter_by(username = username).count() < 1:
|
||||
bytes = password.encode('utf-8')
|
||||
salt = bcrypt.gensalt()
|
||||
hash = bcrypt.hashpw(bytes, salt).decode('utf-8')
|
||||
user = User(username = username, hashed_password = hash, salt= salt)
|
||||
session.add(user)
|
||||
session.commit()
|
||||
|
||||
|
||||
def _order(orders, desk):
|
||||
'''
|
||||
add order to db
|
||||
|
||||
INPUT: DICT orders, desk
|
||||
OUT: True succes False failure
|
||||
'''
|
||||
pass
|
||||
|
||||
class get:
|
||||
'''
|
||||
def user_in_User(username):
|
||||
|
||||
calls db if user in User table
|
||||
|
||||
q_session = session.query(User).filter(User.username == username).one()
|
||||
session.commit()
|
||||
if q_session:
|
||||
return q_session.id
|
||||
return False
|
||||
'''
|
||||
def valid_products(get_json_=False):
|
||||
with open(config['SETTINGS']['path_json_settings'], 'r') as file:
|
||||
#Parse Json Product List
|
||||
products = json.load(file)
|
||||
if get_json_:
|
||||
return products
|
||||
else:
|
||||
valide_products = []
|
||||
for category in products.get('products'):
|
||||
for product in products.get('products').get(category):
|
||||
print(product)
|
||||
if int(product['quantity']) >= 0:
|
||||
valide_products.append(product['name'])
|
||||
return valide_products
|
||||
|
||||
def all_orders():
|
||||
# All unfinished orders (finished is False or string "False")
|
||||
result = []
|
||||
desk = 1
|
||||
orders = session.query(Order).filter(Order.finished == 0).all()
|
||||
session.commit()
|
||||
for order in orders:
|
||||
products = session.query(Product).filter(Product.order_id == order.id , Order.desk_number == desk).all()
|
||||
session.commit()
|
||||
list_products = []
|
||||
for p in products:
|
||||
#What it shows in orders.html
|
||||
list_products.append(" x" + str(p.quantity) +" "+ p.name )
|
||||
result.append((order.desk_number, list_products, order.id))
|
||||
return result
|
||||
class update:
|
||||
#TODO GET JSON to -> DB
|
||||
def update_products_fromJSON(self):
|
||||
pass
|
||||
class set:
|
||||
def finish_order(order_number):
|
||||
order = session.query(Order).filter(Order.id == int(order_number)).first()
|
||||
if order:
|
||||
order.finished = 1 # or "True
|
||||
session.commit()
|
||||
logger.info("Order "+str(order_number)+" marked as finished.")
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
Loading…
Add table
Add a link
Reference in a new issue