coding style

This commit is contained in:
2021-12-06 15:10:47 +00:00
parent 61622b8eae
commit e3c12f1323
8 changed files with 148 additions and 141 deletions

View File

@@ -1,10 +1,9 @@
from django.contrib import admin, messages from django.contrib import admin, messages
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from .models import Post, Event, News, FetMeeting, FileUpload
from .forms import PostForm, EventForm, NewsForm, FetMeetingForm
from documents.api import create_pad from documents.api import create_pad
from .forms import EventForm, FetMeetingForm, NewsForm, PostForm
from .models import Event, FetMeeting, FileUpload, News, Post
def make_fetmeeting(self, request, queryset): def make_fetmeeting(self, request, queryset):

View File

@@ -1,9 +1,10 @@
from ckeditor_uploader.widgets import CKEditorUploadingWidget from ckeditor_uploader.widgets import CKEditorUploadingWidget
from taggit.models import Tag
from django import forms from django import forms
from django.utils import timezone from django.utils import timezone
from django.utils.dates import MONTHS from django.utils.dates import MONTHS
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from taggit.models import Tag
from .models import Post, Event, News, FetMeeting from .models import Post, Event, News, FetMeeting

View File

@@ -1,7 +1,9 @@
import re
import logging import logging
import re
from datetime import timedelta from datetime import timedelta
from taggit.managers import TaggableManager
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.validators import ValidationError from django.core.validators import ValidationError
from django.db import models from django.db import models
@@ -10,7 +12,6 @@ from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.utils.text import slugify from django.utils.text import slugify
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from taggit.managers import TaggableManager
from core.models import CustomFlatPage from core.models import CustomFlatPage
from documents import create_pad, get_pad_html, set_pad_html from documents import create_pad, get_pad_html, set_pad_html
@@ -118,9 +119,35 @@ class Post(models.Model):
objects = PostManager() objects = PostManager()
articles = ArticleManager() articles = ArticleManager()
def get_tags(self): def __str__(self):
"""Returns assigned tags as a comma seperated list.""" return "Post (%s, %s): %s" % (
return ",".join(self.tags.names()) self.slug,
self.public_date.strftime("%d.%m.%Y"),
self.title,
)
@property
def url(self):
# TODO: replace with get_absolute_url
return reverse("posts:posts.show", kwargs={"id": self.slug})
def get_absolute_url(self):
return self.url
def save(self, *args, **kwargs):
# save the post with some defaults
if not self.public_date:
self.public_date = timezone.now().date()
if not self.slug:
self.slug = slugify(self.public_date) + "-" + slugify(self.title)
super().save(*args, **kwargs)
self.tags.set(
*re.findall(r"\#([\d\w-]+)", str(self.subtitle)),
*re.findall(r"\#([\d\w-]+)", str(self.title)),
)
@property @property
def agenda_html(self): def agenda_html(self):
@@ -147,9 +174,7 @@ class Post(models.Model):
set_pad_html(self.agenda_key, value) set_pad_html(self.agenda_key, value)
request_logger.info( request_logger.info(f"set etherpad for post {self.slug} id: {self.agenda_key}")
"set etherpad! for post %s id: %s", self.slug, self.agenda_key
)
return value return value
@protocol_html.setter @protocol_html.setter
@@ -162,24 +187,34 @@ class Post(models.Model):
set_pad_html(self.protocol_key, value) set_pad_html(self.protocol_key, value)
request_logger.info( request_logger.info(
"set etherpad! for post %s id: %s", self.slug, self.protocol_key f"set etherpad for post {self.slug} id: {self.protocol_key}"
) )
return value return value
def get_agenda_key(self): def get_agenda_key(self):
"""Create a Etherpad Id for the Pad associated to this post. """
Creates the pad if it doesn't exist""" Create a Etherpad Id for the Pad associated to this post.
Create the pad if it doesn't exist.
"""
if not self.slug: if not self.slug:
return None return None
return create_pad_for_post(self.slug, "agenda") return create_pad_for_post(self.slug, "agenda")
def get_protocol_key(self): def get_protocol_key(self):
"""Create a Etherpad Id for the Pad associated to this post. """
Creates the pad if it doesn't exist""" Create a Etherpad Id for the Pad associated to this post.
Create the pad if it doesn't exist.
"""
if not self.slug: if not self.slug:
return None return None
return create_pad_for_post(self.slug, "protocol") return create_pad_for_post(self.slug, "protocol")
def get_tags(self):
"""
Returns assigned tags as a comma seperated list.
"""
return ",".join(self.tags.names())
@property @property
def get_tagnames(self): def get_tagnames(self):
return ["#%s" % t for t in self.tags.names()] return ["#%s" % t for t in self.tags.names()]
@@ -190,7 +225,9 @@ class Post(models.Model):
@property @property
def imageurl(self): def imageurl(self):
""" returns the url to the image""" """
returns the url to the image
"""
if self.image: if self.image:
return self.image.url return self.image.url
@@ -200,7 +237,9 @@ class Post(models.Model):
return "" return ""
def find_an_image(self): def find_an_image(self):
"find an image via another post" """
find an image via another post
"""
# TODO: Explain why this image is selected on save of the image # TODO: Explain why this image is selected on save of the image
# Query all posts that have a slug that equals one of the tags # Query all posts that have a slug that equals one of the tags
posts1 = ( posts1 = (
@@ -213,42 +252,15 @@ class Post(models.Model):
return None return None
@property
def url(self):
return reverse("posts:posts.show", kwargs={"id": self.slug})
def get_absolute_url(self):
return self.url
def clean(self): def clean(self):
if self.event_end and self.event_end < self.event_start: if self.event_end and self.event_end < self.event_start:
raise ValidationError(_("Das Ende des Events liegt vor dem Beginn.")) raise ValidationError(_("Das Ende des Events liegt vor dem Beginn."))
if self.event_start and self.post_type not in ["E", "F"]: if self.event_start and self.post_type not in ["E", "F"]:
raise ValidationError("Für diesen Post Typ ist kein Event Start zulässig") raise ValidationError(
_("Für diesen Post Typ ist kein Event Start zulässig")
)
super().clean() super().clean()
def save(self, *args, **kwargs):
# save the post with some defaults
if not self.public_date:
self.public_date = timezone.now().date()
if not self.slug:
self.slug = slugify(self.public_date) + "-" + slugify(self.title)
super().save(*args, **kwargs)
self.tags.set(
*re.findall(r"\#([\d\w-]+)", str(self.subtitle)),
*re.findall(r"\#([\d\w-]+)", str(self.title)),
)
def __str__(self):
return "Post (%s, %s): %s" % (
self.slug,
self.public_date.strftime("%d.%m.%Y"),
self.title,
)
class News(Post): class News(Post):
objects = NewsManager() objects = NewsManager()
@@ -270,21 +282,16 @@ class Event(Post):
only_events = EventManager() only_events = EventManager()
all_events = AllEventManager() all_events = AllEventManager()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.post_type = "E"
class Meta: class Meta:
proxy = True proxy = True
verbose_name = "Event" verbose_name = "Event"
verbose_name_plural = "Events" verbose_name_plural = "Events"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.post_type = "E"
def clean(self):
if not self.event_start:
raise ValidationError(_("Das Datum des Events fehlt."))
super().clean()
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.post_type: if not self.post_type:
self.post_type = "E" self.post_type = "E"
@@ -293,36 +300,25 @@ class Event(Post):
super().save(*args, **kwargs) super().save(*args, **kwargs)
def clean(self):
if not self.event_start:
raise ValidationError(_("Das Datum des Events fehlt."))
super().clean()
class FetMeeting(Event): class FetMeeting(Event):
objects = FetMeetingManager() objects = FetMeetingManager()
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.post_type = "F"
class Meta: class Meta:
proxy = True proxy = True
verbose_name = "Fet Sitzung" verbose_name = "Fet Sitzung"
verbose_name_plural = "Fet Sitzungen" verbose_name_plural = "Fet Sitzungen"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.post_type = "F"
def __get_slug(self):
slug = slugify(self.event_start.date()) + "-" + slugify("Fachschaftssitzung")
if Post.objects.filter(slug=slug).exists():
if Post.objects.get(slug=slug).id != self.id:
raise ValidationError(
_("Es existiert bereits eine Sitzung mit demselben Datum.")
)
return slug
def clean(self):
super().clean()
if not self.slug:
self.slug = self.__get_slug()
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.title = "Fachschaftssitzung" self.title = "Fachschaftssitzung"
if not self.slug: if not self.slug:
@@ -346,6 +342,22 @@ class FetMeeting(Event):
super().save(*args, **kwargs) super().save(*args, **kwargs)
def __get_slug(self):
slug = slugify(self.event_start.date()) + "-" + slugify("Fachschaftssitzung")
if Post.objects.filter(slug=slug).exists():
if Post.objects.get(slug=slug).id != self.id:
raise ValidationError(
_("Es existiert bereits eine Sitzung mit demselben Datum.")
)
return slug
def clean(self):
super().clean()
if not self.slug:
self.slug = self.__get_slug()
class FileUpload(models.Model): class FileUpload(models.Model):
title = models.CharField(verbose_name="Titel", max_length=200) title = models.CharField(verbose_name="Titel", max_length=200)

View File

@@ -1,7 +1,7 @@
from .models import Post
from rest_framework import serializers from rest_framework import serializers
from .models import Post
class PostSerializer(serializers.HyperlinkedModelSerializer): class PostSerializer(serializers.HyperlinkedModelSerializer):
agenda_html = serializers.CharField(required=False) agenda_html = serializers.CharField(required=False)

View File

@@ -3,8 +3,8 @@ from datetime import timedelta
from django.test import TestCase from django.test import TestCase
from django.utils import timezone from django.utils import timezone
from .models import Post
from .forms import PostForm from .forms import PostForm
from .models import Post
class PostTestCase(TestCase): class PostTestCase(TestCase):

View File

@@ -1,13 +1,14 @@
from django.urls import path, re_path from django.urls import path, re_path
from . import apps from . import apps
from . import views from . import views
from .utils import slug_calc, tag_complete
app_name = apps.PostsConfig.name app_name = apps.PostsConfig.name
urlpatterns = [ urlpatterns = [
path("func/tag_complete", views.tag_complete), path("func/tag_complete", tag_complete),
path("func/slug_calc", views.slug_calc), path("func/slug_calc", slug_calc),
path("t/<str:tag>", views.tags, name="posts.tags"), path("t/<str:tag>", views.tags, name="posts.tags"),
path("", views.index, name="posts.index"), path("", views.index, name="posts.index"),
path("fet_calendar.ics", views.calendar, name="posts.calendar"), path("fet_calendar.ics", views.calendar, name="posts.calendar"),

View File

@@ -1,7 +1,12 @@
from django.http import HttpResponse
from io import BytesIO from io import BytesIO
from taggit.models import Tag
from xhtml2pdf import pisa from xhtml2pdf import pisa
from django.http import HttpResponse, JsonResponse, HttpResponseServerError
from django.utils import timezone
from django.utils.text import slugify
def render_to_pdf(html): def render_to_pdf(html):
src = BytesIO(html.encode("ISO-8859-1")) src = BytesIO(html.encode("ISO-8859-1"))
@@ -13,3 +18,40 @@ def render_to_pdf(html):
return HttpResponse(dest.getvalue(), content_type="application/pdf") return HttpResponse(dest.getvalue(), content_type="application/pdf")
return None return None
def slug_calc(request):
"""
Ajax function that is called to calculate a slug from the title
"""
if request.method == "GET":
get = request.GET.copy()
title = get["title"]
slug_str = get["slug"]
if not slug_str:
date_str = timezone.now().strftime("%Y-%m-%d")
slug_str = slugify(date_str) + "-" + slugify(title)
return HttpResponse(slug_str)
return HttpResponseServerError("Requires a title field.")
def tag_complete(request):
"""
Ajax function that returns autocomplete suggestions for a given tag input
"""
if request.method == "GET":
get = request.GET.copy()
term = get["term"]
tag_objects = Tag.objects.filter(name__istartswith=term)
tag_array = []
for elem in tag_objects:
tag_array.append(elem.name)
return JsonResponse(tag_array, safe=False)
return HttpResponseServerError("Requires a term field.")

View File

@@ -1,20 +1,18 @@
import logging import logging
from collections import deque from collections import deque
from taggit.models import Tag
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.http import HttpResponse, JsonResponse, HttpResponseServerError, Http404 from django.http import HttpResponse, Http404
from django.shortcuts import render from django.shortcuts import render
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.utils import timezone
from django.utils.text import slugify
from taggit.models import Tag
from authentications.decorators import authenticated_user from authentications.decorators import authenticated_user
from documents.api import get_pad_link from documents.api import get_pad_link
from documents.etherpadlib import add_ep_cookie from documents.etherpadlib import add_ep_cookie
from members.models import Member, JobMember from members.models import Member, JobMember
from .forms import PostSearchForm from .forms import PostSearchForm
from .models import Post, FetMeeting, FileUpload from .models import Post, FetMeeting, FileUpload
from .utils import render_to_pdf from .utils import render_to_pdf
@@ -23,11 +21,6 @@ from .utils import render_to_pdf
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
##################
# RENDERED VIEWS #
##################
def index(request): def index(request):
posts = None posts = None
taglist = None taglist = None
@@ -175,7 +168,7 @@ def show(request, id=None):
"files": files, "files": files,
"author": author, "author": author,
"author_image": author_image, "author_image": author_image,
"next": get_next_dict(p), "next": __get_next_dict(p),
"related_posts": related_posts[0:6], "related_posts": related_posts[0:6],
"ep_agenda_link": ep_agenda_link, "ep_agenda_link": ep_agenda_link,
"ep_protocol_link": ep_protocol_link, "ep_protocol_link": ep_protocol_link,
@@ -236,51 +229,10 @@ def show_pdf_protocol(request, id):
return show_pdf(request, html, p.slug + "-protokoll") return show_pdf(request, html, p.slug + "-protokoll")
########### def __get_next_dict(post=None):
# HELPERS #
###########
def slug_calc(request):
""" """
Ajax function that is called to calculate a slug from the title Helper function for getting next post
""" """
if request.method == "GET":
get = request.GET.copy()
title = get["title"]
slug_str = get["slug"]
if not slug_str:
datetime_now = timezone.now()
date_str = datetime_now.strftime("%Y-%m-%d")
slug_str = slugify(date_str) + "-" + slugify(title)
return HttpResponse(slug_str)
return HttpResponseServerError("Requires a title field.")
def tag_complete(request):
"""
Ajax function that returns autocomplete suggestions for a given tag input
"""
if request.method == "GET":
get = request.GET.copy()
term = get["term"]
tag_objects = Tag.objects.filter(name__istartswith=term)
tag_array = []
for elem in tag_objects:
tag_array.append(elem.name)
return JsonResponse(tag_array, safe=False)
return HttpResponseServerError("Requires a term field.")
def get_next_dict(post=None):
# TODO: Docstring # TODO: Docstring
posts = None posts = None
d = post.slug d = post.slug