Gentoo Archives: gentoo-commits

From: Slava Bacherikov <slava@××××××××××××××.ua>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/apps/generic/
Date: Mon, 30 Jul 2012 13:00:15
Message-Id: 1343482252.d24e06bc575b9e6b6d71863848d64bd670c2c196.bacher09@gentoo
1 commit: d24e06bc575b9e6b6d71863848d64bd670c2c196
2 Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
3 AuthorDate: Sat Jul 28 13:30:52 2012 +0000
4 Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
5 CommitDate: Sat Jul 28 13:30:52 2012 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=d24e06bc
7
8 Add atom feed with right updated datetime
9
10 ---
11 gpackages/apps/generic/views.py | 27 +++++++++++++++++++++++++++
12 gpackages/apps/packages/urls.py | 3 ++-
13 gpackages/apps/packages/views.py | 14 +++++++++++---
14 3 files changed, 40 insertions(+), 4 deletions(-)
15
16 diff --git a/gpackages/apps/generic/views.py b/gpackages/apps/generic/views.py
17 index 08bf734..165633d 100644
18 --- a/gpackages/apps/generic/views.py
19 +++ b/gpackages/apps/generic/views.py
20 @@ -1,6 +1,10 @@
21 from django.views.generic import TemplateView, ListView
22 from string import Template
23 import re
24 +from django.contrib.syndication.views import Feed
25 +from django.utils.feedgenerator import Atom1Feed, rfc3339_date
26 +from django.utils import tzinfo
27 +from django.utils.timezone import is_naive
28
29 class ContextView(object):
30 extra_context = {}
31 @@ -135,4 +139,27 @@ class MultipleFilterListViewMixin(object):
32 l.append(t.format(re.escape(key)))
33
34 return ''.join(l) + "(?:order/(?P<order>[a-z]*)/)?(?P<rev>rev/)?"
35 +
36 +class FeedWithUpdated(Feed):
37 + def item_extra_kwargs(self, item):
38 + # for future
39 + kwargs = super(FeedWithUpdated, self).item_extra_kwargs(item)
40 + # hack for access to private method !!!
41 + updated = self._Feed__get_dynamic_attr('item_update', item)
42 + if updated and is_naive(updated):
43 + ltz = tzinfo.LocalTimezone(updated)
44 + updated = updated.replace(tzinfo=ltz)
45 + kwargs['updated'] = updated
46 + return kwargs
47
48 +# see bug https://code.djangoproject.com/ticket/14656
49 +class RightAtom1Feed(Atom1Feed):
50 + def add_item_elements(self, handler, item):
51 + if item['pubdate'] is not None:
52 + handler.addQuickElement(u"published", rfc3339_date(item['pubdate']).decode('utf-8'))
53 + item['pubdate'] = None
54 +
55 + if item['updated'] is not None:
56 + handler.addQuickElement(u"updated", rfc3339_date(item['updated']).decode('utf-8'))
57 +
58 + return super(RightAtom1Feed, self).add_item_elements(handler, item)
59
60 diff --git a/gpackages/apps/packages/urls.py b/gpackages/apps/packages/urls.py
61 index 4a04940..1a59669 100644
62 --- a/gpackages/apps/packages/urls.py
63 +++ b/gpackages/apps/packages/urls.py
64 @@ -5,7 +5,7 @@ from views import CategoriesListView, HerdsListView, MaintainersListView, \
65 GlobalUseListView, NewsListView, NewsDetailView, \
66 LicenseDetailView, ArchChoiceView, LicensesListView, \
67 LocalUseListView, FilteringView, RepoDetailView, \
68 - MainPageFeed
69 + MainPageFeed, MainPageFeedAtom
70
71 urlpatterns = patterns('',
72 url(r'^categories/$', CategoriesListView.as_view(), name = 'categories'),
73 @@ -33,4 +33,5 @@ urlpatterns = patterns('',
74 url(r'^filter/$', FilteringView.as_view(), name = 'filter'),
75 url(r'^repository/(?P<slug>[^/]+)/$', RepoDetailView.as_view(), name = 'repository'),
76 url(r'^rss/$', MainPageFeed()),
77 + url(r'^atom/$', MainPageFeedAtom()),
78 )
79
80 diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py
81 index 5fdde7b..78ed365 100644
82 --- a/gpackages/apps/packages/views.py
83 +++ b/gpackages/apps/packages/views.py
84 @@ -1,6 +1,8 @@
85 from django.views.generic import DetailView, FormView, ListView
86 from generic.views import ContextListView, ContextTemplateView, ContextView, \
87 - MultipleFilterListViewMixin
88 + MultipleFilterListViewMixin, RightAtom1Feed, \
89 + FeedWithUpdated
90 +
91 from .models import CategoryModel, HerdsModel, MaintainerModel, \
92 RepositoryModel, LicenseGroupModel, EbuildModel, \
93 PackageModel, UseFlagModel, PortageNewsModel, \
94 @@ -10,7 +12,6 @@ from django.core.urlresolvers import reverse
95
96 from django.shortcuts import get_object_or_404
97 from package_info.parse_cp import EbuildParseCPVR, PackageParseCPR
98 -from django.contrib.syndication.views import Feed
99
100 arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86']
101
102 @@ -254,7 +255,7 @@ class RepoDetailView(DetailView):
103 slug_field = 'name'
104 queryset = RepositoryModel.objects.all()
105
106 -class MainPageFeed(Feed):
107 +class MainPageFeed(FeedWithUpdated):
108 title = 'Feed'
109 link = '/rss/'
110 description = 'Descr'
111 @@ -270,3 +271,10 @@ class MainPageFeed(Feed):
112
113 def item_pubdate(self, item):
114 return item.created_datetime
115 +
116 + def item_update(self, item):
117 + return item.updated_datetime
118 +
119 +class MainPageFeedAtom(MainPageFeed):
120 + link = '/atom/'
121 + feed_type = RightAtom1Feed