From 3793aa914c7b0ddaffa31af52ad21ad74b200bfb Mon Sep 17 00:00:00 2001 From: Patrick Mayr Date: Mon, 2 Jan 2023 17:38:43 +0000 Subject: [PATCH] update show to DetailViews, add UpdateViews and CreateView --- fet2020/posts/forms.py | 88 ++++- fet2020/posts/models.py | 9 +- fet2020/posts/urls.py | 8 +- fet2020/posts/views.py | 296 ++++++++++------ fet2020/templates/baseform/body.html | 10 + fet2020/templates/baseform/date_time.html | 13 + .../templates/baseform/non_field_errors.html | 7 + fet2020/templates/baseform/select.html | 13 + fet2020/templates/baseform/text.html | 12 + fet2020/templates/posts/event/detail.html | 107 ++++++ fet2020/templates/posts/event/update.html | 30 ++ .../templates/posts/fetmeeting/create.html | 27 ++ .../templates/posts/fetmeeting/detail.html | 222 ++++++++++++ .../templates/posts/fetmeeting/update.html | 28 ++ fet2020/templates/posts/news/detail.html | 62 ++++ fet2020/templates/posts/news/update.html | 26 ++ fet2020/templates/posts/show.html | 328 +++--------------- 17 files changed, 893 insertions(+), 393 deletions(-) create mode 100644 fet2020/templates/baseform/body.html create mode 100644 fet2020/templates/baseform/date_time.html create mode 100644 fet2020/templates/baseform/non_field_errors.html create mode 100644 fet2020/templates/baseform/select.html create mode 100644 fet2020/templates/baseform/text.html create mode 100644 fet2020/templates/posts/event/detail.html create mode 100644 fet2020/templates/posts/event/update.html create mode 100644 fet2020/templates/posts/fetmeeting/create.html create mode 100644 fet2020/templates/posts/fetmeeting/detail.html create mode 100644 fet2020/templates/posts/fetmeeting/update.html create mode 100644 fet2020/templates/posts/news/detail.html create mode 100644 fet2020/templates/posts/news/update.html diff --git a/fet2020/posts/forms.py b/fet2020/posts/forms.py index 38677f3c..f1d977c8 100644 --- a/fet2020/posts/forms.py +++ b/fet2020/posts/forms.py @@ -2,7 +2,7 @@ from ckeditor_uploader.widgets import CKEditorUploadingWidget from taggit.models import Tag from django import forms -from django.forms.widgets import CheckboxInput +from django.forms.widgets import CheckboxInput, DateTimeInput from django.utils import timezone from django.utils.dates import MONTHS @@ -167,3 +167,89 @@ class PostSearchForm(forms.Form): self.fields["year"].choices = year_choices except: pass + + +class NewsUpdateForm(forms.ModelForm): + class Meta: + model = News + + fields = [ + "title", + "status", + "body", + ] + + labels = { + "title": "Titel", + "image": "Hintergrundbild", + "body": "Text", + } + + widgets = {"body": CKEditorUploadingWidget(config_name="default")} + + +class EventUpdateForm(forms.ModelForm): + class Meta: + model = Event + fields = [ + "title", + "status", + "event_start", + "event_end", + "event_place", + ] + + labels = { + "title": "Titel", + "event_start": "Start des Events", + "event_end": "Ende des Events", + "event_place": "Ort des Events", + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) # to get the self.fields set + self.fields["event_start"].required = True + self.fields["event_end"].required = False + + if "event_place" in self.fields: + self.fields["event_place"].required = True + + +class FetMeetingCreateForm(forms.ModelForm): + class Meta: + model = FetMeeting + fields = ["event_start", "event_end", "event_place"] + + labels = { + "event_start": "Start der Sitzung", + "event_end": "Ende der Sitzung", + "event_place": "Ort der Sitzung", + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) # to get the self.fields set + + self.fields["event_start"].required = True + self.fields["event_end"].required = False + + self.fields["event_place"].initial = "FET" + + +class FetMeetingUpdateForm(forms.ModelForm): + class Meta: + model = FetMeeting + fields = ["event_start", "event_end", "event_place"] + + labels = { + "event_start": "Start der Sitzung", + "event_end": "Ende der Sitzung", + "event_place": "Ort der Sitzung", + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) # to get the self.fields set + + self.fields["event_start"].required = True + self.fields["event_end"].required = False + + self.fields["event_place"].initial = "FET" diff --git a/fet2020/posts/models.py b/fet2020/posts/models.py index 08c71564..4b10ee29 100644 --- a/fet2020/posts/models.py +++ b/fet2020/posts/models.py @@ -138,7 +138,7 @@ class Post(models.Model): ) def get_absolute_url(self): - return reverse("posts:show", kwargs={"id": self.slug}) + return reverse("posts:post-detail", kwargs={"slug": self.slug}) def save(self, *args, **kwargs): # save the post with some defaults @@ -150,13 +150,6 @@ class Post(models.Model): super().save(*args, **kwargs) - self.tags.set( - [ - *re.findall(r"\#([\d\w-]+)", str(self.subtitle)), - *re.findall(r"\#([\d\w-]+)", str(self.title)), - ] - ) - @property def agenda_html(self): "Agenda HTML from Etherpad Pad" diff --git a/fet2020/posts/urls.py b/fet2020/posts/urls.py index 79515e53..5a5a95d7 100644 --- a/fet2020/posts/urls.py +++ b/fet2020/posts/urls.py @@ -10,7 +10,13 @@ urlpatterns = [ path("", views.index, name="index"), # fet calendar (path have to be ahead show) path("fet_calendar.ics", views.calendar, name="calendar"), - path("", views.show, name="show"), + path( + "fetmeeting-create/", + views.FetMeetingCreateView.as_view(), + name="fetmeeting-create", + ), + path("/", views.PostDetailView.as_view(), name="post-detail"), + path("/update/", views.PostUpdateView.as_view(), name="post-update"), re_path( r"^(?P[-\w]+)/agenda.pdf$", views.show_pdf_agenda, diff --git a/fet2020/posts/views.py b/fet2020/posts/views.py index 83f5a37d..1cbf2868 100644 --- a/fet2020/posts/views.py +++ b/fet2020/posts/views.py @@ -1,16 +1,26 @@ import logging from django.conf import settings +from django.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpResponse, Http404 from django.shortcuts import render from django.template.loader import render_to_string from django.utils import timezone +from django.views.generic.edit import CreateView, UpdateView +from django.views.generic.detail import DetailView from authentications.decorators import authenticated_user from documents.etherpadlib import add_ep_cookie +from fet2020.utils import add_log_action from members.models import Member -from .forms import PostSearchForm -from .models import Event, FileUpload, Post +from .forms import ( + EventUpdateForm, + FetMeetingCreateForm, + FetMeetingUpdateForm, + NewsUpdateForm, + PostSearchForm, +) +from .models import Event, FetMeeting, FileUpload, Post from .utils import render_to_pdf @@ -88,62 +98,197 @@ def tags(request, tag=""): return render(request, "posts/tag.html", context) -def __get_post_object(id=None, public=True): - post = None +class PostDetailView(DetailView): + model = Post - try: - if id.isdigit() or id is int: - post = Post.objects.published(public).get(id=int(id)) - elif id != "" and id is not None: - post = Post.objects.published(public).get(slug=id) - except Exception: - logger.info("Wrong id '{}'".format(id)) - raise Http404("wrong post id") + def get(self, request, *args, **kwargs): + response = super().get(request, *args, **kwargs) - return post + # check if etherpad server works + if self.object.agenda_link or self.object.protocol_link: + try: + response = add_ep_cookie(request, response) + except Exception as e: + logger.info("Etherpad Server doesn't work. Error: %s", e) + + return response + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + + # files + files = FileUpload.objects.filter(post=self.object) + + # author + author = None + author_image = None + post_author = Member.all_members.filter(username=self.object.author).first() + if post_author: + author = post_author + author_image = post_author.image["avatar"].url + + related_posts = self.object.tags.similar_objects() + # list of non 'is_hidden' posts for related_posts + for obj in related_posts: + if not obj.published: + related_posts.remove(obj) + + context = { + "post": self.object, + "files": files, + "author": author, + "author_image": author_image, + "next": self.post_next(), + "previous": self.post_previous(), + "related_posts": related_posts[:4], + } + + return context + + def get_queryset(self): + self.public_only = not self.request.user.is_authenticated + return Post.objects.published(self.public_only) + + def get_template_names(self): + template_name = "posts/news/detail.html" + if self.object.post_type == "E": + template_name = "posts/event/detail.html" + elif self.object.post_type == "F": + template_name = "posts/fetmeeting/detail.html" + + return template_name + + def post_next(self): + """ + Helper function for getting next post + """ + posts = Post.objects.date_sorted_list(self.public_only).filter( + post_type=self.object.post_type + ) + qs = posts.filter(date__lt=self.object.date) + if not qs: + qs = posts[:1] + + return qs.first().slug + + def post_previous(self): + """ + Helper function for getting previous post + """ + posts = ( + Post.objects.date_sorted_list(self.public_only) + .filter(post_type=self.object.post_type) + .reverse() + ) + qs = posts.filter(date__gt=self.object.date) + if not qs: + qs = posts[:1] + + return qs.first().slug -def show(request, id=None): - public_only = not request.user.is_authenticated - post = __get_post_object(id, public_only) +class PostUpdateView(LoginRequiredMixin, UpdateView): + model = Post - # files - files = FileUpload.objects.filter(post=post) + def form_valid(self, form): + model = "news" + if self.object.post_type == "E": + model = "event" + elif self.object.post_type == "F": + model = "fetmeeting" + add_log_action(self.request, form, "posts", model, False) - # author - author = None - author_image = None - post_author = Member.all_members.filter(username=post.author).first() - if post_author: - author = post_author - author_image = post_author.image["avatar"].url + return super().form_valid(form) - related_posts = post.tags.similar_objects() - # list of non 'is_hidden' posts for related_posts - for obj in related_posts: - if not obj.published: - related_posts.remove(obj) + def get_form_class(self): + form_class = NewsUpdateForm + if self.object.post_type == "E": + form_class = EventUpdateForm + elif self.object.post_type == "F": + form_class = FetMeetingUpdateForm - context = { - "post": post, - "files": files, - "author": author, - "author_image": author_image, - "next": __next(post, public_only), - "previous": __previous(post, public_only), - "related_posts": related_posts[:4], - } + return form_class - response = render(request, "posts/show.html", context) + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() - # check if etherpad server works - if post.agenda_link or post.protocol_link: try: - response = add_ep_cookie(request, response) - except Exception as e: - logger.info("Etherpad Server doesn't work. Error: %s", e) + q = kwargs["data"] - return response + _mutable = q._mutable + q._mutable = True + + event_start_0 = q.pop("event_start_0")[0] + event_start_1 = q.pop("event_start_1")[0] + q.update({"event_start": f"{event_start_0} {event_start_1}"}) + + event_end_0 = q.pop("event_end_0")[0] + event_end_1 = q.pop("event_end_1")[0] + q.update({"event_end": f"{event_end_0} {event_end_1}"}) + + q._mutable = _mutable + except Exception as e: + pass + + return kwargs + + def get_template_names(self): + template_name = "posts/news/update.html" + if self.object.post_type == "E": + template_name = "posts/event/update.html" + elif self.object.post_type == "F": + template_name = "posts/fetmeeting/update.html" + + return template_name + + +class FetMeetingCreateView(LoginRequiredMixin, CreateView): + model = FetMeeting + template_name = "posts/fetmeeting/create.html" + form_class = FetMeetingCreateForm + + def form_valid(self, form): + form.instance.author = self.request.user + add_log_action(self.request, form, "posts", "fetmeeting", True) + return super().form_valid(form) + + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + + try: + q = kwargs["data"] + + _mutable = q._mutable + q._mutable = True + + event_start_0 = q.pop("event_start_0")[0] + event_start_1 = q.pop("event_start_1")[0] + q.update({"event_start": f"{event_start_0} {event_start_1}"}) + + event_end_0 = q.pop("event_end_0")[0] + event_end_1 = q.pop("event_end_1")[0] + q.update({"event_end": f"{event_end_0} {event_end_1}"}) + + q._mutable = _mutable + except Exception as e: + pass + + return kwargs + + +def show_pdf_agenda(request, id): + post = Post.objects.published(True).get(slug=id) + html = post.agenda_html + + return show_pdf(request, html, post.slug + "-agenda") + + +@authenticated_user +def show_pdf_protocol(request, id): + post = Post.objects.published(True).get(slug=id) + html = post.protocol_html + + return show_pdf(request, html, post.slug + "-protokoll") def show_pdf(request, html, filename): @@ -170,62 +315,3 @@ def show_pdf(request, html, filename): response["Content-Disposition"] = content return response - - -def show_pdf_agenda(request, id): - post = __get_post_object(id) - html = post.agenda_html - - return show_pdf(request, html, post.slug + "-agenda") - - -@authenticated_user -def show_pdf_protocol(request, id): - post = __get_post_object(id) - html = post.protocol_html - - return show_pdf(request, html, post.slug + "-protokoll") - - -def __next(post=None, public=True): - """ - Helper function for getting next post - """ - posts = None - d = post.slug - - if post: - posts = Post.objects.date_sorted_list(public).filter(post_type=post.post_type) - - if posts: - for k, v in enumerate(posts): - if post.slug == v.slug: - if (k + 1) < len(posts): - d = posts[k + 1].slug - else: - d = posts[0].slug - break - - return d - - -def __previous(post=None, public=True): - """ - Helper function for getting previous post - """ - posts = None - d = post.slug - - if post: - posts = Post.objects.date_sorted_list(public).filter(post_type=post.post_type) - - if posts: - for k, v in enumerate(posts): - if post.slug == v.slug: - if k < 1: - d = posts[len(posts) - 1].slug - else: - d = posts[k - 1].slug - break - - return d diff --git a/fet2020/templates/baseform/body.html b/fet2020/templates/baseform/body.html new file mode 100644 index 00000000..7f4c54db --- /dev/null +++ b/fet2020/templates/baseform/body.html @@ -0,0 +1,10 @@ + diff --git a/fet2020/templates/baseform/date_time.html b/fet2020/templates/baseform/date_time.html new file mode 100644 index 00000000..1784820e --- /dev/null +++ b/fet2020/templates/baseform/date_time.html @@ -0,0 +1,13 @@ + diff --git a/fet2020/templates/baseform/non_field_errors.html b/fet2020/templates/baseform/non_field_errors.html new file mode 100644 index 00000000..2be22411 --- /dev/null +++ b/fet2020/templates/baseform/non_field_errors.html @@ -0,0 +1,7 @@ +{% if form.non_field_errors %} +
+ +

