125 lines
5.5 KiB
Python
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
|