""" Project: PARTS Website Author: Edward Middleton-Smith Precision And Research Technology Systems Limited Technology: Business Objects Feature: User Business Object """ # internal from business_objects.base import Base from business_objects.db_base import SQLAlchemy_ABC, Get_Many_Parameters_Base from business_objects.dog.company import Company from business_objects.dog.role import Role import lib.argument_validation as av from extensions import db from forms.dog.user import Filters_User from helpers.helper_app import Helper_App # external from dataclasses import dataclass from typing import ClassVar, Optional class User(SQLAlchemy_ABC, Base): ATTR_ID_USER_AUTH0: ClassVar[str] = 'id_user_auth0' FLAG_CAN_ADMIN_DOG: ClassVar[str] = 'can_admin_dog' FLAG_CAN_ADMIN_USER: ClassVar[str] = 'can_admin_user' FLAG_CAN_EDIT_COMPANY: ClassVar[str] = 'can_edit_company' FLAG_IS_EMAIL_VERIFIED: ClassVar[str] = 'is_email_verified' FLAG_IS_SUPER_USER: ClassVar[str] = 'is_super_user' FLAG_PRIORITY_ACCESS_LEVEL: ClassVar[str] = 'priority_access_level' NAME_ATTR_OPTION_VALUE: ClassVar[str] = Base.ATTR_ID_USER NAME_ATTR_OPTION_TEXT: ClassVar[str] = Base.FLAG_NAME __tablename__ = 'DOG_User' __table_args__ = { 'extend_existing': True } id_user = db.Column(db.Integer, primary_key=True) id_user_auth0 = db.Column(db.String(250)) firstname = db.Column(db.String(250)) surname = db.Column(db.String(250)) email = db.Column(db.String(250)) is_email_verified = db.Column(db.Boolean) is_super_user = db.Column(db.Boolean) priority_access_level = db.Column(db.Integer) can_admin_dog = db.Column(db.Boolean) can_admin_user = db.Column(db.Boolean) can_edit_company = db.Column(db.Boolean) is_new = db.Column(db.Boolean) active = db.Column(db.Boolean) def __init__(self): self.id_user = 0 self.is_new = False self.can_admin_dog = False self.can_admin_user = False self.can_edit_company = False self.id_company = None self.company = None self.id_role = None self.role = None super().__init__() @classmethod def from_db_user(cls, query_row): _m = f'{cls.__qualname__}.from_db_user' Helper_App.console_log(f'user record: {query_row}') user = cls() user.id_user = query_row[0] user.id_user_auth0 = query_row[1] user.firstname = query_row[2] user.surname = query_row[3] user.email = query_row[4] user.is_email_verified = av.input_bool(query_row[5], cls.FLAG_IS_EMAIL_VERIFIED, _m) user.id_role = query_row[6] user.id_company = query_row[8] user.is_super_user = av.input_bool(query_row[11], cls.FLAG_IS_SUPER_USER, _m) user.priority_access_level = query_row[12] user.can_admin_dog = av.input_bool(query_row[13], cls.FLAG_CAN_ADMIN_DOG, _m) user.can_admin_user = av.input_bool(query_row[14], cls.FLAG_CAN_ADMIN_USER, _m) user.can_edit_company = av.input_bool(query_row[15], cls.FLAG_CAN_ADMIN_USER, _m) # user.is_new = av.input_bool(query_row[9], 'is_new', _m) user.role = Role.from_db_user(query_row) user.company = Company.from_db_user(query_row) return user @classmethod def from_db_assessment(cls, query_row): _m = f'{cls.__qualname__}.from_db_assessment' user = cls() user.id_user = query_row[7] user.firstname = query_row[8] user.surname = query_row[9] return user @classmethod def from_json(cls, json): _m = f'{cls.__qualname__}.from_json' user = cls() if json is None: return user user.id_user = json[cls.ATTR_ID_USER] user.id_user_auth0 = json[cls.ATTR_ID_USER_AUTH0] user.firstname = json[cls.FLAG_FIRSTNAME] user.surname = json[cls.FLAG_SURNAME] user.email = json[cls.FLAG_EMAIL] user.is_email_verified = av.input_bool(json[cls.FLAG_IS_EMAIL_VERIFIED], cls.FLAG_IS_EMAIL_VERIFIED, _m) user.id_role = json[Role.ATTR_ID_ROLE] user.id_company = json[Company.ATTR_ID_COMPANY] user.is_super_user = av.input_bool(json[cls.FLAG_IS_SUPER_USER], cls.FLAG_IS_SUPER_USER, _m) user.can_admin_dog = user.is_super_user or json[cls.FLAG_CAN_ADMIN_DOG] user.can_admin_user = user.is_super_user or json[cls.FLAG_CAN_ADMIN_USER] user.can_edit_company = user.is_super_user or json.get(cls.FLAG_CAN_EDIT_COMPANY, False) user.role = Role.from_json(json[Role.FLAG_ROLE]) user.company = Company.from_json(json[Company.FLAG_COMPANY]) return user @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 user.surname = None user.email = user_info[cls.FLAG_EMAIL] user.is_email_verified = av.input_bool(user_info['email_verified'], cls.FLAG_IS_EMAIL_VERIFIED, _m) user.is_super_user = None user.can_admin_dog = user.is_super_user user.can_admin_user = user.is_super_user user.can_edit_company = user.is_super_user return user def to_json(self): as_json = { **self.get_shared_json_attributes(self) , self.ATTR_ID_USER: self.id_user , self.ATTR_ID_USER_AUTH0: self.id_user_auth0 , self.FLAG_FIRSTNAME: self.firstname , self.FLAG_SURNAME: self.surname , self.FLAG_NAME: self.get_name() , self.FLAG_EMAIL: self.email , self.FLAG_IS_EMAIL_VERIFIED: self.is_email_verified , self.FLAG_IS_SUPER_USER: self.is_super_user , self.FLAG_PRIORITY_ACCESS_LEVEL: self.priority_access_level , self.FLAG_CAN_ADMIN_DOG: self.can_admin_dog , self.FLAG_CAN_ADMIN_USER: self.can_admin_user , self.FLAG_CAN_EDIT_COMPANY: self.can_edit_company , Company.ATTR_ID_COMPANY: self.id_company , Company.FLAG_COMPANY: None if self.company is None else self.company.to_json() , Role.ATTR_ID_ROLE: self.id_role , Role.FLAG_ROLE: None if self.role is None else self.role.to_json() } return as_json def __repr__(self): return f''' User ( {self.ATTR_ID_USER}: {self.id_user} , {self.ATTR_ID_USER_AUTH0}: {self.id_user_auth0} , {self.FLAG_FIRSTNAME}: {self.firstname} , {self.FLAG_SURNAME}: {self.surname} , {self.FLAG_NAME}: {self.get_name()} , {self.FLAG_EMAIL}: {self.email} , {self.FLAG_IS_EMAIL_VERIFIED}: {self.is_email_verified} , {self.FLAG_IS_SUPER_USER}: {self.is_super_user} , {self.FLAG_PRIORITY_ACCESS_LEVEL}: {self.priority_access_level} , {self.FLAG_CAN_ADMIN_DOG}: {self.can_admin_dog} , {self.FLAG_CAN_ADMIN_USER}: {self.can_admin_user} , {self.FLAG_CAN_EDIT_COMPANY}: {self.can_edit_company} , {Role.ATTR_ID_ROLE}: {self.id_role} , {Role.FLAG_ROLE}: {self.role} , {Company.ATTR_ID_COMPANY}: {self.id_company} , {Company.FLAG_COMPANY}: {self.company} ) ''' def get_is_logged_in(self): return (self.id_user > 0 and self.id_user != Base.ID_USER_GUEST) def get_name(self): return f'{"" if self.firstname is None else self.firstname} {"" if self.surname is None else self.surname}' class User_Temp(db.Model, Base): __tablename__ = 'DOG_User_Temp' __table_args__ = { 'extend_existing': True } id_temp = db.Column(db.Integer, primary_key=True) id_user = db.Column(db.Integer) id_role = db.Column(db.Integer) id_user_auth0 = db.Column(db.String(250)) firstname = db.Column(db.String(250)) surname = db.Column(db.String(250)) email = db.Column(db.String(250)) is_email_verified = db.Column(db.Boolean) is_super_user = db.Column(db.Boolean) active = db.Column(db.Boolean) guid: str = db.Column(db.String(36)) # is_logged_in: bool def __init__(self): self.id_user = 0 super().__init__() @classmethod def from_user(cls, user): _m = f'{cls.__qualname__}.from_user' temp = cls() temp.id_user = user.id_user temp.id_role = user.id_role temp.id_user_auth0 = user.id_user_auth0 temp.firstname = user.firstname temp.surname = user.surname temp.email = user.email temp.is_email_verified = user.is_email_verified temp.is_super_user = user.is_super_user temp.active = user.active return temp class Parameters_User(Get_Many_Parameters_Base): id_user: Optional[int] auth0_id_user: str get_all_user: bool get_inactive_user: bool ids_user: str ids_user_auth0: str names_user: str emails_user: str get_all_company: bool get_inactive_company: bool ids_company: str require_all_id_search_filters_met: bool require_any_id_search_filters_met: bool require_all_non_id_search_filters_met: bool require_any_non_id_search_filters_met: bool @classmethod def from_form_filters_user(cls, form): _m = f'{cls.__qualname__}.from_form_filters_user' av.val_instance(form, 'form', _m, Filters_User) get_inactive = not av.input_bool(form.active_only.data, "active", _m) # id_user = '' if form.id_user.data is None else form.id_user.data filters = cls.get_default() filters.get_all_user = True # (id_user == '') filters.get_inactive_user = get_inactive filters.ids_user = '' # id_user filters.ids_user_auth0 = '' filters.require_all_id_search_filters_met = True filters.require_any_id_search_filters_met = True filters.require_all_non_id_search_filters_met = False filters.require_any_non_id_search_filters_met = True return filters @classmethod def from_user(cls, user): av.val_instance(user, 'user', 'Parameters_User.from_user', User) filters = cls.get_default() filters.get_all_user = ((user.id_user is None or user.id_user == 0) and user.id_user_auth0 is None) filters.get_inactive_user = False filters.ids_user = '' if user.id_user is None else str(user.id_user) filters.ids_user_auth0 = user.id_user_auth0 filters.names_user = user.get_name() filters.emails_user = user.email filters.ids_company = f'{user.id_company if user.id_company is not None else ""}' return filters @classmethod def get_default(cls): return cls( id_user = None , auth0_id_user = '' , get_all_user = False , get_inactive_user = False , ids_user = '' , ids_user_auth0 = '' , names_user = '' , emails_user = '' , get_all_company = True , get_inactive_company = False , ids_company = '' , require_all_id_search_filters_met = True , require_any_id_search_filters_met = True , require_all_non_id_search_filters_met = False , require_any_non_id_search_filters_met = True ) @classmethod def from_json(self): pass def to_json(self): return { 'a_id_user': self.id_user , 'a_auth0_id_user': self.auth0_id_user , 'a_get_all_user': self.get_all_user , 'a_get_inactive_user': self.get_inactive_user , 'a_ids_user': self.ids_user , 'a_ids_user_auth0': self.ids_user_auth0 , 'a_names_user': self.names_user , 'a_emails_user': self.emails_user , 'a_get_all_company': self.get_all_company , 'a_get_inactive_company': self.get_inactive_company , 'a_ids_company': self.ids_company , 'a_require_all_id_search_filters_met': self.require_all_id_search_filters_met , 'a_require_any_id_search_filters_met': self.require_any_id_search_filters_met , 'a_require_all_non_id_search_filters_met': self.require_all_non_id_search_filters_met , 'a_require_any_non_id_search_filters_met': self.require_any_non_id_search_filters_met } """ class User_Permission_Evaluation(db.Model): __tablename__ = 'DOG_User_Permission_Evaluation' __table_args__ = { 'extend_existing': True } id_evaluation = db.Column(db.Integer, primary_key=True) guid = db.Column(db.String(255)) id_user = db.Column(db.Integer) id_permission_required = db.Column(db.Integer) priority_access_level_required = db.Column(db.Integer) id_product = db.Column(db.Integer) is_super_user = db.Column(db.Boolean) priority_access_level_user = db.Column(db.Integer) can_view = db.Column(db.Boolean) can_edit = db.Column(db.Boolean) can_admin = db.Column(db.Boolean) def from_db_user_eval(query_row): user_permission_evaluation = User_Permission_Evaluation() user_permission_evaluation.id_evaluation = query_row[0] user_permission_evaluation.guid = query_row[1] user_permission_evaluation.id_user = query_row[2] user_permission_evaluation.id_permission_required = query_row[3] user_permission_evaluation.priority_access_level_required = query_row[4] user_permission_evaluation.id_product = query_row[5] user_permission_evaluation.is_super_user = query_row[6] user_permission_evaluation.priority_access_level_user = query_row[7] user_permission_evaluation.can_view = query_row[8] user_permission_evaluation.can_edit = query_row[9] user_permission_evaluation.can_admin = query_row[10] return user_permission_evaluation def __repr__(self): return f''' id_evaluation: {self.id_evaluation} guid: {self.guid} id_user: {self.id_user} id_permission_required: {self.id_permission_required} priority_access_level_required: {self.priority_access_level_required} id_product: {self.id_product} is_super_user: {self.is_super_user} priority_access_level_user: {self.priority_access_level_user} can_view: {self.can_view} can_edit: {self.can_edit} can_admin: {self.can_admin} ''' """