diff --git a/src/compub/models/companies.py b/src/compub/models/companies.py index 8d0ae84..fe50194 100644 --- a/src/compub/models/companies.py +++ b/src/compub/models/companies.py @@ -20,6 +20,7 @@ __all__ = [ 'LegalForm', 'LegalFormSubcategory', 'Industry', + 'Executive', 'Company', 'CompanyName', ] @@ -66,13 +67,21 @@ class LegalFormSubcategory(AbstractBase, table=True): class CompanyIndustryLink(AbstractBase, table=True): - __tablename__ = 'company_industries' + __tablename__ = 'company_industry' # Relationships company_id: Optional[int] = Field(foreign_key='company.id', default=None, nullable=False, primary_key=True) industry_id: Optional[int] = Field(foreign_key='industry.id', default=None, nullable=False, primary_key=True) +class CompanyExecutiveLink(AbstractBase, table=True): + __tablename__ = 'company_executive' + + # Relationships + company_id: Optional[int] = Field(foreign_key='company.id', default=None, nullable=False, primary_key=True) + executive_id: Optional[int] = Field(foreign_key='executive.id', default=None, nullable=False, primary_key=True) + + class Industry(AbstractBase, table=True): __tablename__ = 'industry' @@ -88,6 +97,24 @@ class Industry(AbstractBase, table=True): return str(self.name) +class Executive(AbstractBase, table=True): + __tablename__ = 'executive' + __MAX_LENGTH_NAME__: int = 255 + + # Fields + name: str = Field( + max_length=__MAX_LENGTH_NAME__, sa_column=Column(Unicode(__MAX_LENGTH_NAME__), nullable=False, index=True) + ) + + # Relationships + companies: list['Company'] = Relationship( + back_populates='executives', link_model=CompanyExecutiveLink, sa_relationship_kwargs={'lazy': 'selectin'} + ) + + def __str__(self) -> str: + return str(self.name) + + class Company(AbstractBase, table=True): __tablename__ = 'company' @@ -96,7 +123,8 @@ class Company(AbstractBase, table=True): insolvent: bool = Field(default=False, nullable=False, index=True) founding_data: Optional[date] liquidation_date: Optional[date] - city: str = Field(max_length=255, index=True) # TODO: Get rid of city; implement address properly + # TODO: Get rid of city; implement address properly + city: Optional[str] = Field(max_length=255, nullable=True, index=True) # Relationships legal_form_id: Optional[int] = Field( @@ -114,6 +142,10 @@ class Company(AbstractBase, table=True): back_populates='companies', link_model=CompanyIndustryLink, sa_relationship_kwargs={'lazy': 'selectin'} ) + executives: list[Executive] = Relationship( + back_populates='companies', link_model=CompanyExecutiveLink, sa_relationship_kwargs={'lazy': 'selectin'} + ) + names: list['CompanyName'] = Relationship( back_populates='company', sa_relationship_kwargs={'lazy': 'selectin'} ) @@ -128,12 +160,12 @@ class Company(AbstractBase, table=True): class CompanyName(AbstractBase, table=True): __tablename__ = 'company_name' - __MAX_NAME_LENGTH__: int = 768 + __MAX_LENGTH_NAME__: int = 768 __MAX_SLUG_LENGTH__: int = 255 # Fields name: str = Field( - max_length=__MAX_NAME_LENGTH__, sa_column=Column(Unicode(__MAX_NAME_LENGTH__), nullable=False, index=True) + max_length=__MAX_LENGTH_NAME__, sa_column=Column(Unicode(__MAX_LENGTH_NAME__), nullable=False, index=True) ) date_registered: Optional[date] slug: Optional[str] = Field(default=None, max_length=__MAX_SLUG_LENGTH__, index=True)