import re import enum from dataclasses import dataclass, field from typing import Self from app.utils import alert_message_and_exit EMAIL_REGEX = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$" class Brand(enum.StrEnum): SONY = "sme" ORCHARD = "theorchard" AWAL = "awal" class Role(enum.StrEnum): analyst = "analyst" admin = "admin" class VendorStatus(enum.StrEnum): EMULATED = "emulated" # FTE MISSING = "missing" # Regular users with missing vendor access and pdp roles @dataclass(kw_only=True) class Vendor: name: str id: int uuid: str status: VendorStatus | None = None @classmethod def from_model(cls, model) -> Self: return cls( name=model.get("name"), id=model.get("id"), uuid=model.get("uuid"), status=None ) @dataclass(kw_only=True) class User: name: str | None = None email: str | None = None identity: str | None = None audience_profile: bool = False brand: str | None = None vendors: list[Vendor] = field(default_factory=list) exists: bool = False role: str | None = None def validate_email(self): if self.email: if not re.match(EMAIL_REGEX, self.email): alert_message_and_exit(f"Invalid email format for {self.email}") self.email = self.email.lower() def set_brand(self, brand=None): if not brand and self.email: domain = self.email.split("@")[1] if 'orchard' in domain: self.brand = Brand.ORCHARD elif 'awal' in domain: self.brand = Brand.AWAL else: self.brand = Brand.SONY else: self.brand = Brand.SONY def update_from_neo4j_model(self, model) -> None: self.name = model.get("name") if not self.name else self.name self.email = model.get("email") self.identity = model.get("user_id") self.audience_profile = True if model.get("profile") else False self.vendors = [Vendor.from_model(vendor) for vendor in model.get("vendors")] self.exists = True self.set_brand() @property def vendors_ids(self) -> list[int]: return [vendor.id for vendor in self.vendors] def __post_init__(self): if self.email: self.validate_email() self.set_brand()