replace if-cases to annotate

This commit is contained in:
2022-01-17 09:37:06 +00:00
parent e128996cb7
commit 91e6341acf
7 changed files with 65 additions and 87 deletions

View File

@@ -1,5 +1,5 @@
from django.db import models from django.db import models
from django.db.models import Q, Manager from django.db.models import Case, Manager, Q, When
from django.utils import timezone from django.utils import timezone
from datetime import timedelta from datetime import timedelta
@@ -29,20 +29,18 @@ class PublishedManager(Manager):
class PostManager(PublishedManager, Manager): class PostManager(PublishedManager, Manager):
def get_queryset(self): def get_queryset(self):
return super().get_queryset().order_by("-public_date") qs = super().get_queryset()
qs = qs.annotate(
date=Case(
When(post_type="N", then="public_date"),
When(post_type="E", then="event_start__date"),
When(post_type="F", then="event_start__date"),
)
)
return qs.order_by("-date")
def date_sorted_list(self, public=True): def date_sorted_list(self, public=True):
post_list = [] return self.published(public)
for post in self.published(public):
if post.post_type != "N":
post_list.append((post, post.event_start.date()))
else:
post_list.append((post, post.public_date))
result = sorted(post_list, key=lambda x: x[1], reverse=True)
posts = [x[0] for x in result]
return posts
def date_filtered_list( def date_filtered_list(
self, self,
@@ -51,37 +49,17 @@ class PostManager(PublishedManager, Manager):
month=None, month=None,
fet_meeting_only=None, fet_meeting_only=None,
): ):
post_list = [] qs_filter = Q()
qs = self.published(public)
if not fet_meeting_only: if fet_meeting_only:
posts = qs.filter(~Q(post_type="N")) qs_filter &= Q(post_type="F")
else:
posts = qs.filter(post_type="F")
if year: if year:
posts = posts.filter(event_start__year=year) qs_filter &= Q(date__year=year)
if month: if month:
posts = posts.filter(event_start__month=month) qs_filter &= Q(date__month=month)
for post in posts: return self.published(public).filter(qs_filter)
post_list.append((post, post.event_start.date()))
if not fet_meeting_only:
posts = qs.filter(post_type="N")
if year:
posts = posts.filter(public_date__year=year)
if month:
posts = posts.filter(public_date__month=month)
for post in posts:
post_list.append((post, post.public_date))
result = sorted(post_list, key=lambda x: x[1], reverse=True)
posts = [x[0] for x in result]
return posts
# use for finding tags at homepage - TODO: delete when new design published # use for finding tags at homepage - TODO: delete when new design published
def get_last_months_posts(self, public=True): def get_last_months_posts(self, public=True):
@@ -96,22 +74,19 @@ class ArticleManager(PublishedManager, Manager):
Provide a query set only for "Article" Provide a query set only for "Article"
regular fet meetings should not be contained in the news stream regular fet meetings should not be contained in the news stream
""" """
def get_queryset(self): def get_queryset(self):
qs = super().get_queryset().filter(Q(post_type="E") | Q(post_type="N")) qs = super().get_queryset().filter(Q(post_type="N") | Q(post_type="E"))
return qs.order_by("-public_date") qs = qs.annotate(
date=Case(
When(post_type="N", then="public_date"),
When(post_type="E", then="event_start__date"),
)
)
return qs.order_by("-date")
def date_sorted_list(self, public=True): def date_sorted_list(self, public=True):
post_list = [] return self.published(public)
for post in self.published(public):
if post.post_type != "N":
post_list.append((post, post.event_start.date()))
else:
post_list.append((post, post.public_date))
result = sorted(post_list, key=lambda x: x[1], reverse=True)
posts = [x[0] for x in result]
return posts
def pinned(self, public=True): def pinned(self, public=True):
return self.published(public).filter(is_pinned=True).first() return self.published(public).filter(is_pinned=True).first()
@@ -121,21 +96,31 @@ class NewsManager(PublishedManager, Manager):
""" """
Provide a query set only for "News" Provide a query set only for "News"
""" """
def get_queryset(self): def get_queryset(self):
return super().get_queryset().filter(post_type="N").order_by("-public_date") qs = super().get_queryset().filter(post_type="N")
qs = qs.annotate(
date=Case(
When(post_type="N", then="public_date"),
)
)
return qs.order_by("-date")
class AllEventManager(PublishedManager, Manager): class AllEventManager(PublishedManager, Manager):
""" """
Provide a query set for all events ("Event" and "Fet Meeting") Provide a query set for all events ("Event" and "Fet Meeting")
""" """
def get_queryset(self): def get_queryset(self):
return ( qs = super().get_queryset().filter(Q(post_type="E") | Q(post_type="F"))
super() qs = qs.annotate(
.get_queryset() date=Case(
.filter(Q(post_type="E") | Q(post_type="F")) When(post_type="E", then="event_start__date"),
.order_by("-event_start") When(post_type="F", then="event_start__date"),
)
) )
return qs.order_by("-date")
def future_events(self, public=True): def future_events(self, public=True):
date_today = timezone.now() date_today = timezone.now()
@@ -148,8 +133,15 @@ class EventManager(PublishedManager, Manager):
Provide a query set only for "Events" Provide a query set only for "Events"
regular fet meetings should not be contained in the news stream regular fet meetings should not be contained in the news stream
""" """
def get_queryset(self): def get_queryset(self):
return super().get_queryset().filter(post_type="E").order_by("-event_start") qs = super().get_queryset().filter(post_type="E")
qs = qs.annotate(
date=Case(
When(post_type="E", then="event_start__date"),
)
)
return qs.order_by("-date")
def future_events(self, public=True): def future_events(self, public=True):
date_today = timezone.now() date_today = timezone.now()
@@ -166,8 +158,15 @@ class FetMeetingManager(PublishedManager, Manager):
""" """
Provide a query set only for "Fet Meeting" Provide a query set only for "Fet Meeting"
""" """
def get_queryset(self): def get_queryset(self):
return super().get_queryset().filter(post_type="F").order_by("-event_start") qs = super().get_queryset().filter(post_type="F")
qs = qs.annotate(
date=Case(
When(post_type="F", then="event_start__date"),
)
)
return qs.order_by("-date")
def future_events(self): def future_events(self):
date_today = timezone.now() date_today = timezone.now()

