Source code for feriennet.homepage_widgets

from __future__ import annotations

from onegov.activity import ActivityFilter
from onegov.feriennet import FeriennetApp, _


from typing import TYPE_CHECKING

from onegov.feriennet.collections import MatchCollection
from onegov.feriennet.collections.activity import VacationActivityCollection
from onegov.feriennet.models.activity import VacationActivity
from onegov.feriennet.utils import (activity_ages, activity_min_cost,
                                    activity_spots)
if TYPE_CHECKING:
    from onegov.core.types import RenderData
    from onegov.feriennet.layout import DefaultLayout


@FeriennetApp.homepage_widget(tag='registration')
[docs] class RegistrationWidget:
[docs] template = """ <xsl:template match="registration"> <div tal:condition="not:request.is_logged_in" class="register"> <a href="./auth/register" class="button"> ${register_text} </a> <a href="./auth/login" class="button secondary"> ${login_text} </a> </div> <div tal:condition="request.is_logged_in" class="register"> <a href="./userprofile" class="button secondary"> ${profile_text} </a> </div> </xsl:template> """
[docs] def get_variables(self, layout: DefaultLayout) -> RenderData: return { 'register_text': _('Register a new account'), 'login_text': _('Go to Login'), 'profile_text': _('Go to Profile') }
@FeriennetApp.homepage_widget(tag='activities')
[docs] class ActivitiesWidget:
[docs] template = """ <xsl:template match="activities"> <tal:b metal:use-macro="layout.macros['activities_homepage']" /> </xsl:template> """
[docs] def get_variables(self, layout: DefaultLayout) -> RenderData: if layout.app.active_period: occasions = list(MatchCollection( layout.app.session(), layout.app.active_period, ['unoperable', 'empty', 'operable']).occasions) state_order = {'unoperable': 0, 'empty': 1, 'operable': 2} occasions = sorted( occasions, key=lambda o: state_order[o.state] # type: ignore ) activity_ids = (o.activity_id for o in occasions) unique_activity_ids = list(set(activity_ids))[:6] activities = VacationActivityCollection(layout.app.session() ).query( ).filter(VacationActivity.id.in_(unique_activity_ids)).all() if len(activities) < 6: filter_obj = ActivityFilter() filter_obj.period_ids = ( {layout.app.active_period.id } if layout.app.active_period else set()) rest_activities = VacationActivityCollection( layout.app.session(), filter=filter_obj, ).query().filter( VacationActivity.id.notin_(unique_activity_ids)).limit( 6 - len(activities)) activities = activities + rest_activities.all() else: activities = [] return { 'activities': activities, 'activities_link': layout.request.class_link( VacationActivityCollection), 'activity_ages': activity_ages, 'activity_min_cost': activity_min_cost, 'activity_spots': activity_spots }