From 90d7eea59edb98f554a3cd09ad37c44b86d12b7b Mon Sep 17 00:00:00 2001 From: Patrick Mayr Date: Tue, 4 Oct 2022 16:16:25 +0000 Subject: [PATCH] init crazy experiment --- fet2020/posts/forms.py | 28 ++ fet2020/posts/models.py | 2 +- fet2020/posts/urls.py | 3 +- fet2020/posts/views.py | 209 +++++++----- fet2020/templates/posts/event_detail.html | 229 +++++++++++++ .../templates/posts/fet_meeting_detail.html | 315 ++++++++++++++++++ fet2020/templates/posts/news_update.html | 87 +++++ 7 files changed, 792 insertions(+), 81 deletions(-) create mode 100644 fet2020/templates/posts/event_detail.html create mode 100644 fet2020/templates/posts/fet_meeting_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..e0903f78 100644 --- a/fet2020/posts/forms.py +++ b/fet2020/posts/forms.py @@ -167,3 +167,31 @@ class PostSearchForm(forms.Form): self.fields["year"].choices = year_choices except: pass + + +class PostUpdateForm(forms.ModelForm): + class Meta: + model = Post + + fields = [ + "title", + "image", + "body", + "is_pinned", + "status", + ] + + labels = { + "title": "Titel", + "image": "Hintergrundbild", + "body": "Text", + "is_pinned": "Event anheften", + } + + widgets = {"body": CKEditorUploadingWidget(config_name="default")} + + def __init__(self, *args, **kwargs): + + super().__init__(*args, **kwargs) # to get the self.fields set + + diff --git a/fet2020/posts/models.py b/fet2020/posts/models.py index 08c71564..33373ea7 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:show", kwargs={"slug": self.slug}) def save(self, *args, **kwargs): # save the post with some defaults diff --git a/fet2020/posts/urls.py b/fet2020/posts/urls.py index 79515e53..00b05580 100644 --- a/fet2020/posts/urls.py +++ b/fet2020/posts/urls.py @@ -10,7 +10,8 @@ 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("", views.PostDetailView.as_view(), name="show"), + 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..16bf31ff 100644 --- a/fet2020/posts/views.py +++ b/fet2020/posts/views.py @@ -1,15 +1,19 @@ 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 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 .forms import PostSearchForm, PostUpdateForm from .models import Event, FileUpload, Post from .utils import render_to_pdf @@ -103,47 +107,138 @@ def __get_post_object(id=None, public=True): return post -def show(request, id=None): - public_only = not request.user.is_authenticated - post = __get_post_object(id, public_only) +def post_next(post=None, public=True): + """ + Helper function for getting next post + """ + posts = None + d = post.slug - # files - files = FileUpload.objects.filter(post=post) + if post: + posts = Post.objects.date_sorted_list(public).filter(post_type=post.post_type) - # 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 + 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 - 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) + return d - 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], - } - response = render(request, "posts/show.html", context) +def post_previous(post=None, public=True): + """ + Helper function for getting previous post + """ + posts = None + d = post.slug - # 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) + if post: + posts = Post.objects.date_sorted_list(public).filter(post_type=post.post_type) - return response + 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 + + +class PostUpdateView(LoginRequiredMixin, UpdateView): + model = Post + + def form_valid(self, form): + add_log_action(self.request, form, "posts", "post", False) + return super().form_valid(form) + + def get_form_class(self): + form_class = PostUpdateForm + if self.object.post_type == "E": + form_class = PostUpdateForm + elif self.object.post_type == "F": + form_class = PostUpdateForm + + return form_class + + def get_template_names(self): + template_name = "posts/news_update.html" + if self.object.post_type == "E": + template_name = "posts/news_update.html" + elif self.object.post_type == "F": + template_name = "posts/news_update.html" + + return template_name + + +class PostDetailView(DetailView): + model = Post + + def get(self, request, *args, **kwargs): + response = super().get(request, *args, **kwargs) + + # check if etherpad server works + if self.post.agenda_link or self.post.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) + + public_only = not self.request.user.is_authenticated + self.post = self.object + + # files + files = FileUpload.objects.filter(post=self.post) + + # author + author = None + author_image = None + post_author = Member.all_members.filter(username=self.post.author).first() + if post_author: + author = post_author + author_image = post_author.image["avatar"].url + + related_posts = self.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) + + context = { + "post": self.post, + "files": files, + "author": author, + "author_image": author_image, + "next": post_next(self.post, public_only), + "previous": post_previous(self.post, public_only), + "related_posts": related_posts[:4], + } + + return context + + def get_queryset(self): + public_only = not self.request.user.is_authenticated + return Post.objects.published(public_only) + + def get_template_names(self): + template_name = "posts/show.html" + if self.post.post_type == "E": + template_name = "posts/event_detail.html" + elif self.post.post_type == "F": + template_name = "posts/fet_meeting_detail.html" + + return template_name def show_pdf(request, html, filename): @@ -185,47 +280,3 @@ def show_pdf_protocol(request, 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/posts/event_detail.html b/fet2020/templates/posts/event_detail.html new file mode 100644 index 00000000..d4d24b1f --- /dev/null +++ b/fet2020/templates/posts/event_detail.html @@ -0,0 +1,229 @@ +{% extends 'base.html' %} + +{% load flatpages %} +{% load post_helpers %} + +{% block title %}{{ post.title }}{% endblock %} + +{% block extraheader %} + + + + +{% endblock %} + +{% block content %} + +
+ + +
+
+
    + {% for t in post.tag_names %} +
  • #{{ t }}
  • + {% endfor %} +
