Source code for org.forms.meeting
from __future__ import annotations
from wtforms.validators import Optional, InputRequired
from wtforms import StringField
from onegov.form import Form
from onegov.form.fields import TimezoneDateTimeField, ChosenSelectMultipleField
from onegov.org.forms.fields import HtmlField
from onegov.org import _
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from collections.abc import Collection
from onegov.org.models import Meeting
[docs]
class MeetingForm(Form):
[docs]
start_datetime = TimezoneDateTimeField(
timezone='Europe/Zurich',
label=_('Start'),
validators=[Optional()],
)
[docs]
end_datetime = TimezoneDateTimeField(
timezone='Europe/Zurich',
label=_('End'),
validators=[Optional()],
)
[docs]
address = HtmlField(
label=_('Address'),
validators=[InputRequired()],
render_kw={'rows': 3}
)
[docs]
description = HtmlField(
label=_('Description'),
validators=[Optional()],
render_kw={'rows': 5}
)
[docs]
meeting_items = ChosenSelectMultipleField(
label=_('Agenda Items'),
choices=[],
validators=[Optional()]
)
[docs]
def on_request(self) -> None:
from onegov.org.models import MeetingItem
meetings = (
self.request.session.query(MeetingItem)
.order_by(MeetingItem.number, MeetingItem.title)
.all()
)
self.meeting_items.choices = [
(item.id.hex, item.display_name)
for item in meetings
]
[docs]
def populate_obj( # type:ignore[override]
self,
obj: Meeting, # type:ignore[override]
exclude: Collection[str] | None = None,
include: Collection[str] | None = None
) -> None:
from onegov.org.models import MeetingItem
super().populate_obj(
obj,
exclude={
'meeting_items',
*(exclude or ())
},
include=include
)
meeting: Meeting = obj
meeting_item_ids = {item.id.hex for item in meeting.meeting_items}
new_item_ids = set(self.meeting_items.data or [])
items_to_add = new_item_ids - meeting_item_ids
for new_id in items_to_add:
item = (
self.request.session.query(MeetingItem)
.filter(MeetingItem.id == new_id)
.one()
)
if item is not None:
meeting.meeting_items.append(item)
items_to_remove = meeting_item_ids - new_item_ids
for current_id in items_to_remove:
item = (
self.request.session.query(MeetingItem)
.filter(MeetingItem.id == current_id)
.one()
)
if item is not None:
meeting.meeting_items.remove(item)
[docs]
def process_obj(self, obj: Meeting) -> None: # type:ignore[override]
super().process_obj(obj)
meeting: Meeting = obj
self.meeting_items.data = [
item.id.hex for item in meeting.meeting_items
]