diff --git a/ietf/doc/feeds.py b/ietf/doc/feeds.py index 500ed3cb18..6f7dc6d01e 100644 --- a/ietf/doc/feeds.py +++ b/ietf/doc/feeds.py @@ -1,4 +1,4 @@ -# Copyright The IETF Trust 2007-2020, All Rights Reserved +# Copyright The IETF Trust 2007-2024, All Rights Reserved # -*- coding: utf-8 -*- import debug # pyflakes:ignore @@ -18,7 +18,7 @@ from django.utils import timezone from django.utils.html import strip_tags -from ietf.doc.models import Document, State, LastCallDocEvent, DocEvent +from ietf.doc.models import Document, State, LastCallDocEvent, DocEvent, NewRevisionDocEvent from ietf.doc.utils import augment_events_with_revision from ietf.doc.templatetags.ietf_filters import format_textarea from ietf.utils.timezone import RPC_TZINFO @@ -76,7 +76,7 @@ def item_description(self, item): truncatewords_html(format_textarea(item.desc), 20) ) - def item_pubdate(self, item): + def item_updateddate(self, item): return item.time def item_author_name(self, item): @@ -123,10 +123,34 @@ def item_title(self, item): def item_description(self, item): return strip_control_characters(linebreaks(item.lc_event.desc)) - def item_pubdate(self, item): + def item_updateddate(self, item): return item.lc_event.time +class DraftFeed(Feed): + title = "Internet-Drafts" + feed_type = Atom1Feed + author_name = "IESG Secretary" + link ="/doc/recent/" + + def items(self): + since = timezone.now() - datetime.timedelta(days=7) + state = State.objects.get(type='draft', slug='active') + events = NewRevisionDocEvent.objects.filter(time__gt=since) + names = [ e.doc.name for e in events ] + docs = Document.objects.filter(name__in=names, states=state).order_by("-time") + return docs + + def item_title(self, item): + return "%s : %s" % (item.name, item.title) + + def item_description(self, item): + return item.abstract + + def item_updateddate(self, item): + return item.time + + class Rss201WithNamespacesFeed(Rss201rev2Feed): def root_attributes(self): attrs = super(Rss201WithNamespacesFeed, self).root_attributes() diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py index fa655cb884..7028d9d300 100644 --- a/ietf/doc/tests.py +++ b/ietf/doc/tests.py @@ -2026,6 +2026,20 @@ def test_last_call_feed(self): self.assertEqual(r.status_code, 200) self.assertContains(r, doc.name) + def test_draft_feed(self): + doc = WgDraftFactory() + doc.docevent_set.filter(newrevisiondocevent__isnull=False).update(time=timezone.now()) + StateDocEventFactory(doc=doc, time=timezone.now()) + + old = WgDraftFactory() + old.docevent_set.filter(newrevisiondocevent__isnull=False).update(time=timezone.now()-datetime.timedelta(days=8)) + StateDocEventFactory(doc=old, time=timezone.now()-datetime.timedelta(days=8)) + + r = self.client.get("/feed/draft/") + self.assertEqual(r.status_code, 200) + self.assertContains(r, doc.name) + self.assertNotContains(r, old.name) + def test_rfc_feed(self): rfc = WgRfcFactory(rfc_number=9000) DocEventFactory(doc=rfc, type="published_rfc") diff --git a/ietf/feed_urls.py b/ietf/feed_urls.py index 6cbe8d0fa0..6621c1c4c0 100644 --- a/ietf/feed_urls.py +++ b/ietf/feed_urls.py @@ -1,7 +1,9 @@ +# Copyright The IETF Trust 2007-2024, All Rights Reserved + from django.views.generic import RedirectView from django.conf import settings -from ietf.doc.feeds import DocumentChangesFeed, InLastCallFeed, RfcFeed +from ietf.doc.feeds import DocumentChangesFeed, InLastCallFeed, RfcFeed, DraftFeed from ietf.group.feeds import GroupChangesFeed from ietf.iesg.feeds import IESGAgendaFeed from ietf.ipr.feeds import LatestIprDisclosuresFeed @@ -20,4 +22,5 @@ url(r'^wg-proceedings/$', LatestMeetingMaterialFeed()), url(r'^rfc/(?P\d{4})/?$', RfcFeed()), url(r'^rfc/$', RfcFeed()), + url(r'^draft/?$', DraftFeed()), ] diff --git a/ietf/group/feeds.py b/ietf/group/feeds.py index 10713f91f9..de9163c139 100644 --- a/ietf/group/feeds.py +++ b/ietf/group/feeds.py @@ -1,4 +1,4 @@ -# Copyright The IETF Trust 2011-2020, All Rights Reserved +# Copyright The IETF Trust 2011-2024, All Rights Reserved # -*- coding: utf-8 -*- @@ -44,7 +44,7 @@ def item_link(self, obj): elif isinstance(obj, GroupEvent): return obj.group.about_url() - def item_pubdate(self, obj): + def item_updateddate(self, obj): return obj.time def item_title(self, obj): diff --git a/ietf/iesg/feeds.py b/ietf/iesg/feeds.py index a8b5c2869c..bc6d6c6820 100644 --- a/ietf/iesg/feeds.py +++ b/ietf/iesg/feeds.py @@ -1,4 +1,4 @@ -# Copyright The IETF Trust 2007-2020, All Rights Reserved +# Copyright The IETF Trust 2007-2024, All Rights Reserved # -*- coding: utf-8 -*- @@ -27,7 +27,7 @@ def items(self): def item_categories(self, doc): return [ str(doc.latest_telechat_event.time.date()) ] - def item_pubdate(self, doc): + def item_updateddate(self, doc): return doc.latest_telechat_event.time def item_author_name(self, doc): diff --git a/ietf/ipr/feeds.py b/ietf/ipr/feeds.py index e8a1c739f2..b80851c578 100644 --- a/ietf/ipr/feeds.py +++ b/ietf/ipr/feeds.py @@ -1,4 +1,4 @@ -# Copyright The IETF Trust 2007-2023, All Rights Reserved +# Copyright The IETF Trust 2007-2024, All Rights Reserved # -*- coding: utf-8 -*- @@ -28,7 +28,7 @@ def item_title(self, item): def item_description(self, item): return force_str(item.title) - def item_pubdate(self, item): + def item_updateddate(self, item): return item.time def item_author_name(self, item): diff --git a/ietf/liaisons/feeds.py b/ietf/liaisons/feeds.py index f4411a805e..f450b6bf04 100644 --- a/ietf/liaisons/feeds.py +++ b/ietf/liaisons/feeds.py @@ -1,4 +1,4 @@ -# Copyright The IETF Trust 2007-2020, All Rights Reserved +# Copyright The IETF Trust 2007-2024, All Rights Reserved # -*- coding: utf-8 -*- @@ -101,7 +101,7 @@ def item_description(self, item): def item_link(self, item): return urlreverse("ietf.liaisons.views.liaison_detail", kwargs={ "object_id": item.pk }) - def item_pubdate(self, item): + def item_updateddate(self, item): # this method needs to return a datetime instance, even # though the database has only date, not time return item.submitted diff --git a/ietf/meeting/feeds.py b/ietf/meeting/feeds.py index 61c010c5e4..6b5d1c5b97 100644 --- a/ietf/meeting/feeds.py +++ b/ietf/meeting/feeds.py @@ -1,4 +1,4 @@ -# Copyright The IETF Trust 2007-2020, All Rights Reserved +# Copyright The IETF Trust 2007-2024, All Rights Reserved # -*- coding: utf-8 -*- @@ -45,7 +45,7 @@ def item_description(self, item): def item_link(self, item): return item['link'] - def item_pubdate(self, item): + def item_updateddate(self, item): return item['date'] def item_author_name(self, item): diff --git a/ietf/templates/community/atom.xml b/ietf/templates/community/atom.xml index 32e3b00292..61b4717ff6 100644 --- a/ietf/templates/community/atom.xml +++ b/ietf/templates/community/atom.xml @@ -3,7 +3,7 @@ {{ title }} {{ subtitle }} {{ id }} - {{ updated|date:"Y-m-d\TH:i:sO" }} + {{ updated|date:"c" }} @@ -17,11 +17,11 @@ - {{ entry.id }} + urn:uid:{{ entry.id }} - {{ entry.time|date:"Y-m-d\TH:i:sO" }} + {{ entry.time|date:"c" }} - {{ entry.time|date:"Y-m-d\TH:i:sO" }} + {{ entry.time|date:"c" }} {{ entry.by }} diff --git a/ietf/templates/doc/recent_drafts.html b/ietf/templates/doc/recent_drafts.html index 9674ba8b66..96daf6eed4 100644 --- a/ietf/templates/doc/recent_drafts.html +++ b/ietf/templates/doc/recent_drafts.html @@ -1,9 +1,10 @@ {% extends "base.html" %} -{# Copyright The IETF Trust 2015, All Rights Reserved #} +{# Copyright The IETF Trust 2015-2024, All Rights Reserved #} {% load origin static %} {% load cache %} {% block pagehead %} + {% endblock %} {% block title %}Internet-Drafts submitted during the last {{ days|default:7 }} days{% endblock %} {% block content %}