Source code for town6.views.settings

""" The settings view, defining things like the logo or color of the org. """
from __future__ import annotations

from wtforms.fields import BooleanField, IntegerField

from onegov.core.security import Secret
from onegov.form import Form, merge_forms, move_fields
from onegov.org import _
from onegov.org.elements import Link
from onegov.org.forms.settings import (
    LinksSettingsForm, HeaderSettingsForm,
    FooterSettingsForm, AccessSettingsForm, MapSettingsForm,
    AnalyticsSettingsForm, HolidaySettingsForm, OrgTicketSettingsForm,
    HomepageSettingsForm, NewsletterSettingsForm, LinkMigrationForm,
    LinkHealthCheckForm, OrganisationProfileSettingsForm, PeopleSettingsForm,
    EventSettingsForm, GeverSettingsForm, OneGovApiSettingsForm,
    DataRetentionPolicyForm, FirebaseSettingsForm, VATSettingsForm,
    KabaSettingsForm, ResourceSettingsForm)
from onegov.org.models import Organisation
from onegov.town6.forms.settings import (
    RISSettingsForm, ModuleActivationSettingsForm)
from onegov.org.views.settings import (
    handle_homepage_settings, handle_module_activation_settings,
    handle_organisation_settings, handle_people_settings, view_settings,
    handle_ticket_settings, preview_holiday_settings,
    handle_appearance_settings, handle_links_settings, handle_header_settings,
    handle_footer_settings, handle_access_settings, handle_map_settings,
    handle_analytics_settings, handle_holiday_settings,
    handle_newsletter_settings, handle_generic_settings, handle_migrate_links,
    handle_link_health_check,
    handle_event_settings, handle_api_keys, handle_chat_settings,
    handle_kaba_settings, handle_resource_settings)

from onegov.town6.app import TownApp
from onegov.town6.forms.settings import (
    AppearanceSettingsForm, ChatSettingsForm)
from onegov.town6.layout import SettingsLayout, DefaultLayout


from typing import overload, TYPE_CHECKING
if TYPE_CHECKING:
    from onegov.core.types import RenderData
    from onegov.town6.request import TownRequest
    from webob import Response


