Source code for pizzas.admin

"""Registers admin interfaces for the pizzas module"""
from django.conf import settings
from django.contrib import admin
from django.core.exceptions import PermissionDenied
from django.urls import reverse, path
from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _

from events import services
from events.services import is_organiser
from pizzas import admin_views
from utils.admin import DoNextModelAdmin
from .models import Order, PizzaEvent, Product


[docs]@admin.register(Product) class ProductAdmin(admin.ModelAdmin): """Manage the products""" list_display = ("name", "price", "available") list_filter = ("available", "restricted") search_fields = ("name",)
[docs]@admin.register(PizzaEvent) class PizzaEventAdmin(admin.ModelAdmin): """Manage the pizza events""" list_display = ("title", "start", "end", "notification_enabled", "orders") date_hierarchy = "start" exclude = ("end_reminder",) search_fields = [f"event__title_{l[0]}" for l in settings.LANGUAGES] autocomplete_fields = ("event",)
[docs] def notification_enabled(self, obj): return obj.send_notification
notification_enabled.short_description = _("reminder") notification_enabled.admin_order_field = "send_notification" notification_enabled.boolean = True
[docs] def has_change_permission(self, request, obj=None): """Only allow access to the change form if the user is an organiser""" if obj is not None and not services.is_organiser(request.member, obj.event): return False return super().has_change_permission(request, obj)
[docs] def has_delete_permission(self, request, obj=None): """Only allow access to delete if the user is an organiser""" if obj is not None and not services.is_organiser(request.member, obj.event): return False return super().has_delete_permission(request, obj)
[docs] def orders(self, obj): url = reverse("admin:pizzas_pizzaevent_details", kwargs={"pk": obj.pk}) return format_html('<a href="{url}">{text}</a>', url=url, text=_("Orders"))
[docs] def get_urls(self): urls = super().get_urls() custom_urls = [ path( "<int:pk>/details/", self.admin_site.admin_view( admin_views.PizzaOrderDetails.as_view(admin=self) ), name="pizzas_pizzaevent_details", ), path( "<int:pk>/overview/", self.admin_site.admin_view( admin_views.PizzaOrderSummary.as_view(admin=self) ), name="pizzas_pizzaevent_overview", ), ] return custom_urls + urls
[docs]@admin.register(Order) class OrderAdmin(DoNextModelAdmin): """Manage the orders""" list_display = ( "pizza_event", "member_first_name", "member_last_name", "product", "payment", ) exclude = ("payment",)
[docs] def save_model(self, request, obj, form, change): """You can only save the orders if you have permission""" if not is_organiser(request.member, obj.pizza_event.event): raise PermissionDenied return super().save_model(request, obj, form, change)
[docs] def has_view_permission(self, request, order=None): """Only give view permission if the user is an organiser""" if order is not None and not is_organiser( request.member, order.pizza_event.event ): return False return super().has_view_permission(request, order)
[docs] def has_change_permission(self, request, order=None): """Only give change permission if the user is an organiser""" if order is not None and not is_organiser( request.member, order.pizza_event.event ): return False return super().has_change_permission(request, order)
[docs] def has_delete_permission(self, request, order=None): """Only give delete permission if the user is an organiser""" if order is not None and not is_organiser( request.member, order.pizza_event.event ): return False return super().has_delete_permission(request, order)