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/, gpackages/templates/
Date: Sat, 30 Jun 2012 01:39:04
Message-Id: 1341002991.ec64f86aadb7bb5895ef851a73c2f6c69f7603e0.bacher09@gentoo
1 commit: ec64f86aadb7bb5895ef851a73c2f6c69f7603e0
2 Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
3 AuthorDate: Fri Jun 29 20:49:51 2012 +0000
4 Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
5 CommitDate: Fri Jun 29 20:49:51 2012 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=ec64f86a
7
8 Change in general filter.
9
10 ---
11 gpackages/apps/generic/views.py | 71 ++++++++++++++++++++++++++++++++++
12 gpackages/apps/packages/urls.py | 3 +-
13 gpackages/apps/packages/views.py | 61 ++---------------------------
14 gpackages/templates/maintainers.html | 2 +-
15 4 files changed, 77 insertions(+), 60 deletions(-)
16
17 diff --git a/gpackages/apps/generic/views.py b/gpackages/apps/generic/views.py
18 index 3c11dd3..4afe2ec 100644
19 --- a/gpackages/apps/generic/views.py
20 +++ b/gpackages/apps/generic/views.py
21 @@ -1,4 +1,5 @@
22 from django.views.generic import TemplateView, ListView
23 +from string import Template
24
25 class ContextView(object):
26 extra_context = {}
27 @@ -18,3 +19,73 @@ class SetLang(ContextTemplateView):
28 extra_context = {'page_name': 'Set Language', 'nav_name' : 'setlanguage'}
29
30 set_lang_view = SetLang.as_view()
31 +
32 +# there is another dynamic filter for django, and it maybe better
33 +# but it is too big and i need just a litle of its functionly
34 +# but if this code have to be grove maybe i replace it to django-filter
35 +# application or another.
36 +def dynamic_filter(filter_set, allowed):
37 + result = {}
38 + for k in allowed.iterkeys():
39 + if k in filter_set:
40 + result[allowed[k]] = filter_set[k]
41 + return result
42 +
43 +def exclude_blank(res_dict):
44 + result = {}
45 + for k in res_dict.iterkeys():
46 + if res_dict[k]:
47 + result[k] = res_dict[k]
48 + return result
49 +
50 +def dynamic_order(args_list, allowed_list, reverse = None):
51 + order = allowed_list.get(None)
52 + if reverse is None:
53 + reverse = args_list.get('reverse', False)
54 + if args_list.get('order') in allowed_list:
55 + order = allowed_list.get(args_list.get('order'))
56 +
57 + if order == '?':
58 + return order
59 +
60 + if reverse and order[0] != '-':
61 + order = '-' + order
62 + elif reverse:
63 + order = order[1:]
64 + return order
65 +
66 +class MultipleFilterListViewMixin(object):
67 + allowed_filter = {}
68 + allowed_order = {}
69 +
70 + base_queryset = None # should be queryset
71 +
72 + def get_queryset(self):
73 + qs = dynamic_filter(exclude_blank(self.request.GET),
74 + self.allowed_filter)
75 + qs.update( dynamic_filter(exclude_blank(self.kwargs),
76 + self.allowed_filter) )
77 +
78 + if self.kwargs.get('rev') is None:
79 + reverse = bool(self.request.GET.get('rev',False))
80 + else:
81 + reverse = bool(self.kwargs.get('rev',False))
82 +
83 + if 'order' in self.request.GET:
84 + order = dynamic_order(self.request.GET, self.allowed_order,reverse)
85 + else:
86 + order = dynamic_order(self.kwargs, self.allowed_order, reverse)
87 + if self.kwargs.get('order') not in self.allowed_order:
88 + raise Http404('no such order')
89 +
90 + return self.base_queryset.filter(**qs).order_by(order)
91 +
92 + @classmethod
93 + def get_url_part(cls):
94 + t = "(?:{0}/(?P<{0}>[^/]+)/)?"
95 + l =[]
96 + for key in cls.allowed_filter.iterkeys():
97 + l.append(t.format(key))
98 +
99 + return ''.join(l) + "(?:order/(?P<order>[a-z]*)/)?(?P<rev>rev/)?"
100 +
101
102 diff --git a/gpackages/apps/packages/urls.py b/gpackages/apps/packages/urls.py
103 index f597026..ca15890 100644
104 --- a/gpackages/apps/packages/urls.py
105 +++ b/gpackages/apps/packages/urls.py
106 @@ -10,8 +10,7 @@ urlpatterns = patterns('',
107 url(r'^repositories/$', RepositoriesListView.as_view(), name = 'repositories'),
108 url(r'^license-groups/$', LicenseGroupsView.as_view(), name = 'license_groups'),
109 url(r'^$', EbuildsListView.as_view(), name = 'ebuilds'),
110 - url(r'^packages/(?:category/(?P<category>[^/]+)/)?(?:repo/(?P<repo>[^/]*)/)?(?:herd/(?P<herd>[^/]+)/)?(?:maintainer/(?P<maintainer_pk>[^/]+)/)?(?:order/(?P<order>[a-z]*)/)?(?P<rev>rev/)?$',
111 - PackagesListsView.as_view(), name = 'packages'),
112 + url(r'^packages/{0}$'.format(PackagesListsView.get_url_part()), PackagesListsView.as_view(), name = 'packages'),
113
114 # In Future I will write my onw URL Resolver !!!
115 #url(r'^package/(?:(?P<pk>\d+)|(?P<category>[^/]+)/(?P<name>[^/]+))/$', PackageDetailView.as_view(), name = 'package'),
116
117 diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py
118 index 2c75ed6..da330af 100644
119 --- a/gpackages/apps/packages/views.py
120 +++ b/gpackages/apps/packages/views.py
121 @@ -1,5 +1,6 @@
122 from django.views.generic import DetailView
123 -from generic.views import ContextListView, ContextTemplateView, ContextView
124 +from generic.views import ContextListView, ContextTemplateView, ContextView, \
125 + MultipleFilterListViewMixin
126 from models import CategoryModel, HerdsModel, MaintainerModel, \
127 RepositoryModel, LicenseGroupModel, EbuildModel, \
128 PackageModel
129 @@ -48,45 +49,11 @@ class EbuildsListView(ContextListView):
130 'package__virtual_package',
131 'package__virtual_package__category').prefetch_keywords(arches)
132
133 -# there is another dynamic filter for django, and it maybe better
134 -# but it is too big and i need just a litle of its functionly
135 -# but if this code have to be grove maybe i replace it to django-filter
136 -# application or another.
137 -def dynamic_filter(filter_set, allowed):
138 - result = {}
139 - for k in allowed.iterkeys():
140 - if k in filter_set:
141 - result[allowed[k]] = filter_set[k]
142 - return result
143 -
144 -def exclude_blank(res_dict):
145 - result = {}
146 - for k in res_dict.iterkeys():
147 - if res_dict[k]:
148 - result[k] = res_dict[k]
149 - return result
150 -
151 -def dynamic_order(args_list, allowed_list, reverse = None):
152 - order = allowed_list.get(None)
153 - if reverse is None:
154 - reverse = args_list.get('reverse', False)
155 - if args_list.get('order') in allowed_list:
156 - order = allowed_list.get(args_list.get('order'))
157 -
158 - if order == '?':
159 - return order
160 -
161 - if reverse and order[0] != '-':
162 - order = '-' + order
163 - elif reverse:
164 - order = order[1:]
165 - return order
166 -
167 -class PackagesListsView(ContextListView):
168 +class PackagesListsView(MultipleFilterListViewMixin, ContextListView):
169 allowed_filter = { 'category':'virtual_package__category__category',
170 'repo':'repository__name',
171 'herd':'herds__name',
172 - 'maintainer_pk': 'maintainers__pk',
173 + 'maintainer': 'maintainers__pk',
174 'license': 'licenses__name'
175 }
176
177 @@ -114,26 +81,6 @@ class PackagesListsView(ContextListView):
178 prefetch_related('repository'). \
179 prefetch_keywords(arches)
180
181 - def get_queryset(self):
182 - qs = dynamic_filter(exclude_blank(self.request.GET),
183 - self.allowed_filter)
184 - qs.update( dynamic_filter(exclude_blank(self.kwargs),
185 - self.allowed_filter) )
186 -
187 - if self.kwargs.get('rev') is None:
188 - reverse = bool(self.request.GET.get('rev',False))
189 - else:
190 - reverse = bool(self.kwargs.get('rev',False))
191 -
192 - if 'order' in self.request.GET:
193 - order = dynamic_order(self.request.GET, self.allowed_order,reverse)
194 - else:
195 - order = dynamic_order(self.kwargs, self.allowed_order, reverse)
196 - if self.kwargs.get('order') not in self.allowed_order:
197 - raise Http404('no such order')
198 -
199 - return self.base_queryset.filter(**qs).order_by(order)
200 -
201 class PackageDetailView(ContextView, DetailView):
202 arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86']
203 template_name = 'package.html'
204
205 diff --git a/gpackages/templates/maintainers.html b/gpackages/templates/maintainers.html
206 index ecd087e..9c01184 100644
207 --- a/gpackages/templates/maintainers.html
208 +++ b/gpackages/templates/maintainers.html
209 @@ -18,7 +18,7 @@
210 <tbody>
211 {% for maintainer in maintainers %}
212 <tr>
213 - <td class="nowrap"><a href="{% url 'packages' maintainer_pk=maintainer.pk %}">{{ maintainer.name|default:"Not represented" }}</a></td>
214 + <td class="nowrap"><a href="{% url 'packages' maintainer=maintainer.pk %}">{{ maintainer.name|default:"Not represented" }}</a></td>
215 <!-- email should be obfuscated -->
216 <td class="nowrap"><a href="{{ 'mailto:'|add:maintainer.email|obfuscate }}">{{ maintainer.email|obfuscate }}</a></td>
217 </tr>