Fehler:

+
{{ form.non_field_errors }}
+
+{% endif %} diff --git a/fet2020/templates/baseform/select.html b/fet2020/templates/baseform/select.html new file mode 100644 index 00000000..df69e7bf --- /dev/null +++ b/fet2020/templates/baseform/select.html @@ -0,0 +1,13 @@ + diff --git a/fet2020/templates/baseform/text.html b/fet2020/templates/baseform/text.html new file mode 100644 index 00000000..cbfac2ef --- /dev/null +++ b/fet2020/templates/baseform/text.html @@ -0,0 +1,12 @@ + diff --git a/fet2020/templates/posts/event/detail.html b/fet2020/templates/posts/event/detail.html new file mode 100644 index 00000000..d4739670 --- /dev/null +++ b/fet2020/templates/posts/event/detail.html @@ -0,0 +1,107 @@ +{% extends 'posts/show.html' %} + +{% load post_helpers %} + +{% block title %}{{ post.title }}{% endblock %} + +{% block prev_text_big %}Vorheriges
Event{% endblock %} +{% block next_text_big %}Nächstes
Event{% endblock %} + +{% block prev_text %}Vorheriges Event{% endblock %} +{% block next_text %}Nächstes Event{% endblock %} + +{% block update_button_desktop %} + {% if request.user.is_authenticated %} + + {% endif %} +{% endblock %} + +{% block event_details_desktop %} + + +{% endblock %} + +{% block post_body %} + {% if post.body %} + {{ post.body|safe|tags_to_url }} + {% endif %} +{% endblock %} + +{% block event_details_mobile %} +
+
+

