"""Admin for the accounting app.""" from django import forms from django.contrib import admin from django.utils.translation import gettext_lazy as _ from . import models class OrderProductInline(admin.TabularInline): """Administer contents of an order inline.""" model = models.OrderProduct class OrderAdminForm(forms.ModelForm): """Special Form for the OrderAdmin so we don't need to require the account field.""" account = forms.ModelChoiceField( required=False, queryset=models.Account.objects.all(), help_text=_("Leave empty to auto-choose the member's own account or to create one."), ) class Meta: model = models.Order exclude = () # noqa: DJ006 def clean(self): # noqa: D102, ANN201 cd = super().clean() if not cd["account"] and cd["member"]: try: cd["account"] = models.Account.objects.get_or_create(owner=cd["member"])[0] except models.Account.MultipleObjectsReturned: cd["account"] = models.Account.objects.filter(owner=cd["member"]).first() return cd @admin.register(models.Order) class OrderAdmin(admin.ModelAdmin): """Admin for the Order model.""" inlines = (OrderProductInline,) form = OrderAdminForm list_display = ("member", "description", "created", "is_paid", "total_with_vat") search_fields = ("member__email", "membership__membership_type__name", "description") list_filter = ("is_paid", "membership__membership_type") @admin.register(models.Payment) class PaymentAdmin(admin.ModelAdmin): """Admin for the Payment model.""" list_display = ("order__member", "description", "order_id", "created") @admin.display(description=_("Order ID")) def order_id(self, instance: models.Payment) -> int: """Return the ID of the order.""" return instance.order.id @admin.register(models.Product) class ProductAdmin(admin.ModelAdmin): # noqa: D101 list_display = ("name", "price", "vat") class TransactionInline(admin.TabularInline): # noqa: D101 model = models.Transaction @admin.register(models.Account) class AccountAdmin(admin.ModelAdmin): # noqa: D101 list_display = ("owner", "balance") inlines = (TransactionInline,)