from django.conf import settings from django.contrib import admin, messages from django.http import HttpResponseRedirect from django.utils.html import format_html from django.utils.translation import ngettext from segno import helpers from posts.models import FetMeeting from .forms import ( BankDataAdminForm, BillAdminForm, BillInlineForm, ResolutionAdminForm, WirefAdminForm, ) from .models import BankData, Bill, Resolution, Wiref from .utils import generate_pdf class BillInline(admin.TabularInline): form = BillInlineForm model = Bill can_delete = False extra = 0 max_num = 0 readonly_fields = ("purpose", "amount", "file_field", "affiliation") show_change_link = True @admin.register(BankData) class BankDataAdmin(admin.ModelAdmin): form = BankDataAdminForm model = BankData list_display = [ "name", "iban", "bic", "is_disabled", ] ordering = ["name"] def add_view(self, request, form_url="", extra_context=None): extra_context = extra_context or {} extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." return super().add_view( request, form_url, extra_context=extra_context, ) def change_view(self, request, object_id, form_url="", extra_context=None): extra_context = extra_context or {} extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." return super().change_view( request, object_id, form_url, extra_context=extra_context, ) @admin.register(Bill) class BillAdmin(admin.ModelAdmin): form = BillAdminForm model = Bill list_display = [ "id", "only_digital", "amount", "purpose", "resolution", "status_colored", "bill_creator", "affiliation", ] actions = ["make_cleared", "make_finished"] list_filter = ["status", "affiliation", "payer"] ordering = ["-id"] search_fields = ["purpose"] readonly_fields = [ "get_bankdata_name", "get_bankdata_iban", "get_bankdata_bic", "get_qrcode", ] fieldsets = ( ( None, { "fields": ( "bill_creator", "resolution", ) }, ), ( "Bankdaten", { "fields": ( "payer", "bankdata", ("get_bankdata_name", "get_bankdata_iban", "get_bankdata_bic"), "get_qrcode", ) }, ), ( "Rechnung", { "fields": ( "affiliation", "date", "invoice", "purpose", "amount", "only_digital", "file_field", ) }, ), ( "Sonstiges", { "fields": ( "comment", "wiref", "status", ) }, ), ) def add_view(self, request, form_url="", extra_context=None): extra_context = extra_context or {} extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." return super().add_view( request, form_url, extra_context=extra_context, ) def change_view(self, request, object_id, form_url="", extra_context=None): extra_context = extra_context or {} extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." return super().change_view( request, object_id, form_url, extra_context=extra_context, ) def save_model(self, request, obj, form, change): obj.author = request.user super().save_model(request, obj, form, change) @admin.display(description="Kontoinhaber:in") def get_bankdata_name(self, obj): try: tmp = BankData.objects.get(id=obj.bankdata.id) except Exception: return "-" return f"{ tmp.name }" @admin.display(description="IBAN") def get_bankdata_iban(self, obj): try: tmp = BankData.objects.get(id=obj.bankdata.id) except Exception: return "-" return f"{ tmp.iban }" @admin.display(description="BIC") def get_bankdata_bic(self, obj): try: tmp = BankData.objects.get(id=obj.bankdata.id) except Exception: return "-" return f"{ tmp.bic }" @admin.display(description="QR Code") def get_qrcode(self, obj): if obj.status != "C": return "-" try: tmp = BankData.objects.get(id=obj.bankdata.id) except Exception: return "-" try: qrcode = helpers.make_epc_qr( name=tmp.name, iban=tmp.iban, amount=obj.amount, text=obj.purpose, bic=tmp.bic, encoding="utf-8", ) except Exception: return "Daten für QR Code ungültig" uri = qrcode.png_data_uri(scale=3.0) return format_html(f'') @admin.display(description="Status") def status_colored(self, obj): # TODO: if there is a status without color, set nothing. colors = { "S": "red", "C": "darkorange", "F": "green", "I": "blue", } return format_html( f'{obj.get_status_display()}' ) @admin.action(description="Als 'Abgerechnet' markieren.") def make_cleared(self, request, queryset): updated = queryset.update(status="C") self.message_user( request, ngettext( "%d Rechnung wurde als 'Abgerechnet' markiert.", "%d Rechnungen wurden als 'Abgerechnet' markiert.", updated, ) % updated, messages.SUCCESS, ) @admin.action(description="Als 'Abgeschlossen' markieren.") def make_finished(self, request, queryset): updated = queryset.update(status="F") self.message_user( request, ngettext( "%d Rechnung wurde als 'Abgeschlossen' markiert.", "%d Rechnungen wurden als 'Abgeschlossen' markiert.", updated, ) % updated, messages.SUCCESS, ) @admin.register(Resolution) class ResolutionAdmin(admin.ModelAdmin): form = ResolutionAdminForm model = Resolution inlines = (BillInline,) list_display = [ "name", "id", "is_visible", "total", ] ordering = ["-id"] search_fields = ["name", "id"] readonly_fields = [ "fetmeeting", ] fieldsets = ( ( None, { "fields": ( "name", "id", "date", "option", "is_visible", ) }, ), ( "Budget", { "fields": ( "budget", "total", "budget_remaining", ) }, ), ( "Abstimmung", { "classes": ["collapse"], "fields": ( "voting", "voting_text", "fetmeeting", ), }, ), ) def add_view(self, request, form_url="", extra_context=None): extra_context = extra_context or {} extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." return super().add_view( request, form_url, extra_context=extra_context, ) def change_view(self, request, object_id, form_url="", extra_context=None): extra_context = extra_context or {} extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." return super().change_view( request, object_id, form_url, extra_context=extra_context, ) @admin.display(description="Gesamtsumme (EUR)") def total(self, obj): total = 0 bills = Bill.objects.filter(resolution=obj) for elem in bills: total += elem.amount return f"{ total }" @admin.display(description="Fachschaftssitzung") def fetmeeting(self, obj): fetmeeting = FetMeeting.objects.get_queryset().filter(date=obj.date).first() print(fetmeeting) if fetmeeting is not None: link = f"https://{settings.HOST_NAME}/posts/{fetmeeting.slug}/" return format_html(f"Link zur Fachschaftssitzung") return format_html("-") @admin.register(Wiref) class WirefAdmin(admin.ModelAdmin): form = WirefAdminForm model = Wiref inlines = (BillInline,) list_display = [ "wiref_id", "status", "file_field", "total", ] actions = ["make_cleared", "make_finished"] list_filter = ["status"] ordering = ["-wiref_id"] def add_view(self, request, form_url="", extra_context=None): extra_context = extra_context or {} extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." return super().add_view( request, form_url, extra_context=extra_context, ) def change_view(self, request, object_id, form_url="", extra_context=None): extra_context = extra_context or {} extra_context["help_text"] = "Fette Schriften sind Pflichtfelder." extra_context["generate_pdf"] = True return super().change_view( request, object_id, form_url, extra_context=extra_context, ) def response_change(self, request, obj): if "_generate_pdf" in request.POST: if generate_pdf(obj) is True: self.message_user( request, "Neues Wiref Formular wurde generiert.", messages.SUCCESS, ) else: self.message_user( request, "Das PDF File wurde nicht generiert, weil der Status nicht offen ist.", messages.WARNING, ) return HttpResponseRedirect(".") return super().response_change(request, obj) def save_model(self, request, obj, form, change): # set status to submitted, if a file exists and status is opened. if ( change is True and obj.file_field != "" and obj.status == Wiref.Status.OPENED and "_generate_pdf" not in request.POST ): obj.status = Wiref.Status.SUBMITTED super().save_model(request, obj, form, change) @admin.display(description="Gesamtsumme (EUR)") def total(self, obj): total = 0 bills = Bill.objects.filter(wiref=obj) for elem in bills: total += elem.amount return f"{ total }" @admin.action(description="Als 'Überwiesen' markieren.") def make_finished(self, request, queryset): updated = queryset.update(status=Wiref.Status.TRANSFERRED) self.message_user( request, ngettext( "%d Wiref Formular wurde als 'Überwiesen' markiert.", "%d Wiref Formulare wurden als 'Überwiesen' markiert.", updated, ) % updated, messages.SUCCESS, )