Termindetails:

+
    +
  • Start: {{ post.event_start|date }} um {{ post.event_start|time }} Uhr
  • +
  • Ende: {{ post.event_end|date }} um {{ post.event_end|time }} Uhr
  • + {% if post.event_place %} +
  • Ort: {{ post.event_place }}
  • + {% endif %} +
+
+{% endblock %} + +{% block files_buttons %} + {% for file in files %} +
+ {{ file.title }} +
+ + +
+
+ {% endfor %} +{% endblock %} + +{% block update_button_mobile %} + {% if request.user.is_authenticated %} + + Event bearbeiten + + {% endif %} +{% endblock %} diff --git a/fet2020/templates/posts/event/update.html b/fet2020/templates/posts/event/update.html new file mode 100644 index 00000000..6802f015 --- /dev/null +++ b/fet2020/templates/posts/event/update.html @@ -0,0 +1,30 @@ +{% extends 'base.html' %} + +{% load static %} + +{% block title %}{{ object.title }} bearbeiten{% endblock %} + +{% block content %} + +
+

{{ object.title }} von {{ object.date }} bearbeiten

+
+
+ {% csrf_token %} + + {% include "baseform/non_field_errors.html" %} + + {% include "baseform/text.html" with field=form.title %} + {% include "baseform/select.html" with field=form.status %} + {% include "baseform/date_time.html" with field=form.event_start %} + {% include "baseform/date_time.html" with field=form.event_end %} + {% include "baseform/text.html" with field=form.event_place %} + + +
+
+
+{% endblock %} diff --git a/fet2020/templates/posts/fetmeeting/create.html b/fet2020/templates/posts/fetmeeting/create.html new file mode 100644 index 00000000..c1785fa1 --- /dev/null +++ b/fet2020/templates/posts/fetmeeting/create.html @@ -0,0 +1,27 @@ +{% extends 'base.html' %} + +{% load static %} + +{% block title %}Fachschaftssitzung erstellen{% endblock %} + +{% block content %} + +
+

