Merge branch 'main' into MK/finance_qr_codes

pull/94/head
mariusrklein 12 months ago
commit d5ba0499fe

@ -1,5 +1,6 @@
from django.contrib import admin, messages 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.http import HttpResponse, HttpResponseRedirect
from django.db.models import TextField, Q from django.db.models import TextField, Q
from django.urls import path, reverse from django.urls import path, reverse
@ -9,7 +10,7 @@ from django.shortcuts import render
from django.conf import settings from django.conf import settings
from contrib.admin import CommonAdminInlineMixin, CommonAdminMixin from contrib.admin import CommonAdminInlineMixin, CommonAdminMixin
from utils import get_member from utils import get_member, RestrictedFileField
from rules.contrib.admin import ObjectPermissionsModelAdmin from rules.contrib.admin import ObjectPermissionsModelAdmin
@ -22,14 +23,21 @@ class LedgerAdmin(admin.ModelAdmin):
search_fields = ('name', ) 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): class BillOnStatementInline(CommonAdminInlineMixin, admin.TabularInline):
model = BillOnStatementProxy model = BillOnStatementProxy
extra = 0 extra = 0
sortable_options = [] sortable_options = []
fields = ['short_description', 'explanation', 'amount', 'paid_by', 'proof'] form = BillOnStatementInlineForm
formfield_overrides = {
TextField: {'widget': Textarea(attrs={'rows': 1, 'cols': 40})}
}
@admin.register(StatementUnSubmitted) @admin.register(StatementUnSubmitted)

@ -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'),
),
]

@ -13,7 +13,7 @@ from django.conf import settings
import rules import rules
from contrib.models import CommonModel from contrib.models import CommonModel
from contrib.rules import has_global_perm from contrib.rules import has_global_perm
from utils import cvt_to_decimal from utils import cvt_to_decimal, RestrictedFileField
from schwifty import IBAN from schwifty import IBAN
import re import re
@ -426,7 +426,14 @@ class Bill(CommonModel):
costs_covered = models.BooleanField(verbose_name=_('Covered'), default=False) costs_covered = models.BooleanField(verbose_name=_('Covered'), default=False)
refunded = models.BooleanField(verbose_name=_('Refunded'), 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): def __str__(self):
return "{} ({}€)".format(self.short_description, self.amount) return "{} ({}€)".format(self.short_description, self.amount)

@ -54,9 +54,9 @@ JET_SIDE_MENU_ITEMS = [
{'name': 'post', 'permissions': ['startpage.view_post']}, {'name': 'post', 'permissions': ['startpage.view_post']},
]}, ]},
{'label': 'Externe Links', 'items' : [ {'label': 'Externe Links', 'items' : [
{ 'label': 'Nextcloud', 'url': CLOUD_LINK }, { 'label': 'Nextcloud', 'url': CLOUD_LINK, 'url_blank': True },
{ 'label': 'DAV 360', 'url': DAV_360_LINK }, { 'label': 'DAV 360', 'url': DAV_360_LINK, 'url_blank': True },
{ 'label': 'Julei-Wiki', 'url': WIKI_LINK }, { 'label': 'Julei-Wiki', 'url': WIKI_LINK, 'url_blank': True },
{ 'label': 'Kompass Dokumentation', 'url': DOCS_LINK }, { 'label': 'Kompass Dokumentation', 'url': DOCS_LINK, 'url_blank': True },
]}, ]},
] ]

@ -42,8 +42,9 @@ from .models import (Member, Group, Freizeit, MemberNoteList, NewMemberOnList, K
from finance.models import Statement, BillOnExcursionProxy from finance.models import Statement, BillOnExcursionProxy
from mailer.mailutils import send as send_mail, get_echo_link from mailer.mailutils import send as send_mail, get_echo_link
from django.conf import settings from django.conf import settings
from utils import get_member from utils import get_member, RestrictedFileField
from schwifty import IBAN from schwifty import IBAN
#from easy_select2 import apply_select2 #from easy_select2 import apply_select2
@ -230,10 +231,9 @@ class MemberAdmin(CommonAdminMixin, admin.ModelAdmin):
list_display_links = None list_display_links = None
readonly_fields = ['echoed', 'good_conduct_certificate_valid'] readonly_fields = ['echoed', 'good_conduct_certificate_valid']
inlines = [EmergencyContactInline, TrainingOnMemberInline, PermissionOnMemberInline] inlines = [EmergencyContactInline, TrainingOnMemberInline, PermissionOnMemberInline]
#formfield_overrides = { formfield_overrides = {
# ManyToManyField: {'widget': forms.CheckboxSelectMultiple}, RestrictedFileField: {'widget': forms.ClearableFileInput(attrs={'accept': 'application/pdf,image/jpeg,image/png'})},
# ForeignKey: {'widget': apply_select2(forms.Select)} }
#}
change_form_template = "members/change_member.html" change_form_template = "members/change_member.html"
ordering = ('lastname',) ordering = ('lastname',)
actions = ['request_echo', 'invite_as_user_action'] actions = ['request_echo', 'invite_as_user_action']
@ -788,7 +788,8 @@ class BillOnExcursionInline(CommonAdminInlineMixin, admin.TabularInline):
sortable_options = [] sortable_options = []
fields = ['short_description', 'explanation', 'amount', 'paid_by', 'proof'] fields = ['short_description', 'explanation', 'amount', 'paid_by', 'proof']
formfield_overrides = { 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'})},
} }

Loading…
Cancel
Save