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 1cca51a..e8f9f0f 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 from schwifty import IBAN import re @@ -426,7 +426,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/jdav_web/settings/components/jet.py b/jdav_web/jdav_web/settings/components/jet.py index d860958..e261545 100644 --- a/jdav_web/jdav_web/settings/components/jet.py +++ b/jdav_web/jdav_web/settings/components/jet.py @@ -54,9 +54,9 @@ JET_SIDE_MENU_ITEMS = [ {'name': 'post', 'permissions': ['startpage.view_post']}, ]}, {'label': 'Externe Links', 'items' : [ - { 'label': 'Nextcloud', 'url': CLOUD_LINK }, - { 'label': 'DAV 360', 'url': DAV_360_LINK }, - { 'label': 'Julei-Wiki', 'url': WIKI_LINK }, - { 'label': 'Kompass Dokumentation', 'url': DOCS_LINK }, + { 'label': 'Nextcloud', 'url': CLOUD_LINK, 'url_blank': True }, + { 'label': 'DAV 360', 'url': DAV_360_LINK, 'url_blank': True }, + { 'label': 'Julei-Wiki', 'url': WIKI_LINK, 'url_blank': True }, + { 'label': 'Kompass Dokumentation', 'url': DOCS_LINK, 'url_blank': True }, ]}, ] diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py index 2983481..670fc0d 100644 --- a/jdav_web/members/admin.py +++ b/jdav_web/members/admin.py @@ -42,8 +42,9 @@ 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 schwifty import IBAN + #from easy_select2 import apply_select2 @@ -230,10 +231,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'] @@ -788,7 +788,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'})}, }