from __future__ import annotations
from datetime import date
from sqlalchemy import or_
from onegov.core.collection import GenericCollection
from onegov.parliament.models import ParliamentaryGroup
from onegov.parliament.models import RISParliamentaryGroup
from typing import Any, TYPE_CHECKING
from typing_extensions import TypeVar
if TYPE_CHECKING:
from sqlalchemy.orm import Query
from sqlalchemy.orm import Session
from typing import Self
[docs]
GroupT = TypeVar(
'GroupT',
bound=ParliamentaryGroup,
default=Any
)
[docs]
class ParliamentaryGroupCollection(GenericCollection[GroupT]):
def __init__(
self,
session: Session,
active: bool | None = None
):
super().__init__(session)
@property
[docs]
def model_class(self) -> type[GroupT]:
return ParliamentaryGroup # type: ignore[return-value]
[docs]
def query(self) -> Query[GroupT]:
query = super().query()
ParliamentaryGroup = self.model_class # noqa: N806
if self.active is not None:
if self.active:
query = query.filter(
or_(
ParliamentaryGroup.end.is_(None),
ParliamentaryGroup.end >= date.today()
)
)
else:
query = query.filter(ParliamentaryGroup.end < date.today())
return query.order_by(ParliamentaryGroup.name)
[docs]
def for_filter(
self,
active: bool | None = None
) -> Self:
return self.__class__(self.session, active)
[docs]
class RISParliamentaryGroupCollection(
ParliamentaryGroupCollection[RISParliamentaryGroup]
):
@property
[docs]
def model_class(self) -> type[RISParliamentaryGroup]:
return RISParliamentaryGroup