Auto generated labels for resource

This commit is contained in:
2023-01-22 17:55:34 +01:00
parent 7dd684e514
commit 4553cba89f

View File

@@ -2,17 +2,17 @@ from enum import Enum
from datetime import datetime, date from datetime import datetime, date
from typing import List, Literal from typing import List, Literal
from pydantic import Field, BaseModel from pydantic import Field, BaseModel, validator
from beanie import Document, Link from beanie import Document, Link
class EntityType(str, Enum): class EntityType(BaseModel):
individual = 'individual' @property
corporation = 'corporation' def label(self) -> str:
institution = 'institution' return self.title
class Individual(BaseModel): class Individual(EntityType):
type: Literal['individual'] = 'individual' type: Literal['individual'] = 'individual'
firstname: str firstname: str
middlenames: List[str] = Field(default=[]) middlenames: List[str] = Field(default=[])
@@ -23,28 +23,55 @@ class Individual(BaseModel):
employer: str employer: str
class Employee(BaseModel): @property
def label(self) -> str:
if len(self.surnames) > 0:
return '{} "{}" {}'.format(self.firstname, self.surnames[0], self.lastname)
return '{} {}'.format(self.firstname, self.lastname)
@staticmethod
def get_label(data) -> str:
if len(data['surname']) > 0:
return '{} "{}" {}'.format(data['firstname'], data['surnames'][0], data['lastname'])
return '{} {}'.format(data['firstname'], data['lastname'])
class Employee(EntityType):
role: str role: str
entity_id: str = Field(foreignKey={ entity_id: str = Field(foreignKey={
"reference": { "reference": {
"resource": "entity", "resource": "entity",
"fields": "_id" "displayName": "_id",
"condition": "entity_data.type=individual"
} }
}) })
class Corporation(BaseModel): class Corporation(EntityType):
type: Literal['corporation'] = 'corporation' type: Literal['corporation'] = 'corporation'
title: str title: str
activity: str activity: str
employees: List[Employee] = Field(default=[]) employees: List[Employee] = Field(default=[])
class Institution(BaseModel):
type: Literal['institution'] = 'institution'
title: str
activity: str
employees: List[Employee] = Field(default=[])
class Entity(Document): class Entity(Document):
_id: str _id: str
name: str
address: str address: str
entity_data: Individual | Corporation = Field(..., discriminator='type') entity_data: Individual | Corporation | Institution = Field(..., discriminator='type')
label: str = None
@validator("label", always=True)
def generate_label(cls, v, values, **kwargs):
return values['entity_data'].label
created_at: datetime = Field(default=datetime.utcnow(), nullable=False) created_at: datetime = Field(default=datetime.utcnow(), nullable=False)
updated_at: datetime = Field(default_factory=datetime.utcnow, nullable=False) updated_at: datetime = Field(default_factory=datetime.utcnow, nullable=False)