diff --git a/dav_submission/__init__.py b/dav_submission/__init__.py
new file mode 100644
index 0000000..e2bee2f
--- /dev/null
+++ b/dav_submission/__init__.py
@@ -0,0 +1 @@
+default_app_config = 'dav_submission.apps.AppConfig'
diff --git a/dav_submission/apps.py b/dav_submission/apps.py
new file mode 100644
index 0000000..31fed4e
--- /dev/null
+++ b/dav_submission/apps.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+import os
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
+
+from dav_base.config.apps import AppConfig as _AppConfig, DefaultSetting
+
+DEFAULT_SETTINGS = (
+ DefaultSetting('upload_path', os.path.join(settings.BASE_VAR_DIR, 'lib', 'dav_submission', 'submissions')),
+ DefaultSetting('max_files', 100),
+ DefaultSetting('max_file_size_mib', 50),
+ DefaultSetting('max_total_size_mib', 100),
+ DefaultSetting('metadata_file_name', 'metadata.txt'),
+)
+
+
+class AppConfig(_AppConfig):
+ name = 'dav_submission'
+ verbose_name = u'DAV Beitragsupload (150 Jahre DAV)'
+ default_settings = DEFAULT_SETTINGS
diff --git a/dav_submission/django_project_config/settings-dav_submission.py b/dav_submission/django_project_config/settings-dav_submission.py
new file mode 100644
index 0000000..c0c91fb
--- /dev/null
+++ b/dav_submission/django_project_config/settings-dav_submission.py
@@ -0,0 +1,9 @@
+# -*- coding: utf-8 -*-
+import os
+from django.conf import settings
+
+# UPLOAD_PATH = os.path.join(settings.BASE_VAR_DIR, 'lib', 'dav_submission', 'submissions')
+# MAX_FILES = 100
+# MAX_FILE_SIZE_MIB = 50
+# MAX_TOTAL_SIZE_MIB = 100
+# METADATA_FILE_NAME = 'metadata.txt'
\ No newline at end of file
diff --git a/dav_submission/forms.py b/dav_submission/forms.py
new file mode 100644
index 0000000..0411c7f
--- /dev/null
+++ b/dav_submission/forms.py
@@ -0,0 +1,108 @@
+# -*- 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=_(u'Dein Name'),
+ help_text=_(u'Wenn wir wissen, wie du heißt, wird uns das echt weiter helfen'))
+ email_address = forms.EmailField(label=_(u'Deine E-Mail-Adresse'),
+ help_text=_(u'Lorem'))
+
+ title = forms.CharField(max_length=60,
+ label=_(u'Titel deines Beitrags / Stichwort'),
+ help_text=u'%s
%s' % (
+ _(u'Lorem'),
+ _(u'Maximal 60 Zeichen')
+ ))
+
+ description = forms.CharField(label=_(u'Beschreibung'),
+ help_text=_(u'Lorem'),
+ widget=forms.Textarea(attrs={'rows': 2}))
+
+ files = forms.FileField(label=_(u'Dateien'),
+ help_text=_(u'Lorem'),
+ widget=forms.ClearableFileInput(attrs={'multiple': True}))
+
+ accepted = forms.BooleanField(required=False,
+ label=_(u'Ja, lorem!'))
+
+ def __init__(self, *args, **kwargs):
+ super(UploadForm, self).__init__(*args, **kwargs)
+
+ self.fields['title'].widget.attrs['placeholder'] = \
+ u'Climb & Bold - Nacktbesteigung der Nose'[:self.fields['title'].max_length]
+
+ help_text = self.fields['files'].help_text
+ if app_config.settings.max_files:
+ help_text += u'
%s' % (ugettext(u'Lade bis zu %d Dateien hoch')
+ % app_config.settings.max_files)
+ if app_config.settings.max_file_size_mib:
+ help_text += u'
%s' % (ugettext(u'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 += u'
%s' % (ugettext(u'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:
+ ve = forms.ValidationError(
+ ugettext(u'Dateiname nicht erlaubt: %s') % file.name,
+ code='filename_not_allowed',
+ )
+ validation_errors.append(ve)
+ if max_file_size and file.size > max_file_size:
+ ve = forms.ValidationError(
+ ugettext(u'Die Datei ist insgesamt zu groß:'
+ u' %(name)s (> %(max_mib)s MiB)') % {'name': file.name, 'max_mib': max_file_size_mib},
+ code='file_to_big',
+ )
+ validation_errors.append(ve)
+ 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:
+ ve = forms.ValidationError(
+ ugettext(u'Dein Beitrag ist zu groß (%s MiB)') % max_total_size_mib,
+ code='files_to_big',
+ )
+ validation_errors.append(ve)
+
+ if max_files and n_files > max_files:
+ ve = forms.ValidationError(
+ ugettext(u'Dein Beitrag enthält mehr als %d Dateien') % max_files,
+ code='files_to_big',
+ )
+ validation_errors.append(ve)
+
+ 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(u'Sag ja! Du musst!'),
+ code='not_accepted',
+ )
+ return val
diff --git a/dav_submission/module.json b/dav_submission/module.json
new file mode 100644
index 0000000..6fe2ea8
--- /dev/null
+++ b/dav_submission/module.json
@@ -0,0 +1,3 @@
+{
+ "url_prefix": "150"
+}
\ No newline at end of file
diff --git a/dav_submission/templates/dav_submission/base.html b/dav_submission/templates/dav_submission/base.html
new file mode 100644
index 0000000..16f4455
--- /dev/null
+++ b/dav_submission/templates/dav_submission/base.html
@@ -0,0 +1,11 @@
+{% extends "dav_base/base.html" %}
+{% load bootstrap3 %}
+
+{% block project-name %}150 Jahre DAV - Einreichung{% endblock %}
+
+{% block messages %}
+
Lorem ipsum dolor
+ {% lorem %} +