Files
website-v2/slack/filters.py
2026-01-13 13:31:55 -08:00

77 lines
2.8 KiB
Python

from django.contrib import admin
class FilterByReleaseDates(admin.SimpleListFilter):
"""Filter slack activity by Boost version release periods.
The release date is considered the END of the development period for that version.
Messages are attributed to the version they were leading up to, not the one just released.
"""
title = "release"
parameter_name = "release"
def lookups(self, request, model_admin):
from versions.models import Version
versions = Version.objects.filter(
release_date__isnull=False, active=True, full_release=True
).order_by("-release_date")[:20]
# Add special entries for ongoing development
choices = [
("master", "master (after latest release)"),
("develop", "develop (after latest release)"),
]
# Add version entries
choices.extend([(v.id, f"{v.name} ({v.release_date})") for v in versions])
return choices
def queryset(self, request, queryset):
if self.value() in ("master", "develop"):
# Get messages after the latest release
from versions.models import Version
latest_version = (
Version.objects.filter(
release_date__isnull=False, active=True, full_release=True
)
.order_by("-release_date")
.first()
)
if latest_version and latest_version.release_date:
return queryset.filter(day__gt=latest_version.release_date)
elif self.value():
from versions.models import Version
try:
version = Version.objects.get(id=self.value())
if version.release_date:
# Get the previous version's release date (this is the start of the period)
previous_version = (
Version.objects.filter(
release_date__lt=version.release_date,
active=True,
full_release=True,
)
.order_by("-release_date")
.first()
)
if previous_version and previous_version.release_date:
# Filter messages between previous release and current release
return queryset.filter(
day__gt=previous_version.release_date,
day__lte=version.release_date,
)
else:
# No previous version, so filter up to this release
return queryset.filter(day__lte=version.release_date)
except Version.DoesNotExist:
pass
return queryset