Source code for parliament.collections.parliamentarian

from __future__ import annotations

from onegov.core.collection import GenericCollection
from onegov.core.utils import toggle
from onegov.parliament.models import Parliamentarian

from typing import Any, TYPE_CHECKING
from typing_extensions import TypeVar
if TYPE_CHECKING:
    from collections.abc import Collection
    from sqlalchemy.orm import Query
    from sqlalchemy.orm import Session
    from typing import Self


[docs] ParliamentarianT = TypeVar( 'ParliamentarianT', bound=Parliamentarian, default=Any )
[docs] class ParliamentarianCollection(GenericCollection[ParliamentarianT]): def __init__( self, session: Session, active: Collection[bool] | None = None, party: Collection[str] | None = None ): super().__init__(session)
[docs] self.active = set(active) if active else set()
[docs] self.party = set(party) if party else set()
@property
[docs] def model_class(self) -> type[ParliamentarianT]: return Parliamentarian # type: ignore[return-value]
[docs] def query(self) -> Query[ParliamentarianT]: query = super().query() Parliamentarian = self.model_class # noqa: N806 if self.active: query = query.filter( Parliamentarian.active.expression.in_(self.active)) # type: ignore[attr-defined] if self.party: query = query.filter( Parliamentarian.party.in_(self.party) ) return query.order_by( Parliamentarian.last_name, Parliamentarian.first_name ).distinct()
[docs] def for_filter( self, active: bool | None = None, party: str | None = None, ) -> Self: active_ = toggle(self.active, active) party_ = toggle(self.party, party) return self.__class__( self.session, active=active_, party=party_ )
[docs] def party_values(self) -> list[str]: """ Returns a list of all parties given in the database. """ return sorted([ party[0] for party in self.session.query(Parliamentarian.party).distinct() if party[0] ])