Skip to content
Snippets Groups Projects
status.py 7.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • from django.apps import apps
    from django.urls import reverse_lazy
    from django.utils.html import format_html
    from django.utils.translation import gettext_lazy as _
    
    from AKModel.metaviews import status_manager
    
    Benjamin Hättasch's avatar
    Benjamin Hättasch committed
    from AKModel.metaviews.admin import EventSlugMixin
    
    from AKModel.metaviews.status import TemplateStatusWidget, StatusView
    
    
    @status_manager.register(name="event_overview")
    class EventOverviewWidget(TemplateStatusWidget):
    
    Benjamin Hättasch's avatar
    Benjamin Hättasch committed
        """
        Status page widget: Event overview
        """
    
        required_context_type = "event"
        title = _("Overview")
        template_name = "admin/AKModel/status/event_overview.html"
    
        def render_status(self, context: {}) -> str:
            return "success" if not context["event"].plan_hidden else "primary"
    
    
    @status_manager.register(name="event_categories")
    class EventCategoriesWidget(TemplateStatusWidget):
    
    Benjamin Hättasch's avatar
    Benjamin Hättasch committed
        """
        Status page widget: Category information
    
        Show all categories of the event together with the number of AKs belonging to this category.
        Offers an action to add a new category.
        """
    
        required_context_type = "event"
        title = _("Categories")
        template_name = "admin/AKModel/status/event_categories.html"
        actions = [
            {
                "text": _("Add category"),
                "url": reverse_lazy("admin:AKModel_akcategory_add"),
             }
        ]
    
        def render_title(self, context: {}) -> str:
    
    Benjamin Hättasch's avatar
    Benjamin Hättasch committed
            # Store category count as instance variable for re-use in body
            self.category_count = context['event'].akcategory_set.count()  # pylint: disable=attribute-defined-outside-init
    
            return f"{super().render_title(context)} ({self.category_count})"
    
        def render_status(self, context: {}) -> str:
            return "danger" if self.category_count == 0 else "primary"
    
    
    @status_manager.register(name="event_rooms")
    class EventRoomsWidget(TemplateStatusWidget):
    
    Benjamin Hättasch's avatar
    Benjamin Hättasch committed
        """
        Status page widget: Category information
    
        Show all rooms of the event.
        Offers actions to add a single new room as well as for batch creation.
        """
    
        required_context_type = "event"
        title = _("Rooms")
        template_name = "admin/AKModel/status/event_rooms.html"
        actions = [
            {
                "text": _("Add Room"),
                "url": reverse_lazy("admin:AKModel_room_add"),
             }
        ]
    
        def render_title(self, context: {}) -> str:
    
    Benjamin Hättasch's avatar
    Benjamin Hättasch committed
            # Store room count as instance variable for re-use in body
            self.room_count = context['event'].room_set.count()  # pylint: disable=attribute-defined-outside-init
    
            return f"{super().render_title(context)} ({self.room_count})"
    
        def render_status(self, context: {}) -> str:
            return "danger" if self.room_count == 0 else "primary"
    
        def render_actions(self, context: {}) -> list[dict]:
            actions = super().render_actions(context)
    
    Benjamin Hättasch's avatar
    Benjamin Hättasch committed
            # Action has to be added here since it depends on the event for URL building
    
            actions.append(
                {
                    "text": _("Import Rooms from CSV"),
                    "url": reverse_lazy("admin:room-import", kwargs={"event_slug": context["event"].slug}),
                }
            )
            return actions
    
    
    @status_manager.register(name="event_aks")
    class EventAKsWidget(TemplateStatusWidget):
    
    Benjamin Hättasch's avatar
    Benjamin Hättasch committed
        """
        Status page widget: AK information
    
        Show information about the AKs of this event.
        Offers a long list of AK-related actions and also scheduling actions of AKScheduling is active
        """
    
        required_context_type = "event"
        title = _("AKs")
        template_name = "admin/AKModel/status/event_aks.html"
    
        def get_context_data(self, context) -> dict:
            context["ak_count"] = context["event"].ak_set.count()
            context["unscheduled_slots_count"] = context["event"].akslot_set.filter(start=None).count
            return context
    
        def render_actions(self, context: {}) -> list[dict]:
            actions = [
                {
                    "text": _("Scheduling"),
                    "url": reverse_lazy("admin:schedule", kwargs={"event_slug": context["event"].slug}),
                },
            ]
            if apps.is_installed("AKScheduling"):
                actions.extend([
                    {
                        "text": format_html('{} <span class="badge bg-secondary">{}</span>',
                                            _("Constraint Violations"),
                                            context["event"].constraintviolation_set.count()),
                        "url": reverse_lazy("admin:constraint-violations", kwargs={"slug": context["event"].slug}),
                    },
                    {
                        "text": _("AKs requiring special attention"),
                        "url": reverse_lazy("admin:special-attention", kwargs={"slug": context["event"].slug}),
                    },
    
                ])
                if context["event"].ak_set.count() > 0:
                    actions.append({
    
                        "text": _("Enter Interest"),
                        "url": reverse_lazy("admin:enter-interest",
    
    Benjamin Hättasch's avatar
    Benjamin Hättasch committed
                                            kwargs={"event_slug": context["event"].slug,
                                                    "pk": context["event"].ak_set.all().first().pk}
                                            ),
    
            actions.extend([
                    {
                        "text": _("Edit Default Slots"),
                        "url": reverse_lazy("admin:default-slots-editor", kwargs={"event_slug": context["event"].slug}),
                    },
                    {
                        "text": _("Manage ak tracks"),
                        "url": reverse_lazy("admin:tracks_manage", kwargs={"event_slug": context["event"].slug}),
                    },
                    {
                        "text": _("Export AKs as CSV"),
                        "url": reverse_lazy("admin:ak_csv_export", kwargs={"event_slug": context["event"].slug}),
                    },
                    {
                        "text": _("Export AKs for Wiki"),
                        "url": reverse_lazy("admin:ak_wiki_export", kwargs={"slug": context["event"].slug}),
                    },
                    {
                        "text": _("Export AK Slides"),
                        "url": reverse_lazy("admin:ak_slide_export", kwargs={"event_slug": context["event"].slug}),
                    },
                ]
            )
            return actions
    
    
    @status_manager.register(name="event_requirements")
    class EventRequirementsWidget(TemplateStatusWidget):
    
    Benjamin Hättasch's avatar
    Benjamin Hättasch committed
        """
        Status page widget: Requirement information information
    
        Show information about the requirements of this event.
        Offers actions to add new requirements or to get a list of AKs having a given requirement.
        """
    
        required_context_type = "event"
        title = _("Requirements")
        template_name = "admin/AKModel/status/event_requirements.html"
    
        def render_title(self, context: {}) -> str:
    
    Benjamin Hättasch's avatar
    Benjamin Hättasch committed
            # Store requirements count as instance variable for re-use in body
            # pylint: disable=attribute-defined-outside-init
    
            self.requirements_count = context['event'].akrequirement_set.count()
            return f"{super().render_title(context)} ({self.requirements_count})"
    
        def render_actions(self, context: {}) -> list[dict]:
            return [
                {
                    "text": _("Show AKs for requirements"),
                    "url": reverse_lazy("admin:event_requirement_overview", kwargs={"event_slug": context["event"].slug}),
                },
                {
                    "text": _("Add Requirement"),
                    "url": reverse_lazy("admin:AKModel_akrequirement_add"),
                },
            ]
    
    
    class EventStatusView(EventSlugMixin, StatusView):
    
    Benjamin Hättasch's avatar
    Benjamin Hättasch committed
        """
        View: Show a status dashboard for the given event
        """
    
        title = _("Event Status")
        provided_context_type = "event"
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context["site_url"] = reverse_lazy("dashboard:dashboard_event", kwargs={'slug': context["event"].slug})
            return context