Coverage for website/moneybirdsynchronization/admin.py: 61.64%
65 statements
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1from django.contrib import admin
2from django.contrib.admin import RelatedOnlyFieldListFilter
3from django.urls import reverse
4from django.utils.html import format_html
6from .models import (
7 MoneybirdContact,
8 MoneybirdExternalInvoice,
9 MoneybirdPayment,
10 MoneybirdProject,
11 MoneybirdReceipt,
12)
15@admin.register(MoneybirdContact)
16class MoneybirdContactAdmin(admin.ModelAdmin):
17 """Manage moneybird contacts."""
19 list_display = (
20 "member",
21 "moneybird_id",
22 "moneybird_sepa_mandate_id",
23 "needs_synchronization",
24 )
26 list_filter = ("needs_synchronization",)
28 fields = (
29 "member",
30 "moneybird_id",
31 "moneybird_sepa_mandate_id",
32 "needs_synchronization",
33 )
35 raw_id_fields = ("member",)
37 search_fields = (
38 "member__first_name",
39 "member__last_name",
40 "member__username",
41 "member__email",
42 "member__id",
43 "moneybird_id",
44 )
46 def get_readonly_fields(self, request, obj=None):
47 if not obj:
48 return ()
49 return ("member",)
52@admin.register(MoneybirdExternalInvoice)
53class MoneybirdExternalInvoiceAdmin(admin.ModelAdmin):
54 """Manage moneybird external invoices."""
56 list_display = (
57 "payable_object",
58 "payable_model",
59 "moneybird_invoice_id",
60 "needs_synchronization",
61 "needs_deletion",
62 )
64 fields = (
65 "payable_object",
66 "payable_model",
67 "object_id",
68 "moneybird_invoice_id",
69 "needs_synchronization",
70 "needs_deletion",
71 )
73 readonly_fields = ("payable_object", "needs_synchronization", "needs_deletion")
75 search_fields = (
76 "payable_model__app_label",
77 "payable_model__model",
78 "moneybird_invoice_id",
79 )
81 list_filter = (
82 "needs_synchronization",
83 "needs_deletion",
84 ("payable_model", RelatedOnlyFieldListFilter),
85 )
87 def payable_object(self, obj: MoneybirdExternalInvoice) -> str:
88 payable_object = obj.payable_object
89 if payable_object:
90 return format_html(
91 "<a href='{}'>{}</a>",
92 reverse(
93 f"admin:{payable_object._meta.app_label}_{payable_object._meta.model_name}_change",
94 args=[payable_object.pk],
95 ),
96 payable_object,
97 )
98 return "None"
101@admin.register(MoneybirdPayment)
102class MoneybirdPaymentAdmin(admin.ModelAdmin):
103 """Manage moneybird payments."""
105 list_display = (
106 "payment_topic",
107 "amount",
108 "paid_by",
109 "payment_type",
110 "moneybird_financial_statement_id",
111 "moneybird_financial_mutation_id",
112 )
114 fields = (
115 "payment",
116 "moneybird_financial_statement_id",
117 "moneybird_financial_mutation_id",
118 )
120 raw_id_fields = ("payment",)
122 search_fields = (
123 "payment__amount",
124 "payment__topic",
125 "payment__paid_by__username",
126 "moneybird_financial_mutation_id",
127 "moneybird_financial_statement_id",
128 )
130 def get_readonly_fields(self, request, obj=None):
131 if not obj:
132 return ()
133 return ("payment",)
135 def payment_type(self, obj):
136 return obj.payment.type
138 def payment_topic(self, obj):
139 return obj.payment.topic
141 def paid_by(self, obj):
142 return obj.payment.paid_by
144 def amount(self, obj):
145 return obj.payment.amount
148@admin.register(MoneybirdProject)
149class MoneybirdProjectAdmin(admin.ModelAdmin):
150 list_display = (
151 "name",
152 "moneybird_id",
153 )
155 search_fields = ("name", "moneybird_id")
158@admin.register(MoneybirdReceipt)
159class MoneybirdReceiptAdmin(admin.ModelAdmin):
160 """Manage moneybird receipts."""
162 list_display = ("moneybird_receipt_id", "reimbursement_link")
163 search_fields = (
164 "moneybird_receipt_id",
165 "moneybird_attachment_is_uploaded",
166 "reimbursement__date_incurred",
167 "reimbursement__owner__first_name",
168 "reimbursement__owner__last_name",
169 "reimbursement__description",
170 )
171 raw_id_fields = ("reimbursement",)
173 def reimbursement_link(self, obj):
174 return format_html(
175 '<a href="{}">{}</a>',
176 reverse(
177 "admin:reimbursements_reimbursement_change",
178 args=[obj.reimbursement.pk],
179 ),
180 obj.reimbursement,
181 )
183 reimbursement_link.short_description = "Reimbursement"
185 def get_readonly_fields(self, request, obj=None):
186 if not obj:
187 return ()
188 return ("reimbursement",)
190 def get_queryset(self, request):
191 qs = super().get_queryset(request)
192 return qs.select_related("reimbursement")