diff --git a/jdav_web/finance/admin.py b/jdav_web/finance/admin.py index e7f0ccd..463e552 100644 --- a/jdav_web/finance/admin.py +++ b/jdav_web/finance/admin.py @@ -1,5 +1,6 @@ from django.contrib import admin, messages -from django.forms import Textarea +from django import forms +from django.forms import Textarea, ClearableFileInput from django.http import HttpResponse, HttpResponseRedirect from django.db.models import TextField, Q from django.urls import path, reverse @@ -9,7 +10,7 @@ from django.shortcuts import render from django.conf import settings from contrib.admin import CommonAdminInlineMixin, CommonAdminMixin -from utils import get_member +from utils import get_member, RestrictedFileField from rules.contrib.admin import ObjectPermissionsModelAdmin @@ -22,14 +23,21 @@ class LedgerAdmin(admin.ModelAdmin): search_fields = ('name', ) +class BillOnStatementInlineForm(forms.ModelForm): + class Meta: + model = BillOnStatementProxy + fields = ['short_description', 'explanation', 'amount', 'paid_by', 'proof'] + widgets = { + 'proof': ClearableFileInput(attrs={'accept': 'application/pdf,image/jpeg,image/png'}), + 'explanation': Textarea(attrs={'rows': 1, 'cols': 40}) + } + + class BillOnStatementInline(CommonAdminInlineMixin, admin.TabularInline): model = BillOnStatementProxy extra = 0 sortable_options = [] - fields = ['short_description', 'explanation', 'amount', 'paid_by', 'proof'] - formfield_overrides = { - TextField: {'widget': Textarea(attrs={'rows': 1, 'cols': 40})} - } + form = BillOnStatementInlineForm @admin.register(StatementUnSubmitted) diff --git a/jdav_web/finance/migrations/0005_alter_bill_proof.py b/jdav_web/finance/migrations/0005_alter_bill_proof.py new file mode 100644 index 0000000..e87ad53 --- /dev/null +++ b/jdav_web/finance/migrations/0005_alter_bill_proof.py @@ -0,0 +1,19 @@ +# Generated by Django 4.0.1 on 2024-12-26 09:45 + +from django.db import migrations +import utils + + +class Migration(migrations.Migration): + + dependencies = [ + ('finance', '0004_alter_bill_amount'), + ] + + operations = [ + migrations.AlterField( + model_name='bill', + name='proof', + field=utils.RestrictedFileField(blank=True, upload_to='bill_images', verbose_name='Proof'), + ), + ] diff --git a/jdav_web/finance/models.py b/jdav_web/finance/models.py index 4ad3196..04286e1 100644 --- a/jdav_web/finance/models.py +++ b/jdav_web/finance/models.py @@ -13,7 +13,7 @@ from django.conf import settings import rules from contrib.models import CommonModel from contrib.rules import has_global_perm -from utils import cvt_to_decimal +from utils import cvt_to_decimal, RestrictedFileField # Create your models here. @@ -423,7 +423,14 @@ class Bill(CommonModel): costs_covered = models.BooleanField(verbose_name=_('Covered'), default=False) refunded = models.BooleanField(verbose_name=_('Refunded'), default=False) - proof = models.ImageField(_('Proof'), upload_to='bill_images', blank=True) + proof = RestrictedFileField(verbose_name=_('Proof'), + upload_to='bill_images', + blank=True, + max_upload_size=5, + content_types=['application/pdf', + 'image/jpeg', + 'image/png', + 'image/gif']) def __str__(self): return "{} ({}€)".format(self.short_description, self.amount) diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py index 65fa705..cc4c184 100644 --- a/jdav_web/members/admin.py +++ b/jdav_web/members/admin.py @@ -42,7 +42,7 @@ from .models import (Member, Group, Freizeit, MemberNoteList, NewMemberOnList, K from finance.models import Statement, BillOnExcursionProxy from mailer.mailutils import send as send_mail, get_echo_link from django.conf import settings -from utils import get_member +from utils import get_member, RestrictedFileField #from easy_select2 import apply_select2 @@ -215,10 +215,9 @@ class MemberAdmin(CommonAdminMixin, admin.ModelAdmin): list_display_links = None readonly_fields = ['echoed', 'good_conduct_certificate_valid'] inlines = [EmergencyContactInline, TrainingOnMemberInline, PermissionOnMemberInline] - #formfield_overrides = { - # ManyToManyField: {'widget': forms.CheckboxSelectMultiple}, - # ForeignKey: {'widget': apply_select2(forms.Select)} - #} + formfield_overrides = { + RestrictedFileField: {'widget': forms.ClearableFileInput(attrs={'accept': 'application/pdf,image/jpeg,image/png'})}, + } change_form_template = "members/change_member.html" ordering = ('lastname',) actions = ['request_echo', 'invite_as_user_action'] @@ -771,7 +770,8 @@ class BillOnExcursionInline(CommonAdminInlineMixin, admin.TabularInline): sortable_options = [] fields = ['short_description', 'explanation', 'amount', 'paid_by', 'proof'] formfield_overrides = { - TextField: {'widget': Textarea(attrs={'rows': 1, 'cols': 40})} + TextField: {'widget': Textarea(attrs={'rows': 1, 'cols': 40})}, + RestrictedFileField: {'widget': forms.ClearableFileInput(attrs={'accept': 'application/pdf,image/jpeg,image/png'})}, }