View File

@@ -250,11 +250,7 @@ def __next(post=None, public=True):
d = post.slug d = post.slug
if post: if post:
# TODO: bad implementation but it works!! posts = Post.objects.date_sorted_list(public).filter(post_type=post.post_type)
if post.post_type == "N" or post.post_type == "E":
posts = Post.articles.date_sorted_list(public)
elif post.post_type == "F":
posts = FetMeeting.objects.published(public)
if posts: if posts:
for k, v in enumerate(posts): for k, v in enumerate(posts):

View File

@@ -12,11 +12,7 @@
<div class="news-hero-text"> <div class="news-hero-text">
<hr> <hr>
<div class="article-date"> <div class="article-date">
{% if post.post_type != 'N' %} <p>{{ post.date|date:"d. F Y" }}</p>
<p>{{ post.event_start|date:"d. F Y" }}</p>
{% else %}
<p>{{ post.public_date|date:"d. F Y" }}</p>
{% endif %}
</div> </div>
<div class="article-title"> <div class="article-title">
<h1>{{ post.title|safe }}</h1> <h1>{{ post.title|safe }}</h1>

View File

@@ -3,12 +3,7 @@
<div class="news-hero-text"> <div class="news-hero-text">
<h1>{{ post.title | safe }}</h1> <h1>{{ post.title | safe }}</h1>
<h2>{{ post.subtitle|default_if_none:"&nbsp;" }}</h2> <h2>{{ post.subtitle|default_if_none:"&nbsp;" }}</h2>
<p>{{ post.date|date:"d. F Y" }}</p>
{% if post.post_type != 'N' %}
<p>{{ post.event_start|date:"d. F Y" }}</p>
{% else %}
<p>{{ post.public_date|date:"d. F Y" }}</p>
{% endif %}
</div> </div>
</div> </div>
</a> </a>

View File

@@ -5,11 +5,7 @@
</div> </div>
<div class="news-hero-compact-right"> <div class="news-hero-compact-right">
{% if post.post_type != 'N' %} <p style="margin-bottom: 0rem;">{{ post.date|date:"d. F Y" }}</p>
<p style="margin-bottom: 0rem;">{{ post.event_start|date:"d. F Y" }}</p>
{% else %}
<p style="margin-bottom: 0rem;">{{ post.public_date|date:"d. F Y" }}</p>
{% endif %}
</div> </div>
</div> </div>
</a> </a>

View File

@@ -14,11 +14,7 @@
<div class="large-article-header-content"> <div class="large-article-header-content">
<div class="center-container"> <div class="center-container">
<div class="article-date"> <div class="article-date">
{% if post.post_type != 'N' %} <p>{{ post.date|date:"d. F Y" }}</p>
<p>{{ post.event_start|date:"d. F Y" }}</p>
{% else %}
<p>{{ post.public_date|date:"d. F Y" }}</p>
{% endif %}
</div> </div>
<div class="article-title"> <div class="article-title">

View File

@@ -7,7 +7,7 @@
<div class="large-article-header-content"> <div class="large-article-header-content">
<div class="center-container"> <div class="center-container">
<div class="article-date"> <div class="article-date">
<p>{{post.public_date}}</p> <p>{{post.date}}</p>
</div> </div>
<div class="article-title"> <div class="article-title">
<h1>{{post.title | tags_to_url }}</h1> <h1>{{post.title | tags_to_url }}</h1>