Files
django-dav-events/dav_submission/forms.py
heinzel 98a6fc3ce7
All checks were successful
buildbot/tox Build done.
try to make pylint happy
2022-06-08 00:08:09 +02:00

125 lines
5.5 KiB
Python

# -*- coding: utf-8 -*-
from django import forms
from django.apps import apps
from django.utils.translation import ugettext, ugettext_lazy as _
app_config = apps.get_containing_app_config(__package__)
class UploadForm(forms.Form):
name = forms.CharField(max_length=1024,
label=_('Dein Name'),
help_text=_('Wenn wir wissen, wie du heißt, wird uns das echt weiter helfen'))
email_address = forms.EmailField(label=_('Deine E-Mail-Adresse'),
help_text=_('Damit wir dich für Rückfragen kontaktieren können'))
group = forms.CharField(max_length=1024,
required=False,
label=_('DAV Gruppe'),
help_text=_('Optional, falls du aktiv in einer der Sektionsgruppen bist'))
title = forms.CharField(max_length=60,
label=_('Titel deines Beitrags / Stichwort'),
help_text='%s<br />\n%s' % (
_('Kommt zum Bild, falls es veröffentlicht wird'),
_('Maximal 60 Zeichen')
))
description = forms.CharField(max_length=300,
label=_('Beschreibung'),
help_text='%s<br />\n%s' % (
_('Wo warst du? Was hast du gemacht? Worum ging es bei der Aktion?'),
_('Maximal 300 Zeichen')
),
widget=forms.Textarea(attrs={'rows': 2}))
files = forms.FileField(label=_('Dateien'),
help_text=_('Wenn du auf den Button klickst, kannst du mehrere Dateien auswählen'
' (nötigenfalls Strg- oder Command-Taste benutzen)'),
widget=forms.ClearableFileInput(attrs={'multiple': True}))
accepted = forms.BooleanField(required=False,
label=_('Ja, ich stimme den Teilnahmebedingungen zu!'))
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['title'].widget.attrs['placeholder'] = \
'z.B. Nacktbesteigung der Nose' \
' oder Juma jümart Jung-Mann-Weg'[:self.fields['title'].max_length]
self.fields['group'].widget.attrs['placeholder'] = \
ugettext('Kann frei gelassen werden')[:self.fields['title'].max_length]
help_text = self.fields['files'].help_text
if app_config.settings.max_files:
help_text += '<br />\n%s' % (ugettext('Wähle bis zu %d Dateien aus')
% app_config.settings.max_files)
if app_config.settings.max_file_size_mib:
help_text += '<br />\n%s' % (ugettext('Einzelne Dateien dürfen maximal %d MiB groß sein')
% app_config.settings.max_file_size_mib)
if app_config.settings.max_total_size_mib:
help_text += '<br />\n%s' % (ugettext('Alle Dateien zusammen dürfen maximal %d MiB groß sein')
% app_config.settings.max_total_size_mib)
self.fields['files'].help_text = help_text
def clean_files(self):
not_allowed_file_names = (app_config.settings.metadata_file_name,)
max_files = app_config.settings.max_files
max_file_size_mib = app_config.settings.max_file_size_mib
max_total_size_mib = app_config.settings.max_total_size_mib
validation_errors = []
files = self.files.getlist('files')
max_file_size = max_file_size_mib * 1024 * 1024
size_total = 0
n_files = 0
for file in files:
if file.name in not_allowed_file_names:
e = forms.ValidationError(
ugettext('Dateiname nicht erlaubt: %s') % file.name,
code='filename_not_allowed',
)
validation_errors.append(e)
if max_file_size and file.size > max_file_size:
e = forms.ValidationError(
ugettext('Die Datei ist insgesamt zu groß:'
' %(name)s (> %(max_mib)s MiB)') % {'name': file.name, 'max_mib': max_file_size_mib},
code='file_to_big',
)
validation_errors.append(e)
size_total += file.size
n_files += 1
max_total_size = max_total_size_mib * 1024 * 1024
if max_total_size and size_total > max_total_size:
e = forms.ValidationError(
ugettext('Dein Beitrag ist zu groß (%s MiB)') % max_total_size_mib,
code='files_to_big',
)
validation_errors.append(e)
if max_files and n_files > max_files:
e = forms.ValidationError(
ugettext('Dein Beitrag enthält mehr als %d Dateien') % max_files,
code='files_to_big',
)
validation_errors.append(e)
if validation_errors:
raise forms.ValidationError(validation_errors)
return files
def clean_accepted(self):
val = self.cleaned_data.get('accepted')
if not val:
raise forms.ValidationError(
ugettext('Um deinen Beitrag hochladen zu können,'
' musst du den Teilnahmebedingungen zustimmen.'
' Dazu musst du das Kästchen ankreuzen!'),
code='not_accepted',
)
return val