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 |