Source code for timelink.api.models.person

from typing import Optional

# pylint: disable=import-error
from sqlalchemy import String, ForeignKey
from sqlalchemy.orm import mapped_column, Mapped

from timelink.kleio.utilities import quote_long_text
from .entity import Entity


[docs] class Person(Entity): """Represents a person in a historical source""" __tablename__ = "persons" id: Mapped[str] = mapped_column( String, ForeignKey("entities.id", ondelete="CASCADE"), primary_key=True ) name: Mapped[Optional[str]] = mapped_column(String, index=True) sex: Mapped[Optional[str]] = mapped_column(String(1)) obs: Mapped[Optional[str]] = mapped_column(String) __mapper_args__ = {"polymorphic_identity": "person"} def __repr__(self): sr = super().__repr__() return ( f"Person(id={sr}, " f'name="{self.name}", ' f'sex="{self.sex}", ' f"obs={self.obs}" f")" ) def __str__(self): return self.to_kleio()
[docs] def to_kleio(self, self_string='', ident="", ident_inc=" ", show_contained=True, width=80, **kwargs) -> str: if self.groupname is None: myname = "person" else: myname = self.groupname r = ( f"{myname}${self.for_kleio('name')}/" f"{self.for_kleio('sex')}{self.render_id()}" ) obss = self.for_kleio('obs') if len(obss) > 0: r = f"{r}/obs={quote_long_text(obss, width=width)}" kleio = super().to_kleio( self_string=r, show_contained=show_contained, ident=ident, ident_inc=ident_inc, width=width, **kwargs ) return kleio
[docs] def get_person(id: str = None, db=None, session=None, sql_echo: bool = False) -> Person: """ Fetch a person from the database """ if id is None: raise ValueError("Error, id needed") if session is None and db is None: raise ValueError("Error, session or database object needed") if db is not None: with db.session() as session: p: Person = session.get(Person, id) elif session is not None: p: Person = session.get(Person, id) return p
[docs] def pperson(id: str, session=None): """Prints a person in kleio notation""" print(get_person(id=id, session=session).to_kleio())