Source code for pas.request

from datetime import date
from onegov.pas.custom import has_user_set_abschluss_for_commission
from onegov.pas.models import (
    Attendence,
    PASCommissionMembership,
    SettlementRun,
)
from onegov.pas.i18n import _
from onegov.pas.utils import is_parliamentarian
from functools import cached_property
from onegov.town6.request import TownRequest

from typing import TypeVar, TYPE_CHECKING
if TYPE_CHECKING:
    from uuid import UUID
    from onegov.pas.app import PasApp
    from onegov.pas.models import PASParliamentarian


[docs] AppT = TypeVar('AppT', bound='PasApp', default='PasApp', covariant=True)
[docs] class PasRequest(TownRequest[AppT]): @cached_property
[docs] def is_parliamentarian(self) -> bool: return is_parliamentarian(self.current_user)
@cached_property
[docs] def has_commission_president_role(self) -> bool: user = self.current_user if not user: return False return user.role == 'commission_president'
@cached_property
[docs] def current_parliamentarian(self) -> PASParliamentarian | None: if (self.current_user and hasattr(self.current_user, 'parliamentarian') and self.current_user.parliamentarian): return self.current_user.parliamentarian return None
[docs] def warn_no_parliamentarian(self) -> bool: if ( self.current_user and self.current_user.role in ('parliamentarian', 'commission_president') and not self.current_parliamentarian ): self.warning( _( 'Your user account is not linked ' 'to a parliamentarian record. ' 'Please contact an administrator.' ) ) return True return False
[docs] def can_edit_commission_attendance( self, attendance_date: date, commission_id: UUID | None, parliamentarian_id: UUID, ) -> bool: if self.is_admin: return True president = self.current_parliamentarian if not self.has_commission_president_role or president is None: return False if commission_id is None: return False if not any( membership.commission_id == commission_id for membership in president.commission_memberships_on( on_date=date.today(), role='president' ) ): return False memberships = self.session.query(PASCommissionMembership).filter_by( commission_id=commission_id, parliamentarian_id=parliamentarian_id, ) if not any(m.is_active_on(date.today()) for m in memberships): return False run = ( self.session.query(SettlementRun) .filter( SettlementRun.start <= attendance_date, SettlementRun.end >= attendance_date, ) .first() ) if run is None or run.closed: return False return not any( has_user_set_abschluss_for_commission( self.session, person_id, commission_id, attendance_date ) for person_id in {president.id, parliamentarian_id} )
[docs] def can_edit_attendence(self, attendence: Attendence) -> bool: if self.is_admin: return True records = ( self.session.query(Attendence) .filter_by(bulk_edit_id=attendence.bulk_edit_id) .all() if attendence.bulk_edit_id else [attendence] ) return all( record.type != 'plenary' and self.can_edit_commission_attendance( record.date, record.commission_id, record.parliamentarian_id ) for record in records )