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)