1 |
commit: da1ad22983b481f3da07752ea18b1337955fd5b9 |
2 |
Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org> |
3 |
AuthorDate: Fri Jun 29 19:25:28 2012 +0000 |
4 |
Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua> |
5 |
CommitDate: Fri Jun 29 19:25:28 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=da1ad229 |
7 |
|
8 |
Add dynamic packages filter |
9 |
|
10 |
--- |
11 |
gpackages/apps/packages/urls.py | 3 +- |
12 |
gpackages/apps/packages/views.py | 68 ++++++++++++++++++++++++++++++++- |
13 |
gpackages/templates/categories.html | 3 +- |
14 |
gpackages/templates/herds.html | 4 +- |
15 |
gpackages/templates/maintainers.html | 3 +- |
16 |
gpackages/templates/repositories.html | 3 +- |
17 |
6 files changed, 77 insertions(+), 7 deletions(-) |
18 |
|
19 |
diff --git a/gpackages/apps/packages/urls.py b/gpackages/apps/packages/urls.py |
20 |
index ffb16ca..f597026 100644 |
21 |
--- a/gpackages/apps/packages/urls.py |
22 |
+++ b/gpackages/apps/packages/urls.py |
23 |
@@ -10,7 +10,8 @@ urlpatterns = patterns('', |
24 |
url(r'^repositories/$', RepositoriesListView.as_view(), name = 'repositories'), |
25 |
url(r'^license-groups/$', LicenseGroupsView.as_view(), name = 'license_groups'), |
26 |
url(r'^$', EbuildsListView.as_view(), name = 'ebuilds'), |
27 |
- url(r'^packages/$', PackagesListsView.as_view(), name = 'packages'), |
28 |
+ url(r'^packages/(?:category/(?P<category>[^/]+)/)?(?:repo/(?P<repo>[^/]*)/)?(?:herd/(?P<herd>[^/]+)/)?(?:maintainer/(?P<maintainer_pk>[^/]+)/)?(?:order/(?P<order>[a-z]*)/)?(?P<rev>rev/)?$', |
29 |
+ PackagesListsView.as_view(), name = 'packages'), |
30 |
|
31 |
# In Future I will write my onw URL Resolver !!! |
32 |
#url(r'^package/(?:(?P<pk>\d+)|(?P<category>[^/]+)/(?P<name>[^/]+))/$', PackageDetailView.as_view(), name = 'package'), |
33 |
|
34 |
diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py |
35 |
index 2ec2758..2c75ed6 100644 |
36 |
--- a/gpackages/apps/packages/views.py |
37 |
+++ b/gpackages/apps/packages/views.py |
38 |
@@ -48,7 +48,53 @@ class EbuildsListView(ContextListView): |
39 |
'package__virtual_package', |
40 |
'package__virtual_package__category').prefetch_keywords(arches) |
41 |
|
42 |
+# there is another dynamic filter for django, and it maybe better |
43 |
+# but it is too big and i need just a litle of its functionly |
44 |
+# but if this code have to be grove maybe i replace it to django-filter |
45 |
+# application or another. |
46 |
+def dynamic_filter(filter_set, allowed): |
47 |
+ result = {} |
48 |
+ for k in allowed.iterkeys(): |
49 |
+ if k in filter_set: |
50 |
+ result[allowed[k]] = filter_set[k] |
51 |
+ return result |
52 |
+ |
53 |
+def exclude_blank(res_dict): |
54 |
+ result = {} |
55 |
+ for k in res_dict.iterkeys(): |
56 |
+ if res_dict[k]: |
57 |
+ result[k] = res_dict[k] |
58 |
+ return result |
59 |
+ |
60 |
+def dynamic_order(args_list, allowed_list, reverse = None): |
61 |
+ order = allowed_list.get(None) |
62 |
+ if reverse is None: |
63 |
+ reverse = args_list.get('reverse', False) |
64 |
+ if args_list.get('order') in allowed_list: |
65 |
+ order = allowed_list.get(args_list.get('order')) |
66 |
+ |
67 |
+ if order == '?': |
68 |
+ return order |
69 |
+ |
70 |
+ if reverse and order[0] != '-': |
71 |
+ order = '-' + order |
72 |
+ elif reverse: |
73 |
+ order = order[1:] |
74 |
+ return order |
75 |
+ |
76 |
class PackagesListsView(ContextListView): |
77 |
+ allowed_filter = { 'category':'virtual_package__category__category', |
78 |
+ 'repo':'repository__name', |
79 |
+ 'herd':'herds__name', |
80 |
+ 'maintainer_pk': 'maintainers__pk', |
81 |
+ 'license': 'licenses__name' |
82 |
+ } |
83 |
+ |
84 |
+ allowed_order = { 'create': 'created_datetime', |
85 |
+ 'update': 'updated_datetime', |
86 |
+ 'rand':'?', # it slow |
87 |
+ None: '-updated_datetime' |
88 |
+ } |
89 |
arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86'] |
90 |
paginate_by = 40 |
91 |
extra_context = {'page_name': 'Packages', 'arches': arches} |
92 |
@@ -62,12 +108,32 @@ class PackagesListsView(ContextListView): |
93 |
#INNER JOIN packages_virtualpackagemodel vp |
94 |
#ON( `vp`.id = t.virtual_package_id) INNER JOIN `packages_categorymodel` cp |
95 |
#ON (vp.category_id = cp.id); |
96 |
- queryset = PackageModel.objects.all(). \ |
97 |
+ base_queryset = PackageModel.objects.all(). \ |
98 |
select_related('virtual_package', |
99 |
'virtual_package__category'). \ |
100 |
prefetch_related('repository'). \ |
101 |
prefetch_keywords(arches) |
102 |
|
103 |
+ def get_queryset(self): |
104 |
+ qs = dynamic_filter(exclude_blank(self.request.GET), |
105 |
+ self.allowed_filter) |
106 |
+ qs.update( dynamic_filter(exclude_blank(self.kwargs), |
107 |
+ self.allowed_filter) ) |
108 |
+ |
109 |
+ if self.kwargs.get('rev') is None: |
110 |
+ reverse = bool(self.request.GET.get('rev',False)) |
111 |
+ else: |
112 |
+ reverse = bool(self.kwargs.get('rev',False)) |
113 |
+ |
114 |
+ if 'order' in self.request.GET: |
115 |
+ order = dynamic_order(self.request.GET, self.allowed_order,reverse) |
116 |
+ else: |
117 |
+ order = dynamic_order(self.kwargs, self.allowed_order, reverse) |
118 |
+ if self.kwargs.get('order') not in self.allowed_order: |
119 |
+ raise Http404('no such order') |
120 |
+ |
121 |
+ return self.base_queryset.filter(**qs).order_by(order) |
122 |
+ |
123 |
class PackageDetailView(ContextView, DetailView): |
124 |
arches = ['alpha', 'amd64', 'arm', 'hppa', 'ia64', 'ppc', 'ppc64', 'sparc', 'x86'] |
125 |
template_name = 'package.html' |
126 |
|
127 |
diff --git a/gpackages/templates/categories.html b/gpackages/templates/categories.html |
128 |
index 4163e90..52cfd1f 100644 |
129 |
--- a/gpackages/templates/categories.html |
130 |
+++ b/gpackages/templates/categories.html |
131 |
@@ -1,4 +1,5 @@ |
132 |
{% extends "base.html" %} |
133 |
+{% load url from future %} |
134 |
|
135 |
{% block content %} |
136 |
|
137 |
@@ -16,7 +17,7 @@ |
138 |
<tbody> |
139 |
{% for category in categories %} |
140 |
<tr> |
141 |
- <td class="nowrap"><a href="#">{{ category.category }}</a></td> |
142 |
+ <td class="nowrap"><a href="{% url 'packages' category=category.category %}">{{ category.category }}</a></td> |
143 |
<td>{{ category.description|default_if_none:"" }}</td> |
144 |
</tr> |
145 |
{% endfor %} |
146 |
|
147 |
diff --git a/gpackages/templates/herds.html b/gpackages/templates/herds.html |
148 |
index 5252576..b767967 100644 |
149 |
--- a/gpackages/templates/herds.html |
150 |
+++ b/gpackages/templates/herds.html |
151 |
@@ -1,6 +1,6 @@ |
152 |
{% extends "base.html" %} |
153 |
{% load packages %} |
154 |
- |
155 |
+{% load url from future %} |
156 |
{% block content %} |
157 |
|
158 |
<table class='table table-striped table-hover'> |
159 |
@@ -19,7 +19,7 @@ |
160 |
<tbody> |
161 |
{% for herd in herds %} |
162 |
<tr> |
163 |
- <td class="nowrap"><a href="#">{{ herd.name }}</a></td> |
164 |
+ <td class="nowrap"><a href="{% url 'packages' herd=herd.name %}">{{ herd.name }}</a></td> |
165 |
<!-- email should be obfuscated --> |
166 |
<td class="nowrap"><a href="{{ 'mailto:'|add:herd.email|obfuscate }}">{{ herd.email|obfuscate }}</a></td> |
167 |
<td>{{ herd.description|default_if_none:"" }}</td> |
168 |
|
169 |
diff --git a/gpackages/templates/maintainers.html b/gpackages/templates/maintainers.html |
170 |
index 5646c99..ecd087e 100644 |
171 |
--- a/gpackages/templates/maintainers.html |
172 |
+++ b/gpackages/templates/maintainers.html |
173 |
@@ -1,5 +1,6 @@ |
174 |
{% extends "base.html" %} |
175 |
{% load packages %} |
176 |
+{% load url from future %} |
177 |
|
178 |
{% block content %} |
179 |
|
180 |
@@ -17,7 +18,7 @@ |
181 |
<tbody> |
182 |
{% for maintainer in maintainers %} |
183 |
<tr> |
184 |
- <td class="nowrap"><a href="#">{{ maintainer.name|default:"Not represented" }}</a></td> |
185 |
+ <td class="nowrap"><a href="{% url 'packages' maintainer_pk=maintainer.pk %}">{{ maintainer.name|default:"Not represented" }}</a></td> |
186 |
<!-- email should be obfuscated --> |
187 |
<td class="nowrap"><a href="{{ 'mailto:'|add:maintainer.email|obfuscate }}">{{ maintainer.email|obfuscate }}</a></td> |
188 |
</tr> |
189 |
|
190 |
diff --git a/gpackages/templates/repositories.html b/gpackages/templates/repositories.html |
191 |
index 0fdb42a..591141f 100644 |
192 |
--- a/gpackages/templates/repositories.html |
193 |
+++ b/gpackages/templates/repositories.html |
194 |
@@ -1,4 +1,5 @@ |
195 |
{% extends "base.html" %} |
196 |
+{% load url from future %} |
197 |
|
198 |
{% block content %} |
199 |
|
200 |
@@ -18,7 +19,7 @@ |
201 |
<tbody> |
202 |
{% for repository in repositories %} |
203 |
<tr> |
204 |
- <td class="nowrap"><a href="#">{{ repository.name }}</a></td> |
205 |
+ <td class="nowrap"><a href="{% url 'packages' repo=repository.name %}">{{ repository.name }}</a></td> |
206 |
<td>{{ repository.description|default_if_none:"" }}</td> |
207 |
<td>{{ repository.updated_datetime|date:"d m Y H:i:s" }}</td> |
208 |
</tr> |