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.search import ORMSearchable
from typing import TYPE_CHECKING
if TYPE_CHECKING:
import uuid
from markupsafe import Markup
from datetime import datetime
from onegov.parliament.models.political_business import (
PoliticalBusiness,
)
[docs]
class Meeting(Base, ContentMixin, ORMSearchable):
[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_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
[docs]
start_datetime: Column[datetime | None]
start_datetime = Column(UTCDateTime, nullable=True)
#: location address of meeting
[docs]
address: Column[str] = Column(Text, 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',
)
)
[docs]
def __repr__(self) -> str:
return f'<Meeting {self.title}, {self.start_datetime}>'