+

{{ post.title|tags_to_url }}

+
+ +
+ + {% 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 %} + + {% endif %} +
+
+ +
+ + +
+
+
+
+ +
+ + {{ post.body|safe|tags_to_url }} +
+
+
+

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 %} +
+
+ + {% if files %} +
+

Dokument(e):

+ {% endif %} + + {% for file in files %} +
+ {{ file.title }} +
+ + +
+
+ {% endfor %} + +
+ +
+ + {% if request.user.is_authenticated %} + + Event bearbeiten + + {% endif %} +
+ + {% if related_posts %} +
+

Weiterlesen

+
+ {% for post in related_posts %} + {% if forloop.counter0 == 2 %} + + {% elif forloop.last %} + + {% else %} + + {% include 'posts/partials/_posts_related.html' %} + + {% endif %} + {% endfor %} +
+
+ {% endif %} +
+{% endblock %} diff --git a/fet2020/templates/posts/fet_meeting_detail.html b/fet2020/templates/posts/fet_meeting_detail.html new file mode 100644 index 00000000..49884fe9 --- /dev/null +++ b/fet2020/templates/posts/fet_meeting_detail.html @@ -0,0 +1,315 @@ +{% extends 'base.html' %} + +{% load flatpages %} +{% load post_helpers %} + +{% block title %}{{ post.title }}{% endblock %} + +{% block extraheader %} + + + + +{% endblock %} + +{% block content %} + +
+ + +
+
+
    + {% for t in post.tag_names %} +
  • #{{ t }}
  • + {% endfor %} +
+

{{ post.title|tags_to_url }}

+
+ +
+ + {% 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 %} + + {% endif %} +
+
+ +
+ + +
+
+
+
+ +
+ + {% 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 %} +
+ +
+
+

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 %} +
+
+ + {% if post.has_agenda or post.has_protocol %} + {% if request.user.is_authenticated %} +
+

Dokument(e):

+ {% endif %} + {% endif %} + + {% if request.user.is_authenticated %} + {% 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 %} + +
+ +
+ + {% if request.user.is_authenticated %} + + Fachschaftssitzung bearbeiten + + {% endif %} +
+ + {% if related_posts %} +
+

Weiterlesen

+
+ {% for post in related_posts %} + {% if forloop.counter0 == 2 %} + + {% elif forloop.last %} + + {% else %} + + {% include 'posts/partials/_posts_related.html' %} + + {% endif %} + {% endfor %} +
+
+ {% endif %} +
+{% endblock %} diff --git a/fet2020/templates/posts/news_update.html b/fet2020/templates/posts/news_update.html new file mode 100644 index 00000000..5b4269b2 --- /dev/null +++ b/fet2020/templates/posts/news_update.html @@ -0,0 +1,87 @@ +{% extends 'base.html' %} + +{% block title %}{{ object.title }} bearbeiten{% endblock %} + +{% block content %} + +
+

News '{{ object.title }}' bearbeiten

+
+
+ {% csrf_token %} + + {% if form.non_field_errors %} +
+ +

Fehler:

+
{{ form.non_field_errors }}
+
+ {% endif %} + + + + + + + + + + + + +
+
+
+{% endblock %}