Port feed setup to new feed API where each feed is a class-based view
- Legacy-Id: 6939
This commit is contained in:
parent
d86789608a
commit
5021ed5629
|
@ -13,14 +13,11 @@ from ietf.doc.models import *
|
||||||
from ietf.doc.utils import augment_events_with_revision
|
from ietf.doc.utils import augment_events_with_revision
|
||||||
from ietf.doc.templatetags.ietf_filters import format_textarea
|
from ietf.doc.templatetags.ietf_filters import format_textarea
|
||||||
|
|
||||||
class DocumentChanges(Feed):
|
class DocumentChangesFeed(Feed):
|
||||||
feed_type = Atom1Feed
|
feed_type = Atom1Feed
|
||||||
|
|
||||||
def get_object(self, bits):
|
def get_object(self, request, name):
|
||||||
if len(bits) != 1:
|
return Document.objects.get(docalias__name=name)
|
||||||
raise Document.DoesNotExist
|
|
||||||
|
|
||||||
return Document.objects.get(docalias__name=bits[0])
|
|
||||||
|
|
||||||
def title(self, obj):
|
def title(self, obj):
|
||||||
return "Changes for %s" % obj.display_name()
|
return "Changes for %s" % obj.display_name()
|
||||||
|
@ -55,7 +52,7 @@ class DocumentChanges(Feed):
|
||||||
def item_link(self, item):
|
def item_link(self, item):
|
||||||
return self.cached_link + "#history-%s" % item.pk
|
return self.cached_link + "#history-%s" % item.pk
|
||||||
|
|
||||||
class InLastCall(Feed):
|
class InLastCallFeed(Feed):
|
||||||
title = "Documents in Last Call"
|
title = "Documents in Last Call"
|
||||||
subtitle = "Announcements for documents in last call."
|
subtitle = "Announcements for documents in last call."
|
||||||
feed_type = Atom1Feed
|
feed_type = Atom1Feed
|
||||||
|
|
21
ietf/feed_urls.py
Normal file
21
ietf/feed_urls.py
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
from django.conf.urls import patterns, url
|
||||||
|
from django.views.generic import RedirectView
|
||||||
|
|
||||||
|
from ietf.doc.feeds import DocumentChangesFeed, InLastCallFeed
|
||||||
|
from ietf.wgcharter.feeds import GroupChangesFeed
|
||||||
|
from ietf.iesg.feeds import IESGAgendaFeed
|
||||||
|
from ietf.ipr.feeds import LatestIprDisclosuresFeed
|
||||||
|
from ietf.liaisons.feeds import LiaisonStatementsFeed
|
||||||
|
from ietf.meeting.feeds import LatestMeetingMaterialFeed
|
||||||
|
|
||||||
|
urlpatterns = patterns(
|
||||||
|
'',
|
||||||
|
(r'^comments/(?P<remainder>.*)/$', RedirectView.as_view(url='/feed/document-changes/%(remainder)s/')),
|
||||||
|
(r'^document-changes/(?P<name>[A-Za-z0-9._+-]+)/$', DocumentChangesFeed()),
|
||||||
|
(r'^last-call/$', InLastCallFeed()),
|
||||||
|
(r'^group-changes/(?P<acronym>[a-zA-Z0-9-]+)/$', GroupChangesFeed()),
|
||||||
|
(r'^iesg-agenda/$', IESGAgendaFeed()),
|
||||||
|
(r'^ipr/$', LatestIprDisclosuresFeed()),
|
||||||
|
(r'^liaison/(?P<kind>recent|from|to|subject)/(?:(?P<search>[^/]+)/)?$', LiaisonStatementsFeed()),
|
||||||
|
(r'^wg-proceedings/$', LatestMeetingMaterialFeed()),
|
||||||
|
)
|
|
@ -1,20 +1,17 @@
|
||||||
# Copyright The IETF Trust 2007, 2008, All Rights Reserved
|
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.contrib.syndication.views import Feed
|
from django.contrib.syndication.views import Feed
|
||||||
from django.utils.feedgenerator import Atom1Feed
|
from django.utils.feedgenerator import Atom1Feed
|
||||||
|
|
||||||
from ietf.doc.models import Document
|
from ietf.doc.models import Document, TelechatDocEvent
|
||||||
|
|
||||||
class IESGAgenda(Feed):
|
class IESGAgendaFeed(Feed):
|
||||||
title = "Documents on Future IESG Telechat Agendas"
|
title = "Documents on Future IESG Telechat Agendas"
|
||||||
link = settings.IDTRACKER_BASE_URL + "/iesg/agenda/"
|
link = "/iesg/agenda/"
|
||||||
feed_type = Atom1Feed
|
feed_type = Atom1Feed
|
||||||
|
description_template = "iesg/feed_item_description.html"
|
||||||
|
|
||||||
def items(self):
|
def items(self):
|
||||||
from ietf.doc.models import TelechatDocEvent
|
|
||||||
docs = Document.objects.filter(docevent__telechatdocevent__telechat_date__gte=datetime.date.today()).distinct()
|
docs = Document.objects.filter(docevent__telechatdocevent__telechat_date__gte=datetime.date.today()).distinct()
|
||||||
for d in docs:
|
for d in docs:
|
||||||
d.latest_telechat_event = d.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
|
d.latest_telechat_event = d.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
|
||||||
|
@ -23,7 +20,7 @@ class IESGAgenda(Feed):
|
||||||
return docs
|
return docs
|
||||||
|
|
||||||
def item_categories(self, doc):
|
def item_categories(self, doc):
|
||||||
return [ str(doc.telechat_date) ]
|
return [ str(doc.latest_telechat_event.time.date()) ]
|
||||||
|
|
||||||
def item_pubdate(self, doc):
|
def item_pubdate(self, doc):
|
||||||
return doc.latest_telechat_event.time
|
return doc.latest_telechat_event.time
|
||||||
|
|
|
@ -231,9 +231,7 @@ class IESGAgendaTests(TestCase):
|
||||||
# print n, s.get("docs") if "docs" in s else s["title"]
|
# print n, s.get("docs") if "docs" in s else s["title"]
|
||||||
|
|
||||||
def test_feed(self):
|
def test_feed(self):
|
||||||
url = "/feed/iesg-agenda/"
|
r = self.client.get("/feed/iesg-agenda/")
|
||||||
|
|
||||||
r = self.client.get(url)
|
|
||||||
self.assertEquals(r.status_code, 200)
|
self.assertEquals(r.status_code, 200)
|
||||||
|
|
||||||
for d in self.telechat_docs.values():
|
for d in self.telechat_docs.values():
|
||||||
|
|
|
@ -3,14 +3,14 @@ import re, os, datetime
|
||||||
from django.contrib.syndication.views import Feed
|
from django.contrib.syndication.views import Feed
|
||||||
from django.utils.feedgenerator import Atom1Feed
|
from django.utils.feedgenerator import Atom1Feed
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
from django.utils.html import escape
|
||||||
|
|
||||||
from ietf.doc.models import Document
|
from ietf.doc.models import Document
|
||||||
|
|
||||||
class LatestMeetingMaterial(Feed):
|
class LatestMeetingMaterialFeed(Feed):
|
||||||
feed_type = Atom1Feed
|
feed_type = Atom1Feed
|
||||||
link = "/meeting/"
|
link = "/meeting/"
|
||||||
language = "en"
|
language = "en"
|
||||||
feed_url = "/feed/wg-proceedings/"
|
|
||||||
base_url = "http://www3.ietf.org/proceedings/"
|
base_url = "http://www3.ietf.org/proceedings/"
|
||||||
|
|
||||||
def items(self):
|
def items(self):
|
||||||
|
@ -30,6 +30,12 @@ class LatestMeetingMaterial(Feed):
|
||||||
def title(self, obj):
|
def title(self, obj):
|
||||||
return "Meeting Materials Activity"
|
return "Meeting Materials Activity"
|
||||||
|
|
||||||
|
def item_title(self, item):
|
||||||
|
return u"%s: %s" % (item["group_acronym"], escape(item["title"]))
|
||||||
|
|
||||||
|
def item_description(self, item):
|
||||||
|
return ""
|
||||||
|
|
||||||
def item_link(self, item):
|
def item_link(self, item):
|
||||||
return item['link']
|
return item['link']
|
||||||
|
|
||||||
|
|
1
ietf/templates/feeds/.gitignore
vendored
1
ietf/templates/feeds/.gitignore
vendored
|
@ -1 +0,0 @@
|
||||||
/*.pyc
|
|
|
@ -1,3 +0,0 @@
|
||||||
{# Copyright The IETF Trust 2011, All Rights Reserved #}
|
|
||||||
{% load ietf_filters %}
|
|
||||||
<p>{{ obj.desc|safe|linebreaksbr }}</p>
|
|
|
@ -1 +0,0 @@
|
||||||
{{ obj|escape }}
|
|
|
@ -1 +0,0 @@
|
||||||
{% load ietf_filters %}{{ obj|safe }}
|
|
|
@ -1,15 +0,0 @@
|
||||||
{# Copyright The IETF Trust 2007, All Rights Reserved #}
|
|
||||||
{% if obj.by_secretariat %}
|
|
||||||
<h3>Attached Document(s)</h3>
|
|
||||||
{% if obj.uploads_set.count %}
|
|
||||||
<ul>
|
|
||||||
{% for file in obj.uploads_set.all %}
|
|
||||||
<li><a href="https://datatracker.ietf.org/documents/LIAISON/file{{ file.file_id }}{{ file.file_extension }}">{{ file.file_title }}</a><br>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% else %}
|
|
||||||
NONE
|
|
||||||
{% endif %}
|
|
||||||
{% else %}
|
|
||||||
{{ obj.body|truncatewords:"30"|wordwrap:"71"|escape|linebreaksbr }}
|
|
||||||
{% endif %}
|
|
|
@ -1,7 +0,0 @@
|
||||||
{# Copyright The IETF Trust 2007, All Rights Reserved #}
|
|
||||||
{% load ietf_filters %}
|
|
||||||
{% if obj.by_secretariat %}
|
|
||||||
Liaison statement submitted by email from {{ obj.from_body|safe }} to {{ obj.submitter_name|safe }} on {{ obj.submitted_date }}
|
|
||||||
{% else %}
|
|
||||||
{{ obj.title|safe }}
|
|
||||||
{% endif %}
|
|
|
@ -1 +0,0 @@
|
||||||
{{ obj.group_acronym }}: {{ obj.title|escape }}
|
|
14
ietf/templates/liaisons/feed_item_description.html
Normal file
14
ietf/templates/liaisons/feed_item_description.html
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{{ obj.body|truncatewords:"30"|wordwrap:"71"|escape|linebreaksbr }}
|
||||||
|
|
||||||
|
{% with obj.attachments.all as attachments %}
|
||||||
|
<h3>Attached Document{{ attachments|pluralize }}</h3>
|
||||||
|
{% if attachments %}
|
||||||
|
<ul>
|
||||||
|
{% for doc in attachments %}
|
||||||
|
<li><a href="https://datatracker.ietf.org/documents/LIAISON/{{ doc.external_url }}">{{ doc.title }}</a><br>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
<p>NONE</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endwith %}
|
1
ietf/templates/wgcharter/feed_item_description.html
Normal file
1
ietf/templates/wgcharter/feed_item_description.html
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<p>{{ obj.desc|safe|linebreaksbr }}</p>
|
19
ietf/urls.py
19
ietf/urls.py
|
@ -4,13 +4,6 @@ from django.conf.urls import patterns, include, handler404, handler500
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.views.generic import RedirectView, TemplateView
|
from django.views.generic import RedirectView, TemplateView
|
||||||
|
|
||||||
from ietf.iesg.feeds import IESGAgenda
|
|
||||||
from ietf.doc.feeds import DocumentChanges, InLastCall
|
|
||||||
from ietf.ipr.feeds import LatestIprDisclosures
|
|
||||||
from ietf.meeting.feeds import LatestMeetingMaterial
|
|
||||||
from ietf.liaisons.feeds import Liaisons
|
|
||||||
from ietf.wgcharter.feeds import GroupChanges
|
|
||||||
|
|
||||||
from ietf.liaisons.sitemaps import LiaisonMap
|
from ietf.liaisons.sitemaps import LiaisonMap
|
||||||
from ietf.ipr.sitemaps import IPRMap
|
from ietf.ipr.sitemaps import IPRMap
|
||||||
|
|
||||||
|
@ -28,16 +21,6 @@ except KeyError:
|
||||||
from dajaxice.core import dajaxice_autodiscover
|
from dajaxice.core import dajaxice_autodiscover
|
||||||
dajaxice_autodiscover()
|
dajaxice_autodiscover()
|
||||||
|
|
||||||
feeds = {
|
|
||||||
'iesg-agenda': IESGAgenda,
|
|
||||||
'last-call': InLastCall,
|
|
||||||
'document-changes': DocumentChanges,
|
|
||||||
'group-changes': GroupChanges,
|
|
||||||
'ipr': LatestIprDisclosures,
|
|
||||||
'liaison': Liaisons,
|
|
||||||
'wg-proceedings' : LatestMeetingMaterial,
|
|
||||||
}
|
|
||||||
|
|
||||||
sitemaps = {
|
sitemaps = {
|
||||||
'liaison': LiaisonMap,
|
'liaison': LiaisonMap,
|
||||||
'ipr': IPRMap,
|
'ipr': IPRMap,
|
||||||
|
@ -54,7 +37,7 @@ urlpatterns = patterns('',
|
||||||
(r'^doc/', include('ietf.doc.urls')),
|
(r'^doc/', include('ietf.doc.urls')),
|
||||||
(r'^drafts/', include('ietf.doc.redirect_drafts_urls')),
|
(r'^drafts/', include('ietf.doc.redirect_drafts_urls')),
|
||||||
(r'^feed/comments/(?P<remainder>.*)/$', RedirectView.as_view(url='/feed/document-changes/%(remainder)s/')),
|
(r'^feed/comments/(?P<remainder>.*)/$', RedirectView.as_view(url='/feed/document-changes/%(remainder)s/')),
|
||||||
(r'^feed/(?P<url>.*)/$', 'django.contrib.syndication.views.Feed', { 'feed_dict': feeds }),
|
(r'^feed/', include('ietf.feed_urls')),
|
||||||
(r'^help/', include('ietf.help.urls')),
|
(r'^help/', include('ietf.help.urls')),
|
||||||
(r'^idtracker/', include('ietf.doc.redirect_idtracker_urls')),
|
(r'^idtracker/', include('ietf.doc.redirect_idtracker_urls')),
|
||||||
(r'^iesg/', include('ietf.iesg.urls')),
|
(r'^iesg/', include('ietf.iesg.urls')),
|
||||||
|
|
|
@ -12,13 +12,12 @@ from django.template.defaultfilters import truncatewords
|
||||||
from ietf.group.models import Group, GroupEvent
|
from ietf.group.models import Group, GroupEvent
|
||||||
from ietf.doc.models import DocEvent
|
from ietf.doc.models import DocEvent
|
||||||
|
|
||||||
class GroupChanges(Feed):
|
class GroupChangesFeed(Feed):
|
||||||
feed_type = Atom1Feed
|
feed_type = Atom1Feed
|
||||||
description_template = "feeds/group_description.html"
|
description_template = "wgcharter/feed_item_description.html"
|
||||||
def get_object(self, bits):
|
|
||||||
if len(bits) != 1:
|
def get_object(self, request, acronym):
|
||||||
raise Group.DoesNotExist
|
return Group.objects.get(acronym=acronym)
|
||||||
return Group.objects.get(acronym=bits[0])
|
|
||||||
|
|
||||||
def title(self, obj):
|
def title(self, obj):
|
||||||
return u"Changes for %s %s" % (obj.acronym, obj.type)
|
return u"Changes for %s %s" % (obj.acronym, obj.type)
|
||||||
|
|
Loading…
Reference in a new issue