Fachschaftssitzung erstellen

+
+
+ {% csrf_token %} + + {% include "baseform/non_field_errors.html" %} + + {% include "baseform/date_time.html" with field=form.event_start %} + {% include "baseform/date_time.html" with field=form.event_end %} + {% include "baseform/text.html" with field=form.event_place %} + +
+ +
+
+
+
+{% endblock %} diff --git a/fet2020/templates/posts/fetmeeting/detail.html b/fet2020/templates/posts/fetmeeting/detail.html new file mode 100644 index 00000000..ac6a759e --- /dev/null +++ b/fet2020/templates/posts/fetmeeting/detail.html @@ -0,0 +1,222 @@ +{% extends 'posts/show.html' %} + +{% load flatpages %} + +{% block title %}{{ post.title }} vom {{ post.event_start|date }}{% endblock %} + +{% block prev_text_big %}Vorherige
Sitzung{% endblock %} +{% block next_text_big %}Nächste
Sitzung{% endblock %} + +{% block prev_text %}Vorherige Sitzung{% endblock %} +{% block next_text %}Nächste Sitzung{% endblock %} + +{% block update_button_desktop %} + {% if request.user.is_authenticated %} + + {% endif %} +{% endblock %} + +{% block event_details_desktop %} + + +{% endblock %} + +{% block post_body %} + {% if post.has_agenda %} +

