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_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