Neues crm-Paket mit Datenmodell, Geschäftslogik und REST-Endpunkten
für die Entität Kunde (/xhr/kunde/{list,get,create,update,delete}).
authorisation_required-Decorator: app-spezifische Rollenprüfung via
has_permission(appid, ...). SysAdmin systemweit, AppAdmin implizit in
seiner Anwendung, User (Mitarbeiter) als Basis-Rolle, Zusatz-Rollen
wie KundenManager additiv.
Flask CLI: init-db (Schema + Musterdaten + App-Rollen) und reset-db
(Bestätigung, behält SysAdmin).
config.ini: Neuer appid-Eintrag (KBPlusCRM), getrennt vom technischen
PROJEKTNAME. checkdb: appid aus config, Migration _db_V01_02 für
bestehende DBs.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
108 lines
3.4 KiB
Python
108 lines
3.4 KiB
Python
from datetime import datetime
|
|
from auth import model
|
|
from sqlalchemy import text
|
|
from sqlalchemy.exc import OperationalError
|
|
from datetime import datetime
|
|
from flask import current_app
|
|
from db import dbauth
|
|
|
|
session = dbauth.session
|
|
BINDKEY = "auth"
|
|
|
|
def _db_V01_00():
|
|
# "bind_key=None" bedeutet hier, dass bei "create_all" nur die Models mit
|
|
# Default-Bind erzeugt werden sollen und nicht die anderen, insbesonder
|
|
# nicht die zum MS-SQL-SErver
|
|
dbauth.create_all(bind_key=BINDKEY)
|
|
systeminfo = model.Systeminfo()
|
|
systeminfo.id = 1
|
|
systeminfo.version = "01.00"
|
|
systeminfo.lastupdate = datetime.now()
|
|
systeminfo.initialinstall = datetime.now()
|
|
session.add(systeminfo)
|
|
session.commit()
|
|
|
|
def _db_V01_01():
|
|
u = model.User()
|
|
u.id = 1
|
|
u.userid = 'System.Admin'
|
|
u.username = 'Systemadministrator'
|
|
u.password = "geheim"
|
|
u.email = ''
|
|
session.add(u)
|
|
|
|
sysmgr = model.Role()
|
|
sysmgr.id = 1
|
|
sysmgr.name = "Systemadministrator"
|
|
sysmgr.roleid = "SysAdmin"
|
|
session.add(sysmgr)
|
|
|
|
appmgr = model.Role()
|
|
appmgr.name = "Anwendungsadministrator"
|
|
appmgr.roleid = "AppAdmin"
|
|
session.add(appmgr)
|
|
|
|
usermgr = model.Role()
|
|
usermgr.name = "Benutzerverwaltung"
|
|
usermgr.roleid = "UserMgr"
|
|
session.add(usermgr)
|
|
|
|
application = model.Application()
|
|
application.id = 1
|
|
# appid und name aus der Konfiguration übernehmen (config.ini [APP] appid).
|
|
# Die appid ist der lesbare Anwendungsname, der zur Autorisierung verwendet
|
|
# wird; nicht identisch mit PROJEKTNAME (technischer Bezeichner).
|
|
application.appid = current_app.config["APPID"]
|
|
application.name = current_app.config["APPID"]
|
|
session.add(application)
|
|
|
|
userapp = model.Userapp()
|
|
userapp.application = application
|
|
userapp.userapp_roles.append(sysmgr)
|
|
session.add(userapp)
|
|
u.userapps.append(userapp)
|
|
|
|
_updatesysteminfo('01.01')
|
|
session.commit()
|
|
|
|
def _db_V01_02():
|
|
"""
|
|
Migriert bestehende Application-Datensätze, deren appid noch den alten
|
|
Platzhalter 'Project01' enthält, auf die appid aus der aktuellen Konfiguration
|
|
(config.ini [APP] appid). Wird nach reset-db nicht benötigt (da _db_V01_01
|
|
direkt den korrekten Wert setzt), greift aber bei Upgrades bestehender DBs.
|
|
"""
|
|
appid = current_app.config["APPID"]
|
|
application: model.Application = model.Application.query.filter(
|
|
model.Application.appid == "Project01"
|
|
).first()
|
|
if application is not None:
|
|
application.appid = appid
|
|
application.name = appid
|
|
_updatesysteminfo('01.02')
|
|
session.commit()
|
|
|
|
def _updatesysteminfo(versionnr):
|
|
s: model.Systeminfo = model.Systeminfo.query.get(1)
|
|
s.version = versionnr
|
|
s.lastupdate = datetime.now()
|
|
return
|
|
|
|
def checkupdates():
|
|
systeminfo = None
|
|
curr_dbversion = '_db_V01_00'
|
|
try:
|
|
systeminfo: model.Systeminfo = model.Systeminfo.query.get(1)
|
|
curr_dbversion = "_db_V" + systeminfo.version.replace(".", "_")
|
|
except (OperationalError, AttributeError):
|
|
_db_V01_00()
|
|
|
|
versionen = sorted(filter(lambda f: f.startswith("_db_V"),globals()))
|
|
|
|
for v in versionen:
|
|
if v > curr_dbversion:
|
|
globals()[v]() # https://docs.python.org/3.6/library/functions.html?highlight=globals#globals
|
|
|
|
print('########## Database updated')
|
|
|