"""Schemas for the Timelink API
In the FastAPi tutorial this file
is used for the pydantic models for the API,
including for the classes that are used for database access.
Another file, called models.py, is used in the tutorial
for the SQLAlchemy models.
We use a module called "models" for the SQLAlchemy models
Here we put the pydantic models that are not related to
database models like search requests and search results.
"""
# pylint: disable=too-few-public-methods
from typing import List, Optional
from datetime import datetime
from datetime import date
from pydantic import BaseModel, ConfigDict # pylint: disable=import-error
[docs]
class EntitySchema(BaseModel):
"""Pydantic Schema for Entity"""
id: str
pom_class: str
inside: Optional[str]
the_order: Optional[int]
the_level: Optional[int]
the_line: Optional[int]
groupname: Optional[str]
updated: Optional[datetime]
indexed: Optional[datetime]
contains: Optional[List["EntitySchema"]]
model_config = ConfigDict(from_attributes=True)
[docs]
class EntityBriefSchema(BaseModel):
"""Pydantic Schema for Entity brief
No links to other entities
"""
id: str
pom_class: str
inside: Optional[str]
the_order: Optional[int]
the_level: Optional[int]
the_line: Optional[int]
groupname: Optional[str]
updated: Optional[datetime]
indexed: Optional[datetime]
model_config = ConfigDict(from_attributes=True)
[docs]
class RelationSchema(BaseModel):
id: str
origin: str
destination: str
the_type: str
the_value: str
the_date: str
obs: Optional[str]
model_config = ConfigDict(from_attributes=True)
[docs]
class RelationOutSchema(RelationSchema):
dest_name: Optional[str]
[docs]
class RelationInSchema(RelationSchema):
org_name: Optional[str]
[docs]
class AttributeSchema(BaseModel):
entity: str
the_type: str
the_value: str
the_date: str
obs: Optional[str]
groupname: str = None
model_config = ConfigDict(from_attributes=True)
[docs]
class EntityAttrRelSchema(BaseModel):
"""Pydantic Schema for Entity with attributes, relation and contained entities"""
id: str
pom_class: str
inside: Optional[str]
the_order: Optional[int]
the_level: Optional[int]
the_line: Optional[int]
groupname: Optional[str]
updated: Optional[datetime]
indexed: Optional[datetime]
attributes: Optional[List["AttributeSchema"]]
rels_in: Optional[List["RelationInSchema"]]
rels_out: Optional[List["RelationOutSchema"]]
contains: Optional[List["EntityBriefSchema"]]
model_config = ConfigDict(from_attributes=True)
[docs]
class SearchRequest(BaseModel):
"""Search request
Fields:
q: search query
after: date after which to search, possibly None
until: date until which to search, possibly None
skip: number of items to skip, default 0
limit: number of items to return, default 100
"""
q: str
after: date | None = (
None # see https://docs.pydantic.dev/usage/types/#datetime-types
)
until: date | None = None
skip: int | None = 0
limit: int | None = 100
[docs]
class SearchResults(BaseModel):
"""Search results
Fields:
results: list of search results
"""
id: str
the_class: str
description: str
start_date: date
end_date: date
[docs]
class ImportStats(BaseModel):
"""Import statistics
Fields:
datetime: date and time of import
machine: machine where import was done
database: specific database where import was done
file: file that was imported
import_time_seconds: time in seconds that import took
entities_processed: number of entities processed
entity_rate: number of entities processed per second
person_rate: number of persons processed per second
nerrors: number of errors
errors: list of errors
"""
datetime: date
machine: str
database: str
file: str
import_time_seconds: float
entities_processed: int
entity_rate: float
person_rate: float
nerrors: int
errors: List[str]