add wiref, bill inline, total
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user