Source code for pas.models.parliamentarian

from __future__ import annotations

from onegov.parliament.models import Parliamentarian
from onegov.pas.models.parliamentarian_role import PASParliamentarianRole
from onegov.search import ORMSearchable
from sqlalchemy import or_
from sqlalchemy.orm import relationship


from typing import TYPE_CHECKING
if TYPE_CHECKING:
    from datetime import date
    from onegov.pas.models import Attendence
    from onegov.pas.models import Party
    from sqlalchemy.orm import Session


[docs] class PASParliamentarian(Parliamentarian, ORMSearchable):
[docs] __mapper_args__ = { 'polymorphic_identity': 'pas_parliamentarian', }
[docs] es_type_name = 'pas_parliamentarian'
[docs] es_public = False
[docs] es_properties = { 'first_name': {'type': 'text'}, 'last_name': {'type': 'text'}, }
@property
[docs] def es_suggestion(self) -> tuple[str, ...]: return ( f'{self.first_name} {self.last_name}', f'{self.last_name} {self.first_name}' )
#: A parliamentarian may attend meetings
[docs] attendences: relationship[list[Attendence]] = relationship( 'Attendence', cascade='all, delete-orphan', back_populates='parliamentarian' )
if TYPE_CHECKING:
[docs] roles: relationship[list[PASParliamentarianRole]] # type: ignore[assignment]
[docs] def get_party_during_period( self, start_date: date, end_date: date, session: Session ) -> Party | None: """Get the party this parliamentarian belonged to during a specific period.""" role = ( session.query(PASParliamentarianRole) .filter( PASParliamentarianRole.parliamentarian_id == self.id, PASParliamentarianRole.party_id.isnot( None ), or_( PASParliamentarianRole.end.is_(None), PASParliamentarianRole.end >= start_date, ), PASParliamentarianRole.start <= end_date, ) .order_by(PASParliamentarianRole.start.desc()) .first() ) return role.party if role else None