Feat: Founding Partner login with autocreation of User, User Role Link, Company, User Company Link as necessary and autologin with new user - for approved Founding Partners only, otherwise redirected to login page.

This commit is contained in:
2025-08-21 18:37:31 +01:00
parent 07543994bf
commit 12f5fc994f
29 changed files with 1843 additions and 324 deletions

View File

@@ -31,6 +31,7 @@ class Base():
FLAG_ADDRESS: ClassVar[str] = 'address'
FLAG_ADDRESS_LINE_1: ClassVar[str] = 'address_line_1'
FLAG_ADDRESS_LINE_2: ClassVar[str] = 'address_line_2'
FLAG_BACKGROUND_COLOUR: ClassVar[str] = 'background_colour'
FLAG_CAN_ADMIN: ClassVar[str] = 'can_admin'
FLAG_CAN_EDIT: ClassVar[str] = 'can_edit'
FLAG_CAN_VIEW: ClassVar[str] = 'can_view'
@@ -70,6 +71,7 @@ class Base():
FLAG_SEARCH: ClassVar[str] = 'search'
FLAG_SURNAME: ClassVar[str] = 'surname'
FLAG_SYMBOL: ClassVar[str] = 'symbol'
FLAG_TEXT_COLOUR: ClassVar[str] = 'text_colour'
FLAG_URL: ClassVar[str] = 'url'
FLAG_USER: ClassVar[str] = 'authorisedUser' # 'user' already used
FLAG_VALUE_LOCAL_VAT_EXCL: ClassVar[str] = 'value_local_vat_excl'

View File

@@ -78,7 +78,7 @@ class Command_Category(SQLAlchemy_ABC, Base):
@classmethod
def from_json(cls, json):
_m = 'Command_Category.from_json'
_m = f'{cls.__qualname__}.from_json'
command_category = cls()
if json is None: return command_category
# Helper_App.console_log(f'{_m}\njson: {json}')

View File

@@ -118,9 +118,12 @@ class User(SQLAlchemy_ABC, Base):
@classmethod
def from_json_auth0(cls, json):
_m = f'{cls.__qualname__}.from_json_auth0'
Helper_App.console_log(_m)
Helper_App.console_log(f'JSON: {json}')
user = cls()
if json is None: return user
user_info = json['userinfo']
Helper_App.console_log(f'user_info: {user_info}')
user.id_user = None
user.id_user_auth0 = user_info['sub']
user.firstname = None

View File

@@ -12,6 +12,9 @@ Business object for SQL errors returned by Get Many Stored Procedures
# internal
from business_objects.base import Base
from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base
from extensions import db
from helpers.helper_app import Helper_App
import lib.argument_validation as av
from lib import data_types
# external
@@ -19,50 +22,91 @@ from enum import Enum
from datetime import datetime, timedelta
import locale
from flask_sqlalchemy import SQLAlchemy
from typing import ClassVar
# db = SQLAlchemy()
db = SQLAlchemy()
class SQL_Error(SQLAlchemy_ABC, Base):
ATTR_ID_ERROR: ClassVar[str] = 'id_error'
FLAG_IS_BREAKING_ERROR: ClassVar[str] = 'is_breaking_error'
__tablename__ = 'DOG_Temp_SQL_Error'
__table_args__ = { 'extend_existing': True }
class SQL_Error(db.Model):
display_order = db.Column(db.Integer, primary_key=True)
id_error = db.Column(db.Integer, primary_key=True)
id_type = db.Column(db.Integer)
code = db.Column(db.String(50))
code_type = db.Column(db.String(50))
name_type = db.Column(db.String(500))
description_type = db.Column(db.String(4000))
is_breaking_error_type = db.Column(db.Boolean)
background_colour_type = db.Column(db.String(50))
text_colour_type = db.Column(db.String(50))
msg = db.Column(db.String(4000))
name = db.Column(db.String(500))
description = db.Column(db.String(4000))
"""
def __new__(cls, display_order, code, msg):
_m = 'SQL_Error.__new__'
v_arg_type = 'class attribute'
av.val_int(display_order, 'display_order', _m)
av.val_str(code, 'code', _m, max_len=50, v_arg_type=v_arg_type)
av.val_str(msg, 'msg', _m, max_len=4000, v_arg_type=v_arg_type)
return super(SQL_Error, cls).__new__(cls)
def __init__(self, display_order, code, msg):
self.display_order = display_order
self.code = code
self.msg = msg
def __init__(self):
self.id_error = 0
super().__init__()
"""
def from_db_record(record):
error = SQL_Error()
error.display_order = record[0]
@classmethod
def from_db_record(cls, record):
_m = f'{cls.__qualname__}.from_db_record'
Helper_App.console_log(_m)
Helper_App.console_log(f'record: {record}')
error = cls()
error.id_error = record[0]
error.id_type = record[1]
error.code = record[2]
error.msg = record[3]
error.name = record[4]
error.description = record[5]
error.code_type = record[2]
error.name_type = record[3]
error.description_type = record[4]
error.is_breaking_error_type = av.input_bool(record[5], 'is_breaking_error_type', _m)
error.background_colour_type = record[6]
error.text_colour_type = record[7]
error.msg = record[8]
return error
@classmethod
def from_json(cls, json):
_m = f'{cls.__qualname__}.from_json'
error = cls()
if json is None: return error
"""
# Helper_App.console_log(f'{_m}\njson: {json}')
error.id_error = json.get(cls.ATTR_ID_ERROR, -1)
error.id_type = json.get()
error.name = json[cls.FLAG_NAME]
error.code = json.get(cls.FLAG_CODE, error.name.upper().replace(" ", "_"))
error.active = av.input_bool(json[cls.FLAG_ACTIVE], cls.FLAG_ACTIVE, _m)
# Helper_App.console_log(f'Error: {error}')
return error
"""
def to_json(self):
return {
Base.FLAG_DISPLAY_ORDER: self.display_order,
Base.ATTR_ID_MSG_ERROR_TYPE: self.id_type,
Base.FLAG_CODE: self.code,
Base.FLAG_MESSAGE: self.msg,
Base.FLAG_NAME: self.name,
Base.FLAG_DESCRIPTION: self.description,
}
self.ATTR_ID_ERROR: self.display_order
, Base.ATTR_ID_MSG_ERROR_TYPE: self.id_type
, Base.FLAG_CODE: self.code_type
, Base.FLAG_NAME: self.name_type
, Base.FLAG_DESCRIPTION: self.description_type
, self.FLAG_IS_BREAKING_ERROR: self.is_breaking_error_type
, Base.FLAG_BACKGROUND_COLOUR: self.background_colour_type
, Base.FLAG_TEXT_COLOUR: self.text_colour_type
, Base.FLAG_MESSAGE: self.msg
}
def __repr__(self):
# Helper_App.console_log(f'{cls.__qualname__}.__repr__')
return f'''
{self.__class__.__name__}(
{self.ATTR_ID_ERROR}: {self.id_error}
{Base.ATTR_ID_MSG_ERROR_TYPE}: {self.id_type}
{Base.FLAG_CODE}: {self.code_type}
{Base.FLAG_NAME}: {self.name_type}
{Base.FLAG_DESCRIPTION}: {self.description_type}
{self.FLAG_IS_BREAKING_ERROR}: {self.is_breaking_error_type}
{Base.FLAG_BACKGROUND_COLOUR}: {self.background_colour_type}
{Base.FLAG_TEXT_COLOUR}: {self.text_colour_type}
{Base.FLAG_MESSAGE}: {self.msg}
)
'''