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

1from django.contrib import admin 

2from django.contrib.admin import RelatedOnlyFieldListFilter 

3from django.urls import reverse 

4from django.utils.html import format_html 

5 

6from .models import ( 

7 MoneybirdContact, 

8 MoneybirdExternalInvoice, 

9 MoneybirdPayment, 

10 MoneybirdProject, 

11 MoneybirdReceipt, 

12) 

13 

14 

15@admin.register(MoneybirdContact) 

16class MoneybirdContactAdmin(admin.ModelAdmin): 

17 """Manage moneybird contacts.""" 

18 

19 list_display = ( 

20 "member", 

21 "moneybird_id", 

22 "moneybird_sepa_mandate_id", 

23 "needs_synchronization", 

24 ) 

25 

26 list_filter = ("needs_synchronization",) 

27 

28 fields = ( 

29 "member", 

30 "moneybird_id", 

31 "moneybird_sepa_mandate_id", 

32 "needs_synchronization", 

33 ) 

34 

35 raw_id_fields = ("member",) 

36 

37 search_fields = ( 

38 "member__first_name", 

39 "member__last_name", 

40 "member__username", 

41 "member__email", 

42 "member__id", 

43 "moneybird_id", 

44 ) 

45 

46 def get_readonly_fields(self, request, obj=None): 

47 if not obj: 

48 return () 

49 return ("member",) 

50 

51 

52@admin.register(MoneybirdExternalInvoice) 

53class MoneybirdExternalInvoiceAdmin(admin.ModelAdmin): 

54 """Manage moneybird external invoices.""" 

55 

56 list_display = ( 

57 "payable_object", 

58 "payable_model", 

59 "moneybird_invoice_id", 

60 "needs_synchronization", 

61 "needs_deletion", 

62 ) 

63 

64 fields = ( 

65 "payable_object", 

66 "payable_model", 

67 "object_id", 

68 "moneybird_invoice_id", 

69 "needs_synchronization", 

70 "needs_deletion", 

71 ) 

72 

73 readonly_fields = ("payable_object", "needs_synchronization", "needs_deletion") 

74 

75 search_fields = ( 

76 "payable_model__app_label", 

77 "payable_model__model", 

78 "moneybird_invoice_id", 

79 ) 

80 

81 list_filter = ( 

82 "needs_synchronization", 

83 "needs_deletion", 

84 ("payable_model", RelatedOnlyFieldListFilter), 

85 ) 

86 

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" 

99 

100 

101@admin.register(MoneybirdPayment) 

102class MoneybirdPaymentAdmin(admin.ModelAdmin): 

103 """Manage moneybird payments.""" 

104 

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 ) 

113 

114 fields = ( 

115 "payment", 

116 "moneybird_financial_statement_id", 

117 "moneybird_financial_mutation_id", 

118 ) 

119 

120 raw_id_fields = ("payment",) 

121 

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 ) 

129 

130 def get_readonly_fields(self, request, obj=None): 

131 if not obj: 

132 return () 

133 return ("payment",) 

134 

135 def payment_type(self, obj): 

136 return obj.payment.type 

137 

138 def payment_topic(self, obj): 

139 return obj.payment.topic 

140 

141 def paid_by(self, obj): 

142 return obj.payment.paid_by 

143 

144 def amount(self, obj): 

145 return obj.payment.amount 

146 

147 

148@admin.register(MoneybirdProject) 

149class MoneybirdProjectAdmin(admin.ModelAdmin): 

150 list_display = ( 

151 "name", 

152 "moneybird_id", 

153 ) 

154 

155 search_fields = ("name", "moneybird_id") 

156 

157 

158@admin.register(MoneybirdReceipt) 

159class MoneybirdReceiptAdmin(admin.ModelAdmin): 

160 """Manage moneybird receipts.""" 

161 

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",) 

172 

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 ) 

182 

183 reimbursement_link.short_description = "Reimbursement" 

184 

185 def get_readonly_fields(self, request, obj=None): 

186 if not obj: 

187 return () 

188 return ("reimbursement",) 

189 

190 def get_queryset(self, request): 

191 qs = super().get_queryset(request) 

192 return qs.select_related("reimbursement")