diff --git a/fet2020/posts/managers.py b/fet2020/posts/managers.py index ce5fd07f..da3aee03 100644 --- a/fet2020/posts/managers.py +++ b/fet2020/posts/managers.py @@ -1,5 +1,5 @@ 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 datetime import timedelta @@ -29,20 +29,18 @@ class PublishedManager(Manager): class PostManager(PublishedManager, Manager): 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): - post_list = [] - 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 + return self.published(public) def date_filtered_list( self, @@ -51,37 +49,17 @@ class PostManager(PublishedManager, Manager): month=None, fet_meeting_only=None, ): - post_list = [] - qs = self.published(public) + qs_filter = Q() - if not fet_meeting_only: - posts = qs.filter(~Q(post_type="N")) - else: - posts = qs.filter(post_type="F") + if fet_meeting_only: + qs_filter &= Q(post_type="F") if year: - posts = posts.filter(event_start__year=year) + qs_filter &= Q(date__year=year) if month: - posts = posts.filter(event_start__month=month) + qs_filter &= Q(date__month=month) - for post in posts: - 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 + return self.published(public).filter(qs_filter) # use for finding tags at homepage - TODO: delete when new design published def get_last_months_posts(self, public=True): @@ -96,22 +74,19 @@ class ArticleManager(PublishedManager, Manager): Provide a query set only for "Article" regular fet meetings should not be contained in the news stream """ + def get_queryset(self): - qs = super().get_queryset().filter(Q(post_type="E") | Q(post_type="N")) - return qs.order_by("-public_date") + qs = super().get_queryset().filter(Q(post_type="N") | Q(post_type="E")) + 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): - post_list = [] - 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 + return self.published(public) def pinned(self, public=True): return self.published(public).filter(is_pinned=True).first() @@ -121,21 +96,31 @@ class NewsManager(PublishedManager, Manager): """ Provide a query set only for "News" """ + 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): """ Provide a query set for all events ("Event" and "Fet Meeting") """ + def get_queryset(self): - return ( - super() - .get_queryset() - .filter(Q(post_type="E") | Q(post_type="F")) - .order_by("-event_start") + qs = super().get_queryset().filter(Q(post_type="E") | Q(post_type="F")) + qs = qs.annotate( + date=Case( + When(post_type="E", then="event_start__date"), + When(post_type="F", then="event_start__date"), + ) ) + return qs.order_by("-date") def future_events(self, public=True): date_today = timezone.now() @@ -148,8 +133,15 @@ class EventManager(PublishedManager, Manager): Provide a query set only for "Events" regular fet meetings should not be contained in the news stream """ + 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): date_today = timezone.now() @@ -166,8 +158,15 @@ class FetMeetingManager(PublishedManager, Manager): """ Provide a query set only for "Fet Meeting" """ + 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): date_today = timezone.now() diff --git a/fet2020/posts/views.py b/fet2020/posts/views.py index 89fe5db9..9cb18f3d 100644 --- a/fet2020/posts/views.py +++ b/fet2020/posts/views.py @@ -250,11 +250,7 @@ def __next(post=None, public=True): d = post.slug if post: - # TODO: bad implementation but it works!! - 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) + posts = Post.objects.date_sorted_list(public).filter(post_type=post.post_type) if posts: for k, v in enumerate(posts): diff --git a/fet2020/templates/home.html b/fet2020/templates/home.html index 60900d99..86135d11 100644 --- a/fet2020/templates/home.html +++ b/fet2020/templates/home.html @@ -12,11 +12,7 @@
{{ post.event_start|date:"d. F Y" }}
- {% else %} -{{ post.public_date|date:"d. F Y" }}
- {% endif %} +{{ post.date|date:"d. F Y" }}
{{ post.event_start|date:"d. F Y" }}
- {% else %} -{{ post.public_date|date:"d. F Y" }}
- {% endif %} +{{ post.date|date:"d. F Y" }}
{{ post.event_start|date:"d. F Y" }}
- {% else %} -{{ post.public_date|date:"d. F Y" }}
- {% endif %} +{{ post.date|date:"d. F Y" }}
{{ post.event_start|date:"d. F Y" }}
- {% else %} -{{ post.public_date|date:"d. F Y" }}
- {% endif %} +{{ post.date|date:"d. F Y" }}
{{post.public_date}}
+{{post.date}}