# -*- 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
\n%s' % ( _('Kommt zum Bild, falls es veröffentlicht wird'), _('Maximal 60 Zeichen') )) description = forms.CharField(max_length=300, label=_('Beschreibung'), help_text='%s
\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 += '
\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 += '
\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 += '
\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