diff --git a/fet2020/fet2020/urls.py b/fet2020/fet2020/urls.py index 9b118f0a..02facb86 100644 --- a/fet2020/fet2020/urls.py +++ b/fet2020/fet2020/urls.py @@ -42,6 +42,7 @@ urlpatterns = [ path("posts/", include("posts.urls")), path("tasks/", include("tasks.urls"), name="tasks"), path("intern/", include("intern.urls"), name="intern"), + path('pages/', include('django.contrib.flatpages.urls')), path( "sitemap.xml", sitemap, diff --git a/fet2020/intern/admin.py b/fet2020/intern/admin.py index fe2b8dec..b856dea9 100644 --- a/fet2020/intern/admin.py +++ b/fet2020/intern/admin.py @@ -1,11 +1,12 @@ from django.contrib import admin -from .models import TopicGroup, Topic, Documentation -from .forms import TopicGroupAdminForm, TopicAdminForm +from .models import TopicGroup, Topic, Documentation, Document +from .forms import TopicGroupAdminForm, TopicAdminForm, DocumentationAdminForm, DocumentAdminForm class DocumentationInline(admin.TabularInline): model = Documentation + form = DocumentationAdminForm extra = 0 verbose_name = "Dokument" verbose_name_plural = "Dokument-Übersicht" @@ -13,17 +14,21 @@ class DocumentationInline(admin.TabularInline): class TopicInline(admin.TabularInline): model = Topic + form = TopicAdminForm extra = 0 - verbose_name = "Topic" - verbose_name_plural = "Topic-Übersicht" + verbose_name = "Thema" + verbose_name_plural = "Themen" + show_change_link = True class TopicGroupAdmin(admin.ModelAdmin): form = TopicGroupAdminForm model = TopicGroup - search_fields = ("title",) + search_fields = ("title", ) inlines = (TopicInline,) + list_display = ["title", "order",] + def save_model(self, request, obj, form, change): obj.created_by = request.user super().save_model(request, obj, form, change) @@ -35,23 +40,39 @@ class TopicAdmin(admin.ModelAdmin): search_fields = ("title",) inlines = (DocumentationInline,) + list_filter = ["archive",] + list_display = ["title", "topic_group", "archive",] + def save_model(self, request, obj, form, change): obj.created_by = request.user super().save_model(request, obj, form, change) -""" class DocumentationAdmin(admin.ModelAdmin): form = DocumentationAdminForm model = Documentation - list_display = ["title", "topic"] + list_display = ["title", "topic",] def save_model(self, request, obj, form, change): obj.created_by = request.user super().save_model(request, obj, form, change) -""" + + +class DocumentAdmin(admin.ModelAdmin): + form = DocumentAdminForm + model = Document + + list_filter = ["documentation",] + list_display = ["title", "date", "documentation",] + ordering = ["-date"] + + def save_model(self, request, obj, form, change): + obj.created_by = request.user + super().save_model(request, obj, form, change) + admin.site.register(TopicGroup, TopicGroupAdmin) admin.site.register(Topic, TopicAdmin) -# admin.site.register(Documentation, DocumentationAdmin) +#admin.site.register(Documentation, DocumentationAdmin) +admin.site.register(Document, DocumentAdmin) diff --git a/fet2020/intern/forms.py b/fet2020/intern/forms.py index f2863d49..e9761345 100644 --- a/fet2020/intern/forms.py +++ b/fet2020/intern/forms.py @@ -1,11 +1,14 @@ +from ckeditor_uploader.widgets import CKEditorUploadingWidget from django import forms from django.utils.translation import gettext_lazy as _ -from ckeditor_uploader.widgets import CKEditorUploadingWidget - from .models import TopicGroup, Topic, Documentation, Document +class DateInput(forms.DateInput): + input_type = "date" + + class TopicGroupAdminForm(forms.ModelForm): class Meta: model = TopicGroup @@ -19,6 +22,7 @@ class TopicAdminForm(forms.ModelForm): model = Topic fields = [ "title", + "archive", "description", "topic_group", ] @@ -31,10 +35,22 @@ class DocumentationAdminForm(forms.ModelForm): model = Documentation fields = [ "title", + "placeholder", "description", "topic", ] + widgets = {"description": CKEditorUploadingWidget(config_name="default")} + + +class DocumentAdminForm(forms.ModelForm): + class Meta: + model = Document + fields = [ + "title", + "documentation", + ] + class DocumentForm(forms.ModelForm): class Meta: @@ -42,8 +58,16 @@ class DocumentForm(forms.ModelForm): fields = [ "title", + "date", ] labels = { - "title": _("Titel des Protokolls"), + "title": _("Titel"), + "date": _("Datum"), + } + + widgets = { + "date": DateInput( + format=("%d-%m-%Y"), + ) } diff --git a/fet2020/intern/models.py b/fet2020/intern/models.py index 8715e6f4..2f2a8955 100644 --- a/fet2020/intern/models.py +++ b/fet2020/intern/models.py @@ -1,19 +1,30 @@ import logging + +from datetime import date +from django.core.validators import ValidationError from django.db import models +from django.db.models.constraints import UniqueConstraint +from django.utils import timezone from django.utils.text import slugify +from django.utils.translation import gettext_lazy as _ + from documents import createPadifNotExists -from urllib.request import URLError logger = logging.getLogger(__name__) class TopicGroup(models.Model): - title = models.CharField(max_length=128) - + title = models.CharField(verbose_name="Titel", max_length=128) slug = models.SlugField(unique=True, blank=True) + order = models.PositiveSmallIntegerField(verbose_name="Reihenfolge", unique=True, null=True, blank=True) + objects = models.Manager() + class Meta: + verbose_name = "Themenbereich" + verbose_name_plural = "Themenbereiche" + def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title) @@ -25,15 +36,21 @@ class TopicGroup(models.Model): class Topic(models.Model): - title = models.CharField(max_length=128) - + title = models.CharField(verbose_name="Titel", max_length=128) slug = models.SlugField(unique=True, blank=True) + + archive = models.BooleanField(verbose_name="Archiv", default=False) + description = models.TextField(null=True, blank=True) - topic_group = models.ForeignKey(TopicGroup, on_delete=models.CASCADE) + topic_group = models.ForeignKey(TopicGroup, on_delete=models.CASCADE, verbose_name="Themenbereich") objects = models.Manager() + class Meta: + verbose_name = "Thema" + verbose_name_plural = "Themen" + def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title) @@ -45,9 +62,10 @@ class Topic(models.Model): class Documentation(models.Model): - title = models.CharField(max_length=128) + title = models.CharField(verbose_name="Titel", max_length=128) + slug = models.SlugField(blank=True) + placeholder = models.CharField(verbose_name="Platzhalter", max_length=128, default="Titel") - slug = models.SlugField(unique=True, blank=True) description = models.TextField(null=True, blank=True) topic = models.ForeignKey(Topic, on_delete=models.CASCADE) @@ -61,41 +79,45 @@ class Documentation(models.Model): super().save(*args, **kwargs) def __str__(self): - return self.title + return self.topic.title + " / " + self.title class Document(models.Model): - title = models.CharField(max_length=128) - + title = models.CharField(verbose_name="Titel", max_length=128) etherpad_key = models.CharField(max_length=128, null=True, blank=True) + date = models.DateField(verbose_name="Datum", default=date.today) documentation = models.ForeignKey(Documentation, on_delete=models.CASCADE) objects = models.Manager() + class Meta: + verbose_name = "Dokument" + verbose_name_plural = "Dokumente" + + constraints = [ + UniqueConstraint(fields=['title', 'date'], name='unique_title_and_date'), + ] + + ''' + pre save signal + def clean(self): + pad_name = slugify(self.date + "-" + self.documentation.topic.slug + "-" + self.documentation.slug + "-" + slugify(self.title) + + if len(pad_name) > 50: + print(pad_name) + raise ValidationError( + _('Name zum Erstellen des Etherpads ist zu lange - max. 50 Zeichen. (Länge: %(length)s) (Name: %(pad_name)s)'), + params={'length': len(pad_name), 'pad_name': pad_name}, + ) + ''' + def save(self, *args, **kwargs): - try: - self.etherpad_key = createPadifNotExists( - self.documentation.topic.slug - + "-" - + self.documentation.slug - + "-" - + slugify(self.title) - ) - except URLError as error: - logger.info( - "Can't create a Etherpad '%s' from the slug. Error: %s", - slugify(self.title), - error, - ) - self.etherpad_key = None + self.etherpad_key = createPadifNotExists( + slugify(self.date) + "-" + self.documentation.topic.slug + "-" + self.documentation.slug + "-" + slugify(self.title) + ) super().save(*args, **kwargs) def __str__(self): return self.title - - -class Protocol(Document): - event_start = models.DateTimeField(null=True, blank=True) - event_end = models.DateTimeField(null=True, blank=True) diff --git a/fet2020/intern/urls.py b/fet2020/intern/urls.py index 453b14a6..ff7d36f0 100644 --- a/fet2020/intern/urls.py +++ b/fet2020/intern/urls.py @@ -6,5 +6,5 @@ from . import views urlpatterns = [ path("", views.index, name="intern"), path("", views.show_topic, name="topic"), - path("/", views.show_docu, name="docu"), + path("/", views.show_docu, name="docu"), ] diff --git a/fet2020/intern/views.py b/fet2020/intern/views.py index 298d3f9e..b2c69cd8 100644 --- a/fet2020/intern/views.py +++ b/fet2020/intern/views.py @@ -1,8 +1,11 @@ import logging +from django.contrib import messages +from django.db.models import F, Q from django.http import HttpResponseRedirect from django.shortcuts import render from documents.api import get_pad_link +from documents.etherpadlib import add_ep_cookie from collections import deque from .forms import DocumentForm @@ -12,12 +15,9 @@ logger = logging.getLogger(__name__) def index(request): - - topic_group = deque(TopicGroup.objects.all()) - topic = Topic.objects.all() + topic = deque(Topic.objects.filter(archive=False).order_by(F('topic_group__order').asc(nulls_last=True), 'topic_group', 'title')) context = { - "topic_group": topic_group, "topic": topic, } @@ -25,15 +25,10 @@ def index(request): def show_topic(request, slug=None): - - topic_group = deque(TopicGroup.objects.all()) - topic = deque(Topic.objects.all()) active_topic = Topic.objects.filter(slug=slug).first() - docu = deque(Documentation.objects.filter(topic__slug=slug)) + docu = deque(Documentation.objects.filter(topic__slug=slug).order_by('title')) context = { - "topic_group": topic_group, - "topic": topic, "active_topic": active_topic, "docus": docu, } @@ -41,10 +36,9 @@ def show_topic(request, slug=None): return render(request, "intern/topic.html", context) -def show_docu(request, slug=None, foo=None): - - active_docu = Documentation.objects.filter(slug=foo).first() - active_topic = Topic.objects.filter(slug=slug).first() +def show_docu(request, topic_slug=None, slug=None): + active_docu = Documentation.objects.filter(Q(topic__slug=topic_slug) & Q(slug=slug)).first() + active_topic = Topic.objects.filter(slug=topic_slug).first() if request.method == "POST": if "btn_input" in request.POST: @@ -58,22 +52,28 @@ def show_docu(request, slug=None, foo=None): return HttpResponseRedirect(request.path) - form = DocumentForm() - docus = deque(Document.objects.filter(documentation=active_docu)) + else: + for elem in list(form.errors.values()): + messages.info(request, '; '.join(elem)) + + initial = { + "title": active_docu.placeholder, + } + + form = DocumentForm(initial=initial) + + docus = deque(Document.objects.filter(documentation=active_docu).order_by('-date')) documents = deque([]) + # list of etherpad url-link of any documents for elem in docus: - try: - documents.append( - { - "title": elem.title, - "etherpad_key": get_pad_link(elem.etherpad_key), - } - ) - except Exception as e: - logger.error( - "Can't get the agenda link from '%s'. Error: %s", elem.etherpad_key, e - ) + documents.append( + { + "title": elem.title, + "date": elem.date, + "etherpad_key": get_pad_link(elem.etherpad_key), + } + ) context = { "formset": form, @@ -82,4 +82,11 @@ def show_docu(request, slug=None, foo=None): "documents": documents, } - return render(request, "intern/docu.html", context) + response = render(request, "intern/docu.html", context) + + try: + response = add_ep_cookie(request, response) + except Exception as e: + logger.info("Etherpad Server doesn't work. Error: %s", e) + + return response diff --git a/fet2020/templates/intern/docu.html b/fet2020/templates/intern/docu.html index 41196da4..58f28ed3 100644 --- a/fet2020/templates/intern/docu.html +++ b/fet2020/templates/intern/docu.html @@ -2,9 +2,7 @@ {% block content %}
-
+ {% if active_docu.description %} +
+ {{ active_docu.description|safe }} +
- {{ active_docu.description|safe }} +
+ {% endif %} + +
+ {% csrf_token %} + +
+ + {{ formset.management_form }} + + {% for form in formset %} +
+ {{ form }} +
+ {% endfor %} + + {{ formset.non_field_errors }} + +
+ +
+
+
+ + {% for message in messages %} +

{{message}}

+ {% endfor %} + +
- -
- -
-

Neues Protokoll hinzufügen

- -
- {% csrf_token %} - -
- - {{ formset.management_form }} - - {% for form in formset %} -
- {{ form.label }} - {{ form }} +
+ {% for document in documents %} + +
+
+

{{ document.title }}

+
+
+

{{ document.date }}

+
+
+
+ {% endfor %}
- {% endfor %} - -
- -
-
- - -
-
{% endblock %} diff --git a/fet2020/templates/intern/topic.html b/fet2020/templates/intern/topic.html index 31738a0d..4553a16a 100644 --- a/fet2020/templates/intern/topic.html +++ b/fet2020/templates/intern/topic.html @@ -2,9 +2,7 @@ {% block content %}
-
- - {{ active_topic.description|safe }} - - -
- {% for docu in docus %} -
- -
-
- {{ docu.title }} -
-
-
+ {% if active_topic.description %} +
+ {{ active_topic.description|safe }}
- {% endfor %} -
+
+ {% endif %} +
+ {% for docu in docus %} + + {% endfor %} +
-
{% endblock %} diff --git a/fet2020/templates/layout.html b/fet2020/templates/layout.html index a914243a..bdbb55fd 100644 --- a/fet2020/templates/layout.html +++ b/fet2020/templates/layout.html @@ -11,7 +11,7 @@ - + {% block extraheader %} {% endblock %}