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> |