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/templates/
Date: Fri, 29 Jun 2012 19:25:54
Message-Id: 1340997928.da1ad22983b481f3da07752ea18b1337955fd5b9.bacher09@gentoo
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>