Agenda

+ {{ post.agenda_html|safe }} + {% endif %} + + {% if request.user.is_authenticated and post.has_protocol %} +
+

Protokoll

+ {{ post.protocol_html|safe }} + {% endif %} +{% endblock %} + +{% block event_details_mobile %} +
+
+

Termindetails:

+
    +
  • Start: {{ post.event_start|date }} um {{ post.event_start|time }} Uhr
  • +
  • Ende: {{ post.event_end|date }} um {{ post.event_end|time }} Uhr
  • + {% if post.event_place %} +
  • Ort: {{ post.event_place }}
  • + {% endif %} +
+
+{% endblock %} + +{% block docu_buttons %} + {% if request.user.is_authenticated %} + {% if post.has_agenda or post.has_protocol %} +
+

Dokument(e):

+ {% endif %} + + {% if post.has_agenda %} +
+ Agenda +
+ + +
+
+ {% endif %} + + {% if post.has_protocol %} +
+ Protokoll +
+ + +
+
+ {% endif %} + + {% get_flatpages '/bs/' for user as pages %} + {% if pages %} +
+ {{ pages.first.title }} +
+ + +
+
+ {% endif %} + {% endif %} +{% endblock %} + +{% block files_buttons %} + {% for file in files %} +
+ {{ file.title }} +
+ + +
+
+ {% endfor %} +{% endblock %} + +{% block update_button_mobile %} + {% if request.user.is_authenticated %} + + FET Sitzung bearbeiten + + {% endif %} +{% endblock %} diff --git a/fet2020/templates/posts/fetmeeting/update.html b/fet2020/templates/posts/fetmeeting/update.html new file mode 100644 index 00000000..86a06b0b --- /dev/null +++ b/fet2020/templates/posts/fetmeeting/update.html @@ -0,0 +1,28 @@ +{% extends 'base.html' %} + +{% load static %} + +{% block title %}{{ object.title }} bearbeiten{% endblock %} + +{% block content %} + +
+

