From 7ee0e3980d19695966d700c24eb5e3fbbd0db514 Mon Sep 17 00:00:00 2001 From: Matthias Portzel Date: Sat, 1 Jul 2023 12:54:16 -0700 Subject: [PATCH] Revert "Thoughts are sorted and displayed by UUID, not date" This reverts commit 608c8cdcd243bbf84bc5df5cf62b5c191c09a709. --- thoughts/pagination.py | 139 ++++++++++++++----------- thoughts/templates/thoughts/index.html | 8 +- 2 files changed, 82 insertions(+), 65 deletions(-) diff --git a/thoughts/pagination.py b/thoughts/pagination.py index 3b9507c..b8dcaa3 100644 --- a/thoughts/pagination.py +++ b/thoughts/pagination.py @@ -3,8 +3,6 @@ import datetime from django.utils.text import slugify from django.utils.timezone import make_aware -from django.db.models import Q - from .models import Thought class Page: @@ -16,71 +14,90 @@ class Page: pass -# Okay, we're going to have some fun with this -# 8 pages, 01, 23, 45, 67, 89, AB, CD, EF +# Okay we're going to use some wack seasons here hold on +# Let's go meteorological seasons +# 1 - jan -> 1, 0 +# 2 - feb -> 2, 0 +# 3 - mar -> 3, 1, spring +# 4 - apl -> 4, 1 +# 5 - may -> 5, 1 +# 6 - jun -> 6, 2, summer +# 7 - jul -> 7, 2 +# 8 - aug -> 8, 2 +# 9 - sep -> 9, 3, fall +# 10 - oct -> 10, 3 +# 11 - nov -> 11, 3 +# 12 - dec -> 0, 0, winter +def season_for_date(date): + return (date.month % 12) // 3 + + +def season_year_for_date(date): + return season_for_date(date), date.year - (1 if date.month in [1, 2] else 0) + + +def formatted_name_for_season_year(current_season, current_year): + return ["Winter", "Spring", "Summer", "Fall"][current_season] + " " + str(current_year) + -# Exported def get_page_slug(thought): - return ({ - "0": "0-1", - "1": "0-1", - "2": "2-3", - "3": "2-3", - "4": "4-5", - "5": "4-5", - "6": "6-7", - "7": "6-7", - "8": "8-9", - "9": "8-9", - "a": "a-b", - "b": "a-b", - "c": "c-d", - "d": "c-d", - "e": "e-f", - "f": "e-f", - })[str(thought.uuid)[0]] + return slugify(formatted_name_for_season_year(*season_year_for_date(thought.posted))) -def formatted_name_for_slug(slug): - return ({ - "0-1": "0-1", - "2-3": "2-3", - "4-5": "4-5", - "6-7": "6-7", - "8-9": "8-9", - "a-b": "A-B", - "c-d": "C-D", - "e-f": "E-F", - })[slug] - - -class RandomPage(Page): - def __init__(self, slug): - super().__init__(formatted_name_for_slug(slug)) - self.slug = slug +class SeasonPage(Page): + def __init__(self, current_season, current_year): + super().__init__(formatted_name_for_season_year(current_season, current_year)) + self.first_day_of_season = make_aware(datetime.datetime( + current_year, + 12 if current_season == 0 else current_season * 3, + 1 + )) + # If the current season is winter, then the next season starts on the next year + # This is actually the first day of the next season but that's hard to type out and it's 2am + self.last_day_of_season = make_aware(datetime.datetime( + current_year + (1 if current_season == 0 else 0), + 12 if current_season == 3 else (current_season + 1) * 3, + 1 + )) def get_all_entries(self): - return Thought.objects.filter( - Q(uuid__startswith=self.slug[0]) | - Q(uuid__startswith=self.slug[-1]) - ).order_by("uuid") + return Thought.objects.order_by("-posted").filter( + posted__gte=self.first_day_of_season, # First month of this season + posted__lt=self.last_day_of_season # First month of next season + ) + + +# Need to loop over all thoughts? and yield a new Page for each season +# Assume that if you're using this generator, you have at least 1 thought each +# season between the first and last +# We don't take into account timezone here. Because local time isn't monotonic increasing, +# it's ill-defined how to split up a list of items ordered by server time. This is annoying +# But the alternative is to call get_season for every thought and sort them into buckets +def season_pages(): + ordered_thoughts = Thought.objects.order_by("posted") + first_thought = ordered_thoughts.first() + last_thought = ordered_thoughts.last() + + current_season, current_year = season_year_for_date(first_thought.posted) + last_season, last_year = season_year_for_date(last_thought.posted) + + while current_year < last_year or current_season != last_season: + yield SeasonPage(current_season, current_year) + + if current_season == 0: + current_year += 1 + current_season += 1 + current_season = current_season % 4 + + yield SeasonPage(current_season, current_year) -# Exported -# Returns a list of `Page`s -# Where a Page has: -# .slug -# .formatted_name -# .get_all_entries def get_all_pages(): - return [ - RandomPage("0-1"), - RandomPage("2-3"), - RandomPage("4-5"), - RandomPage("6-7"), - RandomPage("8-9"), - RandomPage("a-b"), - RandomPage("c-d"), - RandomPage("e-f"), - ] - + pages = list(season_pages()) + pages.reverse() + return pages + # Where a Page has: + # .slug + # .formatted_name + # .get_all_entries + # return [Pages] diff --git a/thoughts/templates/thoughts/index.html b/thoughts/templates/thoughts/index.html index 0653c83..0c8108b 100644 --- a/thoughts/templates/thoughts/index.html +++ b/thoughts/templates/thoughts/index.html @@ -55,13 +55,13 @@ {% block main %} @@ -81,13 +81,13 @@ {% endblock %}