68 lines
2.9 KiB
Python
68 lines
2.9 KiB
Python
from sqlalchemy import create_engine, Column, Integer, String, Enum, TIMESTAMP, func, text
|
|
from sqlalchemy.orm import sessionmaker, declarative_base
|
|
import enum
|
|
import bcrypt
|
|
|
|
# Basis-Klasse für unsere Modelle
|
|
Base = declarative_base()
|
|
|
|
# Enum zur Definition der möglichen Rollen
|
|
class UserRole(enum.Enum):
|
|
user = "user"
|
|
admin = "admin"
|
|
superadmin = "superadmin"
|
|
|
|
# Definition des User Models (Tabelle)
|
|
class User(Base):
|
|
__tablename__ = 'users'
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
username = Column(String(50), unique=True, nullable=False)
|
|
password_hash = Column(String(60), nullable=False) # bcrypt erzeugt einen 60-Zeichen-Hash
|
|
role = Column(Enum(UserRole), nullable=False, default=UserRole.user)
|
|
created_at = Column(TIMESTAMP, server_default=func.current_timestamp())
|
|
updated_at = Column(TIMESTAMP, server_default=func.current_timestamp(), onupdate=func.current_timestamp())
|
|
|
|
# Definition des Client Models (Tabelle)
|
|
class Client(Base):
|
|
__tablename__ = 'clients'
|
|
|
|
# Die UUID wird vom Client erzeugt und muss daher übermittelt werden (kein Default)
|
|
uuid = Column(String(36), primary_key=True, nullable=False)
|
|
# Der Hardware-Hash wird ebenfalls direkt vom Client geliefert
|
|
hardware_hash = Column(String(64), nullable=False)
|
|
# Spalte für den Standort, der vom Benutzer bei der Anmeldung eingegeben wird
|
|
location = Column(String(100), nullable=True)
|
|
# Spalte für die IP-Adresse, die vom Server beim Kontakt ermittelt wird
|
|
ip_address = Column(String(45), nullable=True)
|
|
# Speicherung des Registrierungszeitpunkts, wird automatisch gesetzt
|
|
registration_time = Column(TIMESTAMP, server_default=func.current_timestamp(), nullable=False)
|
|
# Speicherung des Zeitpunkts der letzten Rückmeldung (Alive-Signal)
|
|
last_alive = Column(
|
|
TIMESTAMP,
|
|
server_default=func.current_timestamp(),
|
|
onupdate=func.current_timestamp(),
|
|
nullable=False
|
|
)
|
|
|
|
def main():
|
|
# Zuerst Verbindung zur MariaDB ohne spezifische Datenbank, um die Datenbank anzulegen.
|
|
admin_connection_str = 'mysql+pymysql://infoscreen_admin:KqtpM7wmNd$M1Da&mFKs@infoscreen-db/infoscreen_by_taa'
|
|
admin_engine = create_engine(admin_connection_str, echo=True)
|
|
|
|
# Datenbank "infoscreen_by_taa" anlegen, falls sie noch nicht existiert.
|
|
with admin_engine.connect() as conn:
|
|
conn.execute(text("CREATE DATABASE IF NOT EXISTS infoscreen_by_taa CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"))
|
|
|
|
# Verbindung zur spezifischen Datenbank herstellen.
|
|
db_connection_str = 'mysql+pymysql://infoscreen_admin:KqtpM7wmNd$M1Da&mFKs@infoscreen-db/infoscreen_by_taa'
|
|
engine = create_engine(db_connection_str, echo=True)
|
|
|
|
# Erstelle die Tabellen 'users' und 'clients'
|
|
Base.metadata.create_all(engine)
|
|
|
|
print("Die Tabellen 'users' und 'clients' wurden in der Datenbank 'infoscreen_by_taa' erstellt.")
|
|
|
|
if __name__ == '__main__':
|
|
main()
|