Source code for org.custom

from __future__ import annotations

from onegov.chat import MessageCollection, TextModuleCollection
from onegov.core.elements import Link, LinkGroup
from onegov.form.collection import FormCollection, SurveyCollection
from onegov.org import _, OrgApp
from onegov.org.models import (
    CitizenDashboard,
    Dashboard,
    GeneralFileCollection,
    ImageFileCollection,
    Organisation,
)
from onegov.pay import PaymentProviderCollection, PaymentCollection
from onegov.reservation import Reservation, ResourceCollection
from onegov.ticket import TicketCollection
from onegov.ticket.collection import ArchivedTicketCollection
from onegov.user import Auth, UserCollection, UserGroupCollection
from purl import URL


from typing import Any, TYPE_CHECKING
if TYPE_CHECKING:
    from collections.abc import Iterator
    from onegov.org.request import OrgRequest


@OrgApp.template_variables()
[docs] def get_template_variables(request: OrgRequest) -> dict[str, Any]: return { 'global_tools': tuple(get_global_tools(request)) }
[docs] def logout_path(request: OrgRequest) -> str: url = URL(request.link(request.app.org)) return url.path() or '/'
[docs] def get_global_tools(request: OrgRequest) -> Iterator[Link | LinkGroup]: citizen_login_enabled = request.app.org.citizen_login_enabled # Authentication / Userprofile if request.is_logged_in: yield LinkGroup(_('Account'), classes=('user', ), links=( Link( _('User Profile'), request.link( request.app.org, name='userprofile' ), attrs={'class': 'profile'} ), Link( _('Logout'), request.link( Auth.from_request( request, to=logout_path(request)), name='logout' ), attrs={'class': 'logout'} ), )) else: yield Link( _('Login'), request.link( Auth.from_request_path(request), name='login' ), attrs={'class': 'login'} ) if citizen_login_enabled and not request.authenticated_email: dashboard = CitizenDashboard(request) if dashboard.is_available: auth = Auth.from_request( request, request.link(dashboard) ) else: auth = Auth.from_request_path(request) yield Link( _('Citizen Login'), request.link( auth, name='citizen-login' ), attrs={ 'class': 'citizen-login', 'title': _('No registration necessary') } ) if request.app.enable_user_registration: yield Link( _('Register'), request.link( Auth.from_request_path(request), name='register' ), attrs={'class': 'register'}) # Management dropdown if request.is_manager: links = [] links.append( Link( _('Dashboard'), request.class_link(Dashboard), attrs={'class': 'dashboard'} ) ) links.append( Link( _('Timeline'), request.class_link(MessageCollection), attrs={'class': 'timeline'} ) ) links.append( Link( _('Files'), request.class_link(GeneralFileCollection), attrs={'class': 'files'} ) ) links.append( Link( _('Images'), request.class_link(ImageFileCollection), attrs={'class': 'images'} ) ) if request.is_admin and request.app.payment_providers_enabled: links.append( Link( _('Payment Provider'), request.class_link(PaymentProviderCollection), attrs={'class': 'payment-provider'} ) ) links.append( Link( _('Payments'), request.class_link(PaymentCollection), attrs={'class': 'payment'} ) ) links.append( Link( _('Text modules'), request.class_link(TextModuleCollection), attrs={'class': 'text-modules'} ) ) if request.is_admin: links.append( Link( _('Settings'), request.link( request.app.org, 'settings' ), attrs={'class': 'settings'} ) ) links.append( Link( _('Users'), request.class_link( UserCollection, variables={'active': [True]}), attrs={'class': 'user'} ) ) links.append( Link( _('User groups'), request.class_link(UserGroupCollection), attrs={'class': 'users'} ) ) if request.app.org.ris_enabled: links.append( Link( _('RIS Settings'), request.link(request.app.org, 'ris-settings'), attrs={'class': 'ris-settings'} ), ) links.append( Link( _('Link Check'), request.class_link(Organisation, name='link-check'), attrs={'class': 'link-check'} ) ) links.append( Link( _('Archived Tickets'), request.class_link( ArchivedTicketCollection, {'handler': 'ALL'}), attrs={'class': 'ticket-archive'} ) ) links.append( Link( _('Forms'), request.class_link( FormCollection), attrs={'class': 'forms'} ) ) links.append( Link( _('Surveys'), request.class_link( SurveyCollection), attrs={'class': 'surveys'} ) ) yield LinkGroup(_('Management'), classes=('management', ), links=links) # Tickets if request.is_manager or request.is_supporter: assert request.current_user is not None ticket_count = request.app.ticket_count screen_count = ticket_count.open or ticket_count.pending links = [] links.append( Link( _('My Tickets'), request.class_link( TicketCollection, { 'handler': 'ALL', 'state': 'unfinished', 'owner': request.current_user.id.hex }, ), attrs={ 'class': ('my-tickets'), } ) ) links.append( Link( _('Open Tickets'), request.class_link( TicketCollection, {'handler': 'ALL', 'state': 'open'} ), attrs={ 'class': ('with-count', 'alert', 'open-tickets'), 'data-count': str(ticket_count.open) } ) ) links.append( Link( _('Pending Tickets'), request.class_link( TicketCollection, {'handler': 'ALL', 'state': 'pending'} ), attrs={ 'class': ('with-count', 'info', 'pending-tickets'), 'data-count': str(ticket_count.pending) } ) ) links.append( Link( _('Closed Tickets'), url=request.class_link( TicketCollection, {'handler': 'ALL', 'state': 'closed'} ), attrs={ 'class': ('with-count', 'secondary', 'closed-tickets'), 'data-count': str(ticket_count.closed), } ) ) if screen_count: css = ticket_count.open and 'alert' or 'info' else: css = 'no-tickets' yield LinkGroup( screen_count == 1 and _('Ticket') or _('Tickets'), classes=('with-count', css), links=links, attributes={'data-count': str(screen_count)} ) if citizen_login_enabled and request.authenticated_email: # This logout link is specific to citizens, if we're logged # in as another user, then we don't need this additional # logout link if not request.is_logged_in: yield Link( _('Logout'), request.link( Auth.from_request(request, to=logout_path(request)), name='citizen-logout' ), attrs={'class': 'logout'} ) yield Link( _('Dashboard'), request.class_link(CitizenDashboard), attrs={'class': 'dashboard'} ) # NOTE: Only show this if we have at least one reservation # this way we don't need a setting to signal whether # or not this instance even accepts reservations. if request.session.query( request.session.query(Reservation) .filter(Reservation.status == 'approved') .filter(Reservation.email == request.authenticated_email) .exists() ).scalar(): yield Link( _('My Reservations'), request.class_link( ResourceCollection, name='my-reservations' ), attrs={ 'class': ('citizen-reservations'), } ) yield Link( _('My Requests'), request.class_link( TicketCollection, { 'handler': 'ALL', 'state': 'all', }, name='my-tickets' ), attrs={ 'class': ('citizen-tickets'), } )