|
| 1 | +from typing import Any |
| 2 | + |
| 3 | +from datetime import datetime |
| 4 | + |
1 | 5 | from django.db.models import Prefetch
|
2 | 6 | from django.urls import reverse
|
| 7 | +from django.utils import timezone |
3 | 8 | from django.views.generic import DetailView, TemplateView, ListView, RedirectView
|
4 | 9 | from django.http import Http404
|
| 10 | +from django.contrib.syndication.views import Feed |
| 11 | +from django.utils.feedgenerator import Rss201rev2Feed |
5 | 12 |
|
6 | 13 | from .models import OS, Release, ReleaseFile
|
7 | 14 |
|
@@ -147,3 +154,45 @@ def get_context_data(self, **kwargs):
|
147 | 154 | )
|
148 | 155 |
|
149 | 156 | return context
|
| 157 | + |
| 158 | + |
| 159 | +class ReleaseFeed(Feed): |
| 160 | + """Generate an RSS feed of the latest Python releases. |
| 161 | +
|
| 162 | + .. note:: It may seem like these are unused methods, but the superclass uses them |
| 163 | + using Django's Syndication framework. |
| 164 | + Docs: https://docs.djangoproject.com/en/4.2/ref/contrib/syndication/ |
| 165 | + """ |
| 166 | + |
| 167 | + feed_type = Rss201rev2Feed |
| 168 | + title = "Python Releases" |
| 169 | + description = "Latest Python releases from Python.org" |
| 170 | + |
| 171 | + @staticmethod |
| 172 | + def link() -> str: |
| 173 | + """Return the URL to the main downloads page.""" |
| 174 | + return reverse("downloads:download") |
| 175 | + |
| 176 | + def items(self) -> list[dict[str, Any]]: |
| 177 | + """Return the latest Python releases.""" |
| 178 | + return Release.objects.filter(is_published=True).order_by("-release_date")[:10] |
| 179 | + |
| 180 | + def item_title(self, item: Release) -> str: |
| 181 | + """Return the release name as the item title.""" |
| 182 | + return item.name |
| 183 | + |
| 184 | + def item_description(self, item: Release) -> str: |
| 185 | + """Return the release version and release date as the item description.""" |
| 186 | + return f"Version: {item.version}, Release Date: {item.release_date}" |
| 187 | + |
| 188 | + def item_pubdate(self, item: Release) -> datetime | None: |
| 189 | + """Return the release date as the item publication date.""" |
| 190 | + if item.release_date: |
| 191 | + if timezone.is_naive(item.release_date): |
| 192 | + return timezone.make_aware(item.release_date) |
| 193 | + return item.release_date |
| 194 | + return None |
| 195 | + |
| 196 | + def item_guid(self, item: Release) -> str: |
| 197 | + """Return a unique ID for the item based on DB record.""" |
| 198 | + return str(item.pk) |
0 commit comments