{{ object.title }} von {{ object.date }} bearbeiten

+
+
+ {% csrf_token %} + + {% include "baseform/non_field_errors.html" %} + + {% include "baseform/date_time.html" with field=form.event_start %} + {% include "baseform/date_time.html" with field=form.event_end %} + {% include "baseform/text.html" with field=form.event_place %} + + +
+
+
+{% endblock %} diff --git a/fet2020/templates/posts/news/detail.html b/fet2020/templates/posts/news/detail.html new file mode 100644 index 00000000..784635fa --- /dev/null +++ b/fet2020/templates/posts/news/detail.html @@ -0,0 +1,62 @@ +{% extends 'posts/show.html' %} + +{% load post_helpers %} + +{% block title %}{{ post.title }}{% endblock %} + +{% block update_button_desktop %} + {% if request.user.is_authenticated %} + + {% endif %} +{% endblock %} + +{% block post_body %} + {% if post.body %} + {{ post.body|safe|tags_to_url }} + {% endif %} +{% endblock %} + +{% block files_buttons %} + {% if files %} +
+

Dokument(e):

+ + {% for file in files %} +
+ {{ file.title }} +
+ + +
+
+ {% endfor %} + {% endif %} +{% endblock %} + +{% block update_button_mobile %} + {% if request.user.is_authenticated %} + + Artikel bearbeiten + + {% endif %} +{% endblock %} diff --git a/fet2020/templates/posts/news/update.html b/fet2020/templates/posts/news/update.html new file mode 100644 index 00000000..17278113 --- /dev/null +++ b/fet2020/templates/posts/news/update.html @@ -0,0 +1,26 @@ +{% extends 'base.html' %} + +{% block title %}{{ object.title }} bearbeiten{% endblock %} + +{% block content %} + +
+

