diff --git a/src/onegov/org/forms/meeting.py b/src/onegov/org/forms/meeting.py index 55c90d8b9f..05a5cbf660 100644 --- a/src/onegov/org/forms/meeting.py +++ b/src/onegov/org/forms/meeting.py @@ -1,24 +1,102 @@ from __future__ import annotations -from wtforms import DateTimeField +from wtforms import StringField +from wtforms.validators import Optional, InputRequired from onegov.form import Form +from onegov.form.fields import TimezoneDateTimeField, ChosenSelectMultipleField from onegov.org.forms.fields import HtmlField from onegov.parliament import _ -from wtforms.validators import Optional +from onegov.parliament.models import Meeting, MeetingItem + +from typing import TYPE_CHECKING +from collections.abc import Collection +if TYPE_CHECKING: + from collections.abc import Collection class MeetingForm(Form): + title = StringField( + label=_('Title'), + validators=[InputRequired()], + ) - start_datetime = DateTimeField( + start_datetime = TimezoneDateTimeField( + timezone='Europe/Zurich', label=_('Start'), validators=[Optional()], ) + end_datetime = TimezoneDateTimeField( + timezone='Europe/Zurich', + label=_('End'), + validators=[Optional()], + ) + address = HtmlField( - label=_('Portrait'), + label=_('Address'), + validators=[InputRequired()], + render_kw={'rows': 3} ) description = HtmlField( label=_('Description'), + validators=[Optional()], + render_kw={'rows': 5} ) + + agenda_items = ChosenSelectMultipleField( + label=_('Agenda Items'), + validators=[Optional()], + choices=[], + ) + + def on_request(self) -> None: + + meetings = (self.request.session.query(MeetingItem) + .order_by(MeetingItem.number, MeetingItem.title) + .all()) + + self.agenda_items.choices = [ + (item.id.hex, item.display_name()) + for item in meetings + ] + + def populate_obj( + self, + obj: object, + exclude: Collection[str] | None = None, + include: Collection[str] | None = None + ) -> None: + if not isinstance(obj, Meeting): + raise TypeError('Object must be a MeetingItem') + + meeting: Meeting = obj + item: MeetingItem | None + super().populate_obj(obj, exclude=exclude, include=include) + + meeting_item_ids = {item.id.hex for item in meeting.meeting_items} + new_item_ids = set(self.agenda_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).get(current_id) + if item is not None: + meeting.meeting_items.remove(item) + + def process_obj(self, obj: MeetingItem) -> None: # type: ignore[override] + if not isinstance(obj, Meeting): + raise TypeError('Object must be a MeetingItem') + + super().process_obj(obj) + + self.agenda_items.data = [ + item.id.hex for item in obj.meeting_items + ] diff --git a/src/onegov/parliament/collections/meeting.py b/src/onegov/parliament/collections/meeting.py index 91a854177a..7a21570d3a 100644 --- a/src/onegov/parliament/collections/meeting.py +++ b/src/onegov/parliament/collections/meeting.py @@ -1,11 +1,13 @@ from __future__ import annotations +from functools import cached_property + from onegov.core.collection import GenericCollection +from onegov.parliament.models import Meeting +from onegov.town6 import _ from typing import TYPE_CHECKING -from onegov.parliament.models import Meeting - if TYPE_CHECKING: from uuid import UUID from sqlalchemy.orm import Query @@ -13,6 +15,10 @@ class MeetingCollection(GenericCollection[Meeting]): + @cached_property + def title(self) -> str: + return _('Meeting') + @property def model_class(self) -> type[Meeting]: return Meeting diff --git a/src/onegov/parliament/models/meeting.py b/src/onegov/parliament/models/meeting.py index caad73829d..f1f5c0f43d 100644 --- a/src/onegov/parliament/models/meeting.py +++ b/src/onegov/parliament/models/meeting.py @@ -80,6 +80,7 @@ def title_text(self) -> str: ForeignKey('par_political_businesses.id'), ) + # FIXME: is this used or covered by meeting_items? #: list of political businesses, "Traktanden" political_businesses: RelationshipProperty[PoliticalBusiness] = ( relationship( @@ -97,7 +98,7 @@ def title_text(self) -> str: 'MeetingItem', cascade='all, delete-orphan', back_populates='meeting', - order_by='desc(MeetingItem.number)' + order_by='asc(MeetingItem.number)' ) def __repr__(self) -> str: diff --git a/src/onegov/parliament/models/meeting_item.py b/src/onegov/parliament/models/meeting_item.py index 500b58610a..e4a68cab0d 100644 --- a/src/onegov/parliament/models/meeting_item.py +++ b/src/onegov/parliament/models/meeting_item.py @@ -71,5 +71,8 @@ def es_suggestion(self) -> str: back_populates='meeting_items' ) + def display_name(self) -> str: + return f'{self.number} {self.title}' if self.number else self.title + def __repr__(self) -> str: return f'' diff --git a/src/onegov/town6/layout.py b/src/onegov/town6/layout.py index 3105c1dd03..2fa193eb81 100644 --- a/src/onegov/town6/layout.py +++ b/src/onegov/town6/layout.py @@ -1078,6 +1078,10 @@ def editbar_links(self) -> list[LinkGroup] | None: class MeetingLayout(DefaultLayout): + @cached_property + def collection(self) -> MeetingCollection: + return MeetingCollection(self.request.session) + @cached_property def title(self) -> str: return self.model.title @@ -1096,20 +1100,48 @@ def breadcrumbs(self) -> list[Link]: ] @cached_property - def editbar_links(self) -> list[LinkGroup] | None: + def editbar_links(self) -> list[Link | LinkGroup] | None: if self.request.is_manager: return [ LinkGroup( title=_('Add'), links=[ Link( - text=_('Meeting'), + text=_('Parliamentarian'), url=self.request.link(self.model, 'new'), - attrs={'class': 'new-meeting'}, + attrs={'class': 'new-parliamentarian'}, ), ], ), + Link( + text=_('Edit'), + url=self.request.link(self.model, 'edit'), + attrs={'class': 'edit-meeting'} + ), + Link( + text=_('Delete'), + url=self.csrf_protected_url( + self.request.link(self.model) + ), + attrs={'class': 'delete-meeting'}, + traits=( + Confirm( + _( + 'Do you really want to delete this meeting?' + ), + _('This cannot be undone.'), + _('Delete meeting'), + _('Cancel') + ), + Intercooler( + request_method='DELETE', + redirect_after=self.request.link( + self.collection) + ) + ) + ) ] + return None diff --git a/src/onegov/town6/locale/de_CH/LC_MESSAGES/onegov.town6.po b/src/onegov/town6/locale/de_CH/LC_MESSAGES/onegov.town6.po index ac8d87817a..4e35177a4f 100644 --- a/src/onegov/town6/locale/de_CH/LC_MESSAGES/onegov.town6.po +++ b/src/onegov/town6/locale/de_CH/LC_MESSAGES/onegov.town6.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: OneGov Cloud 1.0\n" -"POT-Creation-Date: 2025-07-09 13:44+0200\n" +"POT-Creation-Date: 2025-07-07 15:20+0200\n" "PO-Revision-Date: 2021-03-03 16:24+0100\n" "Last-Translator: Lukas Burkhard \n" "Language-Team: German\n" @@ -301,18 +301,27 @@ msgstr "Parlamentarierinnen und Parlamentarier" msgid "Parliamentarian" msgstr "Parlamentarier:in" -msgid "Role (as a party or group member)" -msgstr "Rolle (als Partei- oder Fraktionsmitglied)" - msgid "Edit" msgstr "Bearbeiten" -msgid "Do you really want to delete this parliamentarian?" -msgstr "Möchten Sie diese:n Parlamentarier:in wirklich löschen?" +msgid "Do you really want to delete this meeting?" +msgstr "Diese Sitzung wirklich löschen?" msgid "This cannot be undone." msgstr "Dies kann nicht rückgängig gemacht werden." +msgid "Delete meeting" +msgstr "Sitzung löschen" + +msgid "Parliamentarians" +msgstr "Parlamentarierinnen und Parlamentarier" + +msgid "Role (as a party or group member)" +msgstr "Rolle (als Partei- oder Fraktionsmitglied)" + +msgid "Do you really want to delete this parliamentarian?" +msgstr "Möchten Sie diese:n Parlamentarier:in wirklich löschen?" + msgid "Delete parliamentarian" msgstr "Parlamentarier:in löschen" @@ -2460,33 +2469,63 @@ msgstr "Neue Kommission" msgid "Your changes were saved" msgstr "Ihre Änderungen wurden gespeichert" +msgid "The commission has been deleted." +msgstr "Die Kommission wurde gelöscht." + msgid "Sort" msgstr "Sortieren" +msgid "Added a new meeting." +msgstr "Neue Sitzung hinzugefügt" + +msgid "New Meeting" +msgstr "Neue Sitzung" + +msgid "Your changes were saved." +msgstr "Ihre Änderungen wurden gespeichert." + +msgid "Edit Meeting" +msgstr "Sitzung bearbeiten" + +msgid "The meeting has been deleted." +msgstr "Die Sitzung wurde gelöscht." + msgid "Added a new parliamentarian" msgstr "Parlamentarier:in hinzugefügt" msgid "New parliamentarian" msgstr "Neue:r Parlamentarier:in" +msgid "The parliamentarian has been deleted." +msgstr "Der/die Parlamentarier:in wurde gelöscht." + msgid "Added a new role" msgstr "Neue Rolle hinzugefügt" msgid "New role" msgstr "Neue Rolle" +msgid "The parliamentarian role has been deleted." +msgstr "Die Rolle des/der Parlamentarier:in wurde gelöscht." + msgid "Added a new parliamentary group" msgstr "Fraktion hinzugefügt" msgid "New parliamentary group" msgstr "Neue Fraktion" +msgid "The parliamentary group has been deleted." +msgstr "Die Fraktion wurde gelöscht." + msgid "Added a new party" msgstr "Partei hinzugefügt" msgid "New party" msgstr "Neue Partei" +msgid "The party has been deleted." +msgstr "Die Partei wurde gelöscht." + msgid "New Recipient" msgstr "Neuer Empfänger" @@ -2596,6 +2635,12 @@ msgstr "Ratsinformationssystem (RIS)" msgid "New Note" msgstr "Neue Notiz" +#~ msgid "The political business has been deleted." +#~ msgstr "Das politische Geschäft wurde gelöscht." + +#~ msgid "Agenda Items" +#~ msgstr "Traktanden" + #~ msgid "Parliamentarian is not in this commission." #~ msgstr "Parlamentarier:in ist nicht in dieser Kommission." @@ -2629,12 +2674,6 @@ msgstr "Neue Notiz" #~ msgid "End must be after start" #~ msgstr "Ende muss nach dem Start liegen" -#~ msgid "Do you really want to delete this meeting?" -#~ msgstr "Diese Sitzung wirklich löschen?" - -#~ msgid "Delete meeting" -#~ msgstr "Sitzung löschen" - #~ msgid "Do you really want to remove this parliamentarian?" #~ msgstr "Diese:n Parlamentarier:in wirklich entfernen?" diff --git a/src/onegov/town6/locale/fr_CH/LC_MESSAGES/onegov.town6.po b/src/onegov/town6/locale/fr_CH/LC_MESSAGES/onegov.town6.po index c04fdf8b9a..979d489d3d 100644 --- a/src/onegov/town6/locale/fr_CH/LC_MESSAGES/onegov.town6.po +++ b/src/onegov/town6/locale/fr_CH/LC_MESSAGES/onegov.town6.po @@ -301,18 +301,27 @@ msgstr "Parlementaires" msgid "Parliamentarian" msgstr "Parlementaire" -msgid "Role (as a party or group member)" -msgstr "Rôle (en tant que membre d'un parti ou d'un groupe)" - msgid "Edit" msgstr "Modifier" -msgid "Do you really want to delete this parliamentarian?" -msgstr "Voulez-vous vraiment supprimer ce parlementaire ?" +msgid "Do you really want to delete this meeting?" +msgstr "Voulez-vous vraiment supprimer cette réunion?" msgid "This cannot be undone." msgstr "Cela ne peut être effectué." +msgid "Delete meeting" +msgstr "Supprimer la réunion" + +msgid "Parliamentarians" +msgstr "Parlementaires" + +msgid "Role (as a party or group member)" +msgstr "Rôle (en tant que membre d'un parti ou d'un groupe)" + +msgid "Do you really want to delete this parliamentarian?" +msgstr "Voulez-vous vraiment supprimer ce parlementaire ?" + msgid "Delete parliamentarian" msgstr "Supprimer le parlementaire" @@ -586,8 +595,8 @@ msgid "" "filled-out form." msgstr "" "Veuillez vérifier vos données et appuyez sur « Compléter » pour finaliser le " -"processus. S'il y a quelque chose que vous souhaitez modifier, cliquez sur " -"« Modifier » pour retourner sur le formulaire complété." +"processus. S'il y a quelque chose que vous souhaitez modifier, cliquez sur « " +"Modifier » pour retourner sur le formulaire complété." msgid "" "The image shown in the list view is a square. To have your image shown fully " @@ -2465,33 +2474,63 @@ msgstr "Nouvelle commission" msgid "Your changes were saved" msgstr "Vos modifications ont été enregistrées" +msgid "The commission has been deleted." +msgstr "La commission a été supprimée." + msgid "Sort" msgstr "Trier" +msgid "Added a new meeting." +msgstr "Ajout d'une nouvelle réunion." + +msgid "New Meeting" +msgstr "Nouvelle réunion" + +msgid "Your changes were saved." +msgstr "Vos modifications ont été enregistrées." + +msgid "Edit Meeting" +msgstr "Éditer la réunion" + +msgid "The meeting has been deleted." +msgstr "La réunion a été supprimée." + msgid "Added a new parliamentarian" msgstr "Ajout d'un nouveau parlementaire" msgid "New parliamentarian" msgstr "Nouveau parlementaire" +msgid "The parliamentarian has been deleted." +msgstr "Le parlementaire a été supprimé." + msgid "Added a new role" msgstr "Ajout d'un nouveau rôle" msgid "New role" msgstr "Nouveau rôle" +msgid "The parliamentarian role has been deleted." +msgstr "Le rôle du parlementaire a été supprimé." + msgid "Added a new parliamentary group" msgstr "Ajout d'un nouveau groupe parlementaire" msgid "New parliamentary group" msgstr "Nouveau groupe parlementaire" +msgid "The parliamentary group has been deleted." +msgstr "Le groupe parlementaire a été supprimé." + msgid "Added a new party" msgstr "Ajout d'un nouveau parti" msgid "New party" msgstr "Nouveau parti" +msgid "The party has been deleted." +msgstr "Le parti a été supprimé." + msgid "New Recipient" msgstr "Nouveau destinataire" diff --git a/src/onegov/town6/locale/it_CH/LC_MESSAGES/onegov.town6.po b/src/onegov/town6/locale/it_CH/LC_MESSAGES/onegov.town6.po index 83fdd71078..69a1607b72 100644 --- a/src/onegov/town6/locale/it_CH/LC_MESSAGES/onegov.town6.po +++ b/src/onegov/town6/locale/it_CH/LC_MESSAGES/onegov.town6.po @@ -297,18 +297,27 @@ msgstr "Parlamentari" msgid "Parliamentarian" msgstr "Parlamentare" -msgid "Role (as a party or group member)" -msgstr "Ruolo (come membro di un partito o di un gruppo)" - msgid "Edit" msgstr "Modifica" -msgid "Do you really want to delete this parliamentarian?" -msgstr "Vuole davvero cancellare questo parlamentare?" +msgid "Do you really want to delete this meeting?" +msgstr "Vuoi davvero cancellare questa riunione?" msgid "This cannot be undone." msgstr "L'operazione non può essere annullata." +msgid "Delete meeting" +msgstr "Elimina riunione" + +msgid "Parliamentarians" +msgstr "Parlamentari" + +msgid "Role (as a party or group member)" +msgstr "Ruolo (come membro di un partito o di un gruppo)" + +msgid "Do you really want to delete this parliamentarian?" +msgstr "Vuole davvero cancellare questo parlamentare?" + msgid "Delete parliamentarian" msgstr "Elimina parlamentare" @@ -2460,33 +2469,63 @@ msgstr "Nuova commissione" msgid "Your changes were saved" msgstr "Le modifiche sono state salvate" +msgid "The commission has been deleted." +msgstr "La commissione è stata eliminata." + msgid "Sort" msgstr "Ordinare" +msgid "Added a new meeting." +msgstr "Aggiunta una nuova riunione." + +msgid "New Meeting" +msgstr "Nuova riunione" + +msgid "Your changes were saved." +msgstr "Le modifiche sono state salvate." + +msgid "Edit Meeting" +msgstr "Modifica la riunione" + +msgid "The meeting has been deleted." +msgstr "La riunione è stata eliminata." + msgid "Added a new parliamentarian" msgstr "Aggiunto un nuovo parlamentare" msgid "New parliamentarian" msgstr "Nuovo parlamentare" +msgid "The parliamentarian has been deleted." +msgstr "Il parlamentare è stato eliminato." + msgid "Added a new role" msgstr "Aggiunto un nuovo ruolo" msgid "New role" msgstr "Nuovo ruolo" +msgid "The parliamentarian role has been deleted." +msgstr "Il ruolo del parlamentare è stato eliminato." + msgid "Added a new parliamentary group" msgstr "Aggiunto un nuovo gruppo parlamentare" msgid "New parliamentary group" msgstr "Nuovo gruppo parlamentare" +msgid "The parliamentary group has been deleted." +msgstr "Il gruppo parlamentare è stato eliminato." + msgid "Added a new party" msgstr "Aggiunto un nuovo partito" msgid "New party" msgstr "Nuovo partito" +msgid "The party has been deleted." +msgstr "Il partito è stato eliminato." + msgid "New Recipient" msgstr "Nuovo destinatario" diff --git a/src/onegov/town6/templates/meeting.pt b/src/onegov/town6/templates/meeting.pt index 4b2756d17f..4eb5077a63 100644 --- a/src/onegov/town6/templates/meeting.pt +++ b/src/onegov/town6/templates/meeting.pt @@ -32,9 +32,8 @@ href="${item.political_business_link}" class="list-link"> - ${item.number|None} ${item.title} + ${item.number} ${item.title} - diff --git a/src/onegov/town6/templates/parliamentarian.pt b/src/onegov/town6/templates/parliamentarian.pt index f99b7582d8..bcd938b1a6 100644 --- a/src/onegov/town6/templates/parliamentarian.pt +++ b/src/onegov/town6/templates/parliamentarian.pt @@ -154,7 +154,7 @@ -
+
Political Businesses
    diff --git a/src/onegov/town6/views/commission.py b/src/onegov/town6/views/commission.py index 8722abb03e..0e7c5483d5 100644 --- a/src/onegov/town6/views/commission.py +++ b/src/onegov/town6/views/commission.py @@ -122,6 +122,8 @@ def delete_commission( collection = CommissionCollection(request.session) collection.delete(self) + request.success(_('The commission has been deleted.')) + @TownApp.html( model=RISCommissionCollection, diff --git a/src/onegov/town6/views/meeting.py b/src/onegov/town6/views/meeting.py index 447d53acdb..c57975335d 100644 --- a/src/onegov/town6/views/meeting.py +++ b/src/onegov/town6/views/meeting.py @@ -1,8 +1,11 @@ from __future__ import annotations import morepath +from webob.exc import HTTPNotFound -from onegov.core.security.permissions import Public +from onegov.core.elements import Link +from onegov.core.security.permissions import Public, Private +from onegov.org.forms import MeetingForm from onegov.parliament.collections import MeetingCollection from onegov.parliament.models import Meeting @@ -14,6 +17,7 @@ from onegov.town6.layout import MeetingLayout from typing import TYPE_CHECKING + if TYPE_CHECKING: from onegov.town6.request import TownRequest from onegov.core.types import RenderData @@ -29,8 +33,10 @@ def view_meetings( self: MeetingCollection, request: TownRequest, - layout: MeetingCollectionLayout | None = None + layout: MeetingCollectionLayout | None = None, ) -> RenderData: + if not request.app.org.ris_enabled: + raise HTTPNotFound() return { 'layout': layout or MeetingCollectionLayout(self, request), @@ -39,6 +45,38 @@ def view_meetings( } +@TownApp.form( + model=MeetingCollection, + name='new', + template='form.pt', + permission=Private, + form=MeetingForm, +) +def add_meeting( + self: MeetingCollection, + request: TownRequest, + form: MeetingForm, +) -> RenderData | Response: + if not request.app.org.ris_enabled: + raise HTTPNotFound() + + layout = MeetingCollectionLayout(self, request) + + if form.submitted(request): + meeting = self.add(**form.get_useful_data()) + request.success(_('Added a new meeting.')) + return request.redirect(request.link(meeting)) + + layout.breadcrumbs.append(Link(_('New'), '#')) + + return { + 'layout': layout, + 'form': form, + 'title': _('New Meeting'), + 'form_width': 'large', + } + + @TownApp.html( model=Meeting, template='meeting.pt', @@ -48,6 +86,9 @@ def view_meeting( self: Meeting, request: TownRequest, ) -> RenderData: + if not request.app.org.ris_enabled: + raise HTTPNotFound() + layout = MeetingLayout(self, request) title = ( self.title + ' - ' + layout.format_date(self.start_datetime, 'date') @@ -61,13 +102,17 @@ def view_meeting( item_data = { 'number': item.number, 'title': item.title, - 'political_business_link': None + 'political_business_link': None, } if item.political_business_link_id: - business = request.session.query(PoliticalBusiness).filter( - PoliticalBusiness.meta['self_id'].astext == - item.political_business_link_id - ).first() + business = ( + request.session.query(PoliticalBusiness) + .filter( + PoliticalBusiness.meta['self_id'].astext + == item.political_business_link_id + ) + .first() + ) if business is not None: item_data['political_business_link'] = request.link(business) meeting_items_with_links.append(item_data) @@ -86,9 +131,64 @@ def view_meeting( } +@TownApp.form( + model=Meeting, + name='edit', + template='form.pt', + permission=Private, + form=MeetingForm, +) +def edit_meeting( + self: Meeting, + request: TownRequest, + form: MeetingForm, +) -> RenderData | Response: + if not request.app.org.ris_enabled: + raise HTTPNotFound() + + layout = MeetingLayout(self, request) + + if form.submitted(request): + form.populate_obj(self) + request.success(_('Your changes were saved.')) + return request.redirect(request.link(self)) + + form.process(obj=self) + + layout.breadcrumbs.append(Link(_('Edit'), '#')) + layout.editbar_links = [] + + return { + 'layout': layout, + 'form': form, + 'title': _('Edit Meeting'), + 'form_width': 'large', + } + + +@TownApp.view( + model=Meeting, + request_method='DELETE', + permission=Private, +) +def delete_meeting( + self: Meeting, + request: TownRequest, +) -> None: + if not request.app.org.ris_enabled: + raise HTTPNotFound() + + request.assert_valid_csrf_token() + + collection = MeetingCollection(request.session) + collection.delete(self) + + request.success(_('The meeting has been deleted.')) + + @TownApp.view(model=MeetingItem, permission=Public) def view_redirect_meeting_item_to_meeting( - self: MeetingItem, request: CoreRequest + self: MeetingItem, request: CoreRequest ) -> Response: """ Redirect for search results, if we link to MeetingItem we show the Meeting diff --git a/src/onegov/town6/views/parliamentarian.py b/src/onegov/town6/views/parliamentarian.py index 2111a53cd0..aec3e5ba55 100644 --- a/src/onegov/town6/views/parliamentarian.py +++ b/src/onegov/town6/views/parliamentarian.py @@ -1,5 +1,6 @@ from __future__ import annotations + from onegov.core.elements import Link from onegov.core.security import Public, Private from onegov.parliament.collections import RISParliamentarianCollection @@ -126,6 +127,8 @@ def delete_parliamentarian( collection = ParliamentarianCollection(request.session) collection.delete(self) + request.success(_('The parliamentarian has been deleted.')) + def add_commission_membership( self: RISParliamentarian | PASParliamentarian, diff --git a/src/onegov/town6/views/parliamentarian_role.py b/src/onegov/town6/views/parliamentarian_role.py index 9d9af9c6d6..c8234efabd 100644 --- a/src/onegov/town6/views/parliamentarian_role.py +++ b/src/onegov/town6/views/parliamentarian_role.py @@ -68,6 +68,8 @@ def delete_parliamentarian_role( collection = ParliamentarianRoleCollection(request.session) collection.delete(self) + request.success(_('The parliamentarian role has been deleted.')) + @TownApp.html( model=RISParliamentarianRole, diff --git a/src/onegov/town6/views/parliamentary_group.py b/src/onegov/town6/views/parliamentary_group.py index 9963516965..ba339ae89d 100644 --- a/src/onegov/town6/views/parliamentary_group.py +++ b/src/onegov/town6/views/parliamentary_group.py @@ -130,6 +130,8 @@ def delete_parliamentary_group( collection = ParliamentaryGroupCollection(request.session) collection.delete(self) + request.success(_('The parliamentary group has been deleted.')) + @TownApp.html( model=RISParliamentaryGroupCollection, diff --git a/src/onegov/town6/views/party.py b/src/onegov/town6/views/party.py index 753fd20173..d72b20501d 100644 --- a/src/onegov/town6/views/party.py +++ b/src/onegov/town6/views/party.py @@ -126,6 +126,8 @@ def delete_party( collection = RISPartyCollection(request.session) collection.delete(self) + request.success(_('The party has been deleted.')) + @TownApp.html( model=RISPartyCollection, diff --git a/src/onegov/town6/views/ris_settings.py b/src/onegov/town6/views/ris_settings.py index a50ba32dd2..cfc69feb3a 100644 --- a/src/onegov/town6/views/ris_settings.py +++ b/src/onegov/town6/views/ris_settings.py @@ -1,4 +1,7 @@ from __future__ import annotations + +from webob.exc import HTTPNotFound + from onegov.core.security import Private from onegov.org.models import Organisation from onegov.parliament.collections import PoliticalBusinessCollection @@ -33,6 +36,9 @@ def view_ris_settings( request: TownRequest ) -> RenderData: + if not request.app.org.ris_enabled: + raise HTTPNotFound() + layout = DefaultLayout(self, request) shortcuts = [