Source code for parliament.models.meeting

from __future__ import annotations

import uuid

from sqlalchemy import Column, Text, ForeignKey
from sqlalchemy.orm import RelationshipProperty, relationship

from onegov.core.orm import Base
from onegov.core.orm.mixins import ContentMixin
from onegov.core.orm.types import UUID, MarkupText, UTCDateTime
from onegov.file import AssociatedFiles
from onegov.search import ORMSearchable

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    import uuid

    from datetime import datetime

    from markupsafe import Markup
    from onegov.parliament.models.political_business import (
        PoliticalBusiness,
    )
    from onegov.parliament.models.meeting_item import MeetingItem


[docs] class Meeting(Base, ContentMixin, ORMSearchable, AssociatedFiles):
[docs] __tablename__ = 'par_meetings'
[docs] type: Column[str] = Column( Text, nullable=False, default=lambda: 'generic' )
[docs] __mapper_args__ = { 'polymorphic_on': type, 'polymorphic_identity': 'generic', }
[docs] es_public = True
[docs] es_properties = {'title_text': {'type': 'text'}}
@property
[docs] def es_suggestion(self) -> str: return self.title
@property
[docs] def title_text(self) -> str: return f'{self.title} ({self.start_datetime})'
#: Internal ID
[docs] id: Column[uuid.UUID] = Column( UUID, # type:ignore[arg-type] primary_key=True, default=uuid.uuid4, )
#: The title of the meeting
[docs] title: Column[str] = Column(Text, nullable=False)
#: date and time of the meeting start
[docs] start_datetime: Column[datetime | None]
start_datetime = Column(UTCDateTime, nullable=True) #: date and time of the meeting end
[docs] end_datetime: Column[datetime | None]
end_datetime = Column(UTCDateTime, nullable=True) #: location address of meeting
[docs] address: Column[Markup] = Column(MarkupText, nullable=False)
[docs] description: Column[Markup | None] = Column(MarkupText, nullable=True)
#: political business id
[docs] political_business_id: Column[uuid.UUID | None] = Column( UUID, # type:ignore[arg-type] ForeignKey('par_political_businesses.id'), )
#: list of political businesses, "Traktanden"
[docs] political_businesses: RelationshipProperty[PoliticalBusiness] = ( relationship( 'PoliticalBusiness', back_populates='meetings', order_by='PoliticalBusiness.number', primaryjoin='Meeting.political_business_id == ' 'PoliticalBusiness.id', ) )
#: The meeting items
[docs] meeting_items: relationship[list[MeetingItem]]
meeting_items = relationship( 'MeetingItem', cascade='all, delete-orphan', back_populates='meeting', order_by='desc(MeetingItem.number)' )
[docs] def __repr__(self) -> str: return f'<Meeting {self.title}, {self.start_datetime}>'