add wiref, bill inline, total

This commit is contained in:
2023-09-18 07:38:36 +00:00
parent faf80d59f0
commit c8fd414f8c
3 changed files with 220 additions and 13 deletions

View File

@@ -2,8 +2,25 @@ from django.contrib import admin, messages
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.translation import ngettext from django.utils.translation import ngettext
from .forms import BankDataAdminForm, BillAdminForm, ResolutionAdminForm from .forms import (
from .models import BankData, Bill, Resolution BankDataAdminForm,
BillAdminForm,
BillInlineForm,
ResolutionAdminForm,
WirefAdminForm,
)
from .models import BankData, Bill, Resolution, Wiref
class BillInline(admin.TabularInline):
form = BillInlineForm
model = Bill
can_delete = False
extra = 0
max_num = 0
readonly_fields = ("purpose", "amount", "file_field")
show_change_link = True
class BankDataAdmin(admin.ModelAdmin): class BankDataAdmin(admin.ModelAdmin):
@@ -15,6 +32,25 @@ class BankDataAdmin(admin.ModelAdmin):
"iban", "iban",
] ]
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,
)
class BillAdmin(admin.ModelAdmin): class BillAdmin(admin.ModelAdmin):
form = BillAdminForm form = BillAdminForm
@@ -29,13 +65,12 @@ class BillAdmin(admin.ModelAdmin):
"status_colored", "status_colored",
"bill_creator", "bill_creator",
"affiliation", "affiliation",
"wiref_id",
] ]
actions = ["make_cleared", "make_finished"] actions = ["make_cleared", "make_finished"]
list_filter = ["status", "affiliation"] list_filter = ["status", "affiliation"]
search_fields = ["wiref_id", "purpose"]
ordering = ["date_created"] ordering = ["date_created"]
search_fields = ["purpose"]
readonly_fields = ["get_bankdata_name", "get_bankdata_iban", "get_bankdata_bic"] readonly_fields = ["get_bankdata_name", "get_bankdata_iban", "get_bankdata_bic"]
fieldsets = ( fieldsets = (
@@ -77,7 +112,7 @@ class BillAdmin(admin.ModelAdmin):
{ {
"fields": ( "fields": (
"comment", "comment",
"wiref_id", "wiref",
"status", "status",
) )
}, },
@@ -139,11 +174,13 @@ class BillAdmin(admin.ModelAdmin):
def status_colored(self, obj): def status_colored(self, obj):
colors = { colors = {
'S': 'red', "S": "red",
'C': 'darkorange', "C": "darkorange",
'F': 'green', "F": "green",
} }
return mark_safe('<b style="background:{};">{}</b>'.format(colors[obj.status], obj.get_status_display())) return mark_safe(
f'<b style="background:{colors[obj.status]};">{obj.get_status_display()}</b>'
)
status_colored.short_description = "Status" status_colored.short_description = "Status"
@@ -180,13 +217,88 @@ class ResolutionAdmin(admin.ModelAdmin):
form = ResolutionAdminForm form = ResolutionAdminForm
model = Resolution model = Resolution
inlines = (BillInline,)
list_display = [ list_display = [
"name", "name",
"id", "id",
"is_visible", "is_visible",
"total",
] ]
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 total(self, obj):
total = 0
bills = Bill.objects.filter(resolution=obj)
for elem in bills:
total += elem.amount
return f"{ total }"
total.short_description = "Gesamtsumme (EUR)"
class WirefAdmin(admin.ModelAdmin):
form = WirefAdminForm
model = Wiref
inlines = (BillInline,)
list_display = [
"wiref_id",
"file_field",
"total",
]
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 total(self, obj):
total = 0
bills = Bill.objects.filter(wiref=obj)
for elem in bills:
total += elem.amount
return f"{ total }"
total.short_description = "Gesamtsumme (EUR)"
admin.site.register(BankData, BankDataAdmin) admin.site.register(BankData, BankDataAdmin)
admin.site.register(Bill, BillAdmin) admin.site.register(Bill, BillAdmin)
admin.site.register(Resolution, ResolutionAdmin) admin.site.register(Resolution, ResolutionAdmin)
admin.site.register(Wiref, WirefAdmin)

View File

@@ -4,7 +4,7 @@ from django.forms import DateInput
from members.models import Member from members.models import Member
from .models import BankData, Bill, Resolution from .models import BankData, Bill, Resolution, Wiref
class DateInput(DateInput): class DateInput(DateInput):
@@ -212,6 +212,20 @@ class BillUpdateForm(forms.ModelForm):
self.fields["comment"].disabled = True self.fields["comment"].disabled = True
class BillInlineForm(forms.ModelForm):
class Meta:
fields = [
"purpose",
"file_field",
]
model = Bill
labels = {
"purpose": "Verwendungszweck",
"file_field": "Hochgeladene Rechnung",
}
class BankDataAdminForm(forms.ModelForm): class BankDataAdminForm(forms.ModelForm):
class Meta: class Meta:
model = BankData model = BankData
@@ -258,7 +272,62 @@ class BillAdminForm(forms.ModelForm):
class ResolutionAdminForm(forms.ModelForm): class ResolutionAdminForm(forms.ModelForm):
total = forms.CharField()
class Meta: class Meta:
model = Resolution model = Resolution
fields = "__all__" fields = [
"name",
"id",
"is_visible",
"total",
]
labels = {
"id": "ID",
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set
bills = Bill.objects.filter(resolution=kwargs["instance"])
total = 0
for elem in bills:
total += elem.amount
self.fields["total"].disabled = True
self.fields["total"].initial = total
self.fields["total"].label = "Gesamtsumme (EUR)"
self.fields["total"].required = False
class WirefAdminForm(forms.ModelForm):
total = forms.CharField()
class Meta:
model = Wiref
fields = [
"wiref_id",
"file_field",
"total",
]
labels = {
"wiref_id": "Wiref ID",
"file_field": "Wiref Formular",
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) # to get the self.fields set
bills = Bill.objects.filter(wiref=kwargs["instance"])
total = 0
for elem in bills:
total += elem.amount
self.fields["total"].disabled = True
self.fields["total"].initial = total
self.fields["total"].label = "Gesamtsumme (EUR)"
self.fields["total"].required = False

View File

@@ -40,6 +40,25 @@ class Resolution(models.Model):
return f"{self.name}" return f"{self.name}"
class Wiref(models.Model):
wiref_id = models.CharField(max_length=10, blank=True, null=True)
file_field = models.FileField(
upload_to="uploads/finance/wiref/",
validators=[FileExtensionValidator(["pdf"])],
blank=True,
null=True,
verbose_name="Wiref Formular",
)
class Meta:
verbose_name = "Wiref Formular"
verbose_name_plural = "Wiref Formulare"
def __str__(self):
return f"{self.wiref_id}"
class Bill(models.Model): class Bill(models.Model):
# members can be deleted but never their bills # members can be deleted but never their bills
bill_creator = models.ForeignKey( bill_creator = models.ForeignKey(
@@ -86,7 +105,7 @@ class Bill(models.Model):
only_digital = models.BooleanField(default=False, verbose_name="Digitale Rechnung") only_digital = models.BooleanField(default=False, verbose_name="Digitale Rechnung")
file_field = models.FileField( file_field = models.FileField(
upload_to="uploads/finance/files/", upload_to="uploads/finance/bills/",
validators=[FileExtensionValidator(["pdf"])], validators=[FileExtensionValidator(["pdf"])],
blank=True, blank=True,
null=True, null=True,
@@ -105,7 +124,14 @@ class Bill(models.Model):
default=Status.SUBMITTED, default=Status.SUBMITTED,
verbose_name="Status", verbose_name="Status",
) )
wiref_id = models.CharField(max_length=10, blank=True, null=True)
wiref = models.ForeignKey(
Wiref,
on_delete=models.SET_NULL,
blank=True,
null=True,
verbose_name="Wiref",
)
date_created = models.DateTimeField(auto_now_add=True) date_created = models.DateTimeField(auto_now_add=True)