@overload
[docs] def get_custom_settings_form[T: Form]( model: Organisation, request: TownRequest, homepage_settings_form: type[T] ) -> type[T]: ...
@overload def get_custom_settings_form( model: Organisation, request: TownRequest, homepage_settings_form: None = None ) -> type[HomepageSettingsForm]: ... def get_custom_settings_form( model: Organisation, request: TownRequest, homepage_settings_form: type[Form] | None = None ) -> type[Form]: class CustomFieldsForm(Form): news_limit_homepage = IntegerField( fieldset=_('News and Events'), label=_('Number of news entries on homepage') ) event_limit_homepage = IntegerField( fieldset=_('News and Events'), label=_('Number of events displayed on homepage') ) return move_fields( form_class=merge_forms( homepage_settings_form or HomepageSettingsForm, CustomFieldsForm), fields=( 'event_limit_homepage', 'news_limit_homepage', ), after='homepage_cover' ) # General Settings @TownApp.html( model=Organisation, name='settings', template='settings.pt', permission=Secret )
[docs] def view_town_settings( self: Organisation, request: TownRequest ) -> RenderData: return view_settings(self, request, SettingsLayout(self, request))
@TownApp.form( model=Organisation, name='organisation-settings', template='form.pt', permission=Secret, form=OrganisationProfileSettingsForm, setting=_('Organisation Profile'), icon='fa-building', order=0, category=_('General'))
[docs] def town_handle_organisation_settings( self: Organisation, request: TownRequest, form: OrganisationProfileSettingsForm ) -> RenderData | Response: return handle_organisation_settings( self, request, form, SettingsLayout(self, request))
@TownApp.form( model=Organisation, name='ticket-settings', template='form.pt', permission=Secret, form=OrgTicketSettingsForm, setting=_('Tickets'), order=10, icon='fa-ticket-alt' )
[docs] def town_handle_ticket_settings( self: Organisation, request: TownRequest, form: OrgTicketSettingsForm ) -> RenderData | Response: return handle_ticket_settings( self, request, form, SettingsLayout(self, request))
@TownApp.form(model=Organisation, name='homepage-settings', template='form.pt', permission=Secret, form=get_custom_settings_form, setting=_('Homepage'), icon='fa-home', order=20)
[docs] def custom_handle_settings( self: Organisation, request: TownRequest, form: HomepageSettingsForm ) -> RenderData | Response: form.delete_field('homepage_cover') return handle_homepage_settings( self, request, form, SettingsLayout(self, request))
@TownApp.form( model=Organisation, name='appearance-settings', template='form.pt', permission=Secret, form=AppearanceSettingsForm, setting=_('Appearance'), icon='fa-eye', order=30)
[docs] def town_handle_appearance_settings( self: Organisation, request: TownRequest, form: AppearanceSettingsForm ) -> RenderData | Response: return handle_appearance_settings( self, request, form, SettingsLayout(self, request))
@TownApp.form( model=Organisation, name='header-settings', template='form.pt', permission=Secret, form=HeaderSettingsForm, setting=_('Header'), icon='fa-window-maximize', order=40)
[docs] def town_handle_header_settings( self: Organisation, request: TownRequest, form: HeaderSettingsForm ) -> RenderData | Response: return handle_header_settings( self, request, form, SettingsLayout(self, request))
@TownApp.form( model=Organisation, name='footer-settings', template='form.pt', permission=Secret, form=custom_footer_settings_form, setting=_('Footer'), icon='fa-window-minimize', order=50) @TownApp.form( model=Organisation, name='data-retention-settings', template='form.pt', permission=Secret, form=DataRetentionPolicyForm, setting=_('Data Retention Policy'), icon='far fa-trash', order=60, )
[docs] def town_handle_ticket_data_deletion_settings( self: Organisation, request: TownRequest, form: DataRetentionPolicyForm ) -> RenderData | Response: request.message(_('Proceed with caution. Tickets and the data they ' 'contain may be irrevocable deleted.'), 'alert') return handle_generic_settings( self, request, form, _('Data Retention Policy'), SettingsLayout(self, request), )
@TownApp.form( model=Organisation, name='vat-settings', template='form.pt', permission=Secret, form=VATSettingsForm, setting=_('Value Added Tax'), icon='fa-file-invoice-dollar', order=70 )
[docs] def handle_vat_settings( self: Organisation, request: TownRequest, form: VATSettingsForm, layout: SettingsLayout | None = None ) -> RenderData | Response: layout = layout or SettingsLayout(self, request, _('Value Added Tax')) return handle_generic_settings( self, request, form, _('Value Added Tax'), layout )
@TownApp.form( model=Organisation, name='access-settings', template='form.pt', permission=Secret, form=AccessSettingsForm, setting=_('Access (mTAN)'), icon='fa-lock', order=80)
[docs] def town_handle_access_settings( self: Organisation, request: TownRequest, form: AccessSettingsForm ) -> RenderData | Response: return handle_access_settings( self, request, form, SettingsLayout(self, request))
@TownApp.form( model=Organisation, name='link-settings', template='form.pt', permission=Secret, form=LinksSettingsForm, setting=_('Links'), icon='fa-link', order=90) @TownApp.form( model=Organisation, name='holiday-settings', template='form.pt', permission=Secret, form=HolidaySettingsForm, setting=_('Holidays'), icon='fa-calendar', order=500)
[docs] def town_handle_holiday_settings( self: Organisation, request: TownRequest, form: HolidaySettingsForm ) -> RenderData | Response: return handle_holiday_settings( self, request, form, SettingsLayout(self, request))
@TownApp.form( model=Organisation, name='map-settings', template='form.pt', permission=Secret, form=MapSettingsForm, setting=_('Map'), icon='fa-map-marker-alt', order=100)
[docs] def town_handle_map_settings( self: Organisation, request: TownRequest, form: MapSettingsForm ) -> RenderData | Response: return handle_map_settings( self, request, form, SettingsLayout(self, request))
@TownApp.form( model=Organisation, name='analytics-settings', template='form.pt', permission=Secret, form=AnalyticsSettingsForm, setting=_('Analytics'), icon='fa-chart-bar ', order=110)
[docs] def town_handle_analytics_settings( self: Organisation, request: TownRequest, form: AnalyticsSettingsForm ) -> RenderData | Response: return handle_analytics_settings( self, request, form, SettingsLayout(self, request))
# Module Settings @TownApp.form( model=Organisation, name='module-activation-settings', template='form.pt', permission=Secret, form=ModuleActivationSettingsForm, setting=_('Optional modules'), order=0, icon='far fa-th-large', category=_('Modules') )
[docs] def town_handle_module_activation_settings( self: Organisation, request: TownRequest, form: ModuleActivationSettingsForm ) -> RenderData | Response: return handle_module_activation_settings( self, request, form, SettingsLayout(self, request) )
@TownApp.form( model=Organisation, name='newsletter-settings', template='form.pt', permission=Secret, form=NewsletterSettingsForm, setting=_('Newsletter'), order=10, icon='far fa-paper-plane', category=_('Modules') )
[docs] def town_handle_newsletter_settings( self: Organisation, request: TownRequest, form: NewsletterSettingsForm ) -> RenderData | Response: return handle_newsletter_settings( self, request, form, SettingsLayout(self, request) )
@TownApp.form( model=Organisation, name='resource-settings', template='form.pt', permission=Secret, form=ResourceSettingsForm, setting=_('Resources'), icon='fa-building', order=20, category=_('Modules'))
[docs] def town_handle_resource( self: Organisation, request: TownRequest, form: ResourceSettingsForm, layout: SettingsLayout | None = None ) -> RenderData | Response: return handle_resource_settings( self, request, form, SettingsLayout(self, request))
@TownApp.form( model=Organisation, name='people-settings', template='form.pt', permission=Secret, form=PeopleSettingsForm, setting=_('People directory'), icon='fa-users', order=30, category=_('Modules') )
[docs] def town_handle_people_settings( self: Organisation, request: TownRequest, form: PeopleSettingsForm ) -> RenderData | Response: return handle_people_settings( self, request, form, SettingsLayout(self, request) )
@TownApp.form( model=Organisation, name='event-settings', template='form.pt', permission=Secret, form=EventSettingsForm, setting=_('Events'), icon='fa-calendar-alt', order=40, category=_('Modules'))
[docs] def town_handle_event( self: Organisation, request: TownRequest, form: EventSettingsForm ) -> RenderData | Response: return handle_event_settings( self, request, form, SettingsLayout(self, request) )
@TownApp.form(model=Organisation, name='chat-settings', template='form.pt', permission=Secret, form=ChatSettingsForm, setting=_('Chat'), icon='far fa-comments', order=50, category=_('Modules'))
[docs] def town_handle_chat_settings( self: Organisation, request: TownRequest, form: ChatSettingsForm ) -> RenderData | Response: return handle_chat_settings( self, request, form, SettingsLayout(self, request))
@TownApp.form( model=Organisation, name='ris-settings', template='form.pt', permission=Secret, form=RISSettingsForm, setting=_('Ratsinformationssystem'), icon='fa-landmark', order=500, category=_('Modules') )
[docs] def town_handle_ris_enable( self: Organisation, request: TownRequest, form: RISSettingsForm ) -> RenderData | Response: return handle_generic_settings( self, request, form, _('Ratsinformationssystem (RIS)'), SettingsLayout(self, request) )
# Advanced Settings @TownApp.form(model=Organisation, name='gever-credentials', template='form.pt', permission=Secret, form=GeverSettingsForm, setting='Gever API', icon='fa-key', order=30, category=_('Advanced Settings'))
[docs] def town_handle_gever_settings( self: Organisation, request: TownRequest, form: GeverSettingsForm ) -> RenderData | Response: return handle_generic_settings(self, request, form, 'Gever API', SettingsLayout(self, request))
@TownApp.form(model=Organisation, name='kaba-settings', template='form.pt', permission=Secret, form=KabaSettingsForm, setting='dormakaba API', icon='fa-key', order=20, category=_('Advanced Settings'))
[docs] def town_handle_kaba_settings( self: Organisation, request: TownRequest, form: KabaSettingsForm ) -> RenderData | Response: return handle_kaba_settings( self, request, form, SettingsLayout(self, request))
@TownApp.form( model=Organisation, name='holiday-settings-preview', permission=Secret, form=HolidaySettingsForm )
[docs] def town_preview_holiday_settings( self: Organisation, request: TownRequest, form: HolidaySettingsForm ) -> str: return preview_holiday_settings( self, request, form, DefaultLayout(self, request))
@TownApp.form( model=Organisation, name='api-keys', template='api_keys.pt', permission=Secret, form=OneGovApiSettingsForm, icon='fa-key', setting=_('OneGov API'), order=10, category=_('Advanced Settings'))
[docs] def town_handle_api_keys( self: Organisation, request: TownRequest, form: OneGovApiSettingsForm ) -> RenderData | Response: return handle_api_keys(self, request, form, SettingsLayout(self, request))
@TownApp.form( model=Organisation, name='firebase', template='form.pt', permission=Secret, form=FirebaseSettingsForm, setting=_('Firebase (App)'), icon='fa-bell', order=40, category=_('Advanced Settings') )
[docs] def town_handle_firebase_settings( self: Organisation, request: TownRequest, form: FirebaseSettingsForm ) -> RenderData | Response: link_to_push_notfications = request.link(self, '/push-notifications') return handle_generic_settings( self, request, form, 'Firebase', SettingsLayout(self, request), Link(_('Push Notification Overview'), url=link_to_push_notfications)(request) )
# Settings in Management, not Settings View @TownApp.form( model=Organisation, name='migrate-links', template='form.pt', permission=Secret, form=LinkMigrationForm) @TownApp.form( model=Organisation, name='link-check', template='linkcheck.pt', permission=Secret, form=LinkHealthCheckForm)