2024-07-15 00:19:37 +02:00
|
|
|
"""Admin for the accounting app."""
|
|
|
|
|
2024-08-03 17:55:32 +00:00
|
|
|
from django import forms
|
2018-06-23 21:08:56 +02:00
|
|
|
from django.contrib import admin
|
2024-08-14 09:17:29 +00:00
|
|
|
from django.contrib import messages
|
|
|
|
from django.db.models import QuerySet
|
|
|
|
from django.http import HttpRequest
|
2018-06-23 21:08:56 +02:00
|
|
|
from django.utils.translation import gettext_lazy as _
|
2024-08-14 09:17:29 +00:00
|
|
|
from membership.emails import OrderEmail
|
2018-06-23 21:08:56 +02:00
|
|
|
|
2024-08-03 17:55:32 +00:00
|
|
|
from . import models
|
2018-06-23 21:08:56 +02:00
|
|
|
|
|
|
|
|
2024-08-03 17:55:32 +00:00
|
|
|
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
|
|
|
|
|
2025-01-26 12:44:10 +00:00
|
|
|
def clean(self) -> None:
|
|
|
|
"""Clean the order."""
|
2024-08-03 17:55:32 +00:00
|
|
|
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)
|
2018-06-23 21:08:56 +02:00
|
|
|
class OrderAdmin(admin.ModelAdmin):
|
2024-07-15 00:19:37 +02:00
|
|
|
"""Admin for the Order model."""
|
|
|
|
|
2024-08-03 17:55:32 +00:00
|
|
|
inlines = (OrderProductInline,)
|
|
|
|
form = OrderAdminForm
|
2018-06-23 21:08:56 +02:00
|
|
|
|
2024-08-14 09:17:29 +00:00
|
|
|
actions = ("send_order",)
|
|
|
|
|
2024-08-04 17:12:02 +00:00
|
|
|
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")
|
2019-09-01 00:27:36 +02:00
|
|
|
|
2024-08-14 09:17:29 +00:00
|
|
|
@admin.action(description="Send order link to selected unpaid orders")
|
|
|
|
def send_order(self, request: HttpRequest, queryset: QuerySet[models.Order]) -> None:
|
2025-01-26 12:44:10 +00:00
|
|
|
"""Send the order to the member."""
|
2024-08-14 09:17:29 +00:00
|
|
|
for order in queryset:
|
|
|
|
if order.is_paid:
|
|
|
|
messages.error(
|
|
|
|
request,
|
|
|
|
f"Order pk={order.id} is already marked paid, not sending email to: {order.member.email}",
|
|
|
|
)
|
|
|
|
continue
|
|
|
|
email = OrderEmail(order, request)
|
|
|
|
email.send()
|
|
|
|
messages.success(request, f"Sent an order for order pk={order.id} link to: {order.member.email}")
|
|
|
|
|
2018-06-23 21:08:56 +02:00
|
|
|
|
2024-08-03 17:55:32 +00:00
|
|
|
@admin.register(models.Payment)
|
2018-06-23 21:08:56 +02:00
|
|
|
class PaymentAdmin(admin.ModelAdmin):
|
2024-07-15 00:19:37 +02:00
|
|
|
"""Admin for the Payment model."""
|
|
|
|
|
2024-08-03 17:55:32 +00:00
|
|
|
list_display = ("order__member", "description", "order_id", "created")
|
2019-09-01 00:27:36 +02:00
|
|
|
|
2023-01-03 21:39:40 +01:00
|
|
|
@admin.display(description=_("Order ID"))
|
2024-08-03 17:55:32 +00:00
|
|
|
def order_id(self, instance: models.Payment) -> int:
|
2024-07-15 00:19:37 +02:00
|
|
|
"""Return the ID of the order."""
|
2018-06-23 21:08:56 +02:00
|
|
|
return instance.order.id
|
2024-08-03 17:55:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
@admin.register(models.Product)
|
2024-08-14 09:17:29 +00:00
|
|
|
class ProductAdmin(admin.ModelAdmin):
|
2025-01-26 12:44:10 +00:00
|
|
|
"""Admin for the Product model."""
|
|
|
|
|
2024-08-03 17:55:32 +00:00
|
|
|
list_display = ("name", "price", "vat")
|
|
|
|
|
|
|
|
|
2024-08-14 09:17:29 +00:00
|
|
|
class TransactionInline(admin.TabularInline):
|
2025-01-26 12:44:10 +00:00
|
|
|
"""Inline admin for the Transaction model."""
|
|
|
|
|
2024-08-03 17:55:32 +00:00
|
|
|
model = models.Transaction
|
|
|
|
|
|
|
|
|
|
|
|
@admin.register(models.Account)
|
2024-08-14 09:17:29 +00:00
|
|
|
class AccountAdmin(admin.ModelAdmin):
|
2025-01-26 12:44:10 +00:00
|
|
|
"""Admin for the Account model."""
|
|
|
|
|
2024-08-03 17:55:32 +00:00
|
|
|
list_display = ("owner", "balance")
|
|
|
|
inlines = (TransactionInline,)
|