News '{{ object.title }}' bearbeiten

+
+
+ {% csrf_token %} + + {% include "baseform/non_field_errors.html" %} + + {% include "baseform/text.html" with field=form.title %} + {% include "baseform/select.html" with field=form.status %} + {% include "baseform/body.html" with field=form.body media=form.media %} + + +
+
+
+{% endblock %} diff --git a/fet2020/templates/posts/show.html b/fet2020/templates/posts/show.html index d3ff771a..3d8df990 100644 --- a/fet2020/templates/posts/show.html +++ b/fet2020/templates/posts/show.html @@ -1,10 +1,7 @@ {% extends 'base.html' %} -{% load flatpages %} {% load post_helpers %} -{% block title %}News{% endblock %} - {% block extraheader %} @@ -15,37 +12,37 @@ {% block content %}
- - +
@@ -54,297 +51,72 @@
  • #{{ t }}
  • {% endfor %} -

    {{ post.title|tags_to_url }}

    +

    {{ post.title }}

    -
    - {% if author_image and author %} -
    {{ author.firstname }} am {{ post.date|date:"d. F Y" }}
    - {% elif post.author %} -
    {{ post.author|capfirst }} am {{ post.date|date:"d. F Y" }}
    - {% else %} -
    fet.at Redaktion am {{ post.date|date:"d. F Y" }}
    - {% endif %} -
    - {% if request.user.is_authenticated %} - {% if post.post_type == 'N' %} - - {% elif post.post_type == 'E' %} - - {% elif post.post_type == 'F' %} - - {% endif %} - {% endif %} + {% block update_button_desktop %} + {% endblock %}
    -
    - {% if post.post_type != 'N' %} - - - {% endif %} + {% block event_details_desktop %} + {% endblock %}
    -
    - {% if post.has_agenda %} -

    Agenda

    - {{ post.agenda_html|safe }} - {% elif post.body %} - {{ post.body|safe|tags_to_url }} - {% endif %} - - {% if request.user.is_authenticated and post.has_protocol %} -
    -

    Protokoll

    - {{ post.protocol_html|safe }} - {% endif %} + {% block post_body %} + {% endblock %}
    - {% if post.post_type != 'N' %} -
    -
    -

    Termindetails:

    -
      -
    • Start: {{ post.event_start|date }} um {{ post.event_start|time }} Uhr
    • -
    • Ende: {{ post.event_end|date }} um {{ post.event_end|time }} Uhr
    • - {% if post.event_place %} -
    • Ort: {{ post.event_place }}
    • - {% endif %} -
    -
    - {% endif %} + {% block event_details_mobile %} + {% endblock %} - {% if post.has_agenda or post.has_protocol %} - {% if request.user.is_authenticated %} -
    -

    Dokument(e):

    - {% endif %} - {% elif files %} -
    -

    Dokument(e):

    - {% endif %} + {% block docu_buttons %} + {% endblock %} - {% if request.user.is_authenticated %} - {% if post.has_agenda %} -
    - Agenda -
    - - -
    -
    - {% endif %} - - {% if post.has_protocol %} -
    - Protokoll -
    - - -
    -
    - {% endif %} - - {% if post.post_type == 'F' %} - {% get_flatpages '/bs/' for user as pages %} - {% if pages %} -
    - {{ pages.first.title }} -
    - - -
    -
    - {% endif %} - {% endif %} - {% endif %} - - {% for file in files %} -
    - {{ file.title }} -
    - - -
    -
    - {% endfor %} + {% block files_buttons %} + {% endblock %}
    - {% if request.user.is_authenticated %} - {% if post.post_type == 'N' %} - - Artikel bearbeiten - - {% elif post.post_type == 'E' %} - - Event bearbeiten - - {% elif post.post_type == 'F' %} - - FET Sitzung bearbeiten - - {% endif %} - {% endif %} + {% block update_button_mobile %} + {% endblock %}
    {% if related_posts %}