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/
Date: Tue, 10 Jul 2012 23:14:14
Message-Id: 1341857646.c2eb04db5bce7a617a8a9e88812303e2664c3778.bacher09@gentoo
1 commit: c2eb04db5bce7a617a8a9e88812303e2664c3778
2 Author: Slava Bacherikov <slava <AT> bacher09 <DOT> org>
3 AuthorDate: Mon Jul 9 18:14:06 2012 +0000
4 Commit: Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
5 CommitDate: Mon Jul 9 18:14:06 2012 +0000
6 URL: http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=c2eb04db
7
8 Add dynamic search by multiple args with __in
9
10 ---
11 gpackages/apps/generic/views.py | 45 ++++++++++++++++++-------------------
12 gpackages/apps/packages/views.py | 2 +
13 2 files changed, 24 insertions(+), 23 deletions(-)
14
15 diff --git a/gpackages/apps/generic/views.py b/gpackages/apps/generic/views.py
16 index 098c2db..731c845 100644
17 --- a/gpackages/apps/generic/views.py
18 +++ b/gpackages/apps/generic/views.py
19 @@ -24,18 +24,25 @@ set_lang_view = SetLang.as_view()
20 # but it is too big and i need just a litle of its functionly
21 # but if this code have to be grove maybe i replace it to django-filter
22 # application or another.
23 -def dynamic_filter(filter_set, allowed):
24 +def dynamic_filter(filter_set, allowed, many_set = set([])):
25 result = {}
26 - for k in allowed.iterkeys():
27 + for k, v in allowed.iteritems():
28 if k in filter_set:
29 - result[allowed[k]] = filter_set[k]
30 + vv = filter_set[k]
31 + if k in many_set:
32 + l = vv.split(',')
33 + if len(l)>1:
34 + v += '__in'
35 + vv = l
36 + result[v] = vv
37 return result
38
39 -def exclude_blank(res_dict):
40 +def filter_req(filter_set, allowed):
41 result = {}
42 - for k in res_dict.iterkeys():
43 - if res_dict[k]:
44 - result[k] = res_dict[k]
45 + for k in allowed.iterkeys():
46 + v = filter_set.get(k)
47 + if v:
48 + result[k] = v
49 return result
50
51 def dynamic_order(args_list, allowed_list, reverse = None):
52 @@ -57,24 +64,15 @@ def dynamic_order(args_list, allowed_list, reverse = None):
53 class MultipleFilterListViewMixin(object):
54 allowed_filter = {}
55 allowed_order = {}
56 - m2m_filter = ()
57 + allowed_many = set()
58 + m2m_filter = set()
59
60 base_queryset = None # should be queryset
61
62 - def __init__(self, *args, **kwargs):
63 - super(MultipleFilterListViewMixin, self).__init__(*args, **kwargs)
64 - l = []
65 - for key, val in self.allowed_filter.iteritems():
66 - if key in self.m2m_filter:
67 - l.append(val)
68 - self.m2m_set = frozenset(l)
69 -
70 def get_queryset(self):
71 - qs = dynamic_filter(exclude_blank(self.request.GET),
72 - self.allowed_filter)
73 - qs.update( dynamic_filter(exclude_blank(self.kwargs),
74 - self.allowed_filter) )
75 -
76 + qs = filter_req(self.request.GET, self.allowed_filter)
77 + qs.update(filter_req(self.kwargs, self.allowed_filter))
78 +
79 if self.kwargs.get('rev') is None:
80 reverse = bool(self.request.GET.get('rev',False))
81 else:
82 @@ -87,10 +85,11 @@ class MultipleFilterListViewMixin(object):
83 if self.kwargs.get('order') not in self.allowed_order:
84 raise Http404('no such order')
85
86 - queryset = self.base_queryset.filter(**qs).order_by(order)
87 + qa = dynamic_filter(qs, self.allowed_filter, self.allowed_many)
88 + queryset = self.base_queryset.filter(**qa).order_by(order)
89
90 for q in qs.iterkeys():
91 - if q in self.m2m_set:
92 + if q in self.m2m_filter:
93 queryset = queryset.distinct()
94 break
95
96
97 diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py
98 index 32b4e7d..9fe1b94 100644
99 --- a/gpackages/apps/packages/views.py
100 +++ b/gpackages/apps/packages/views.py
101 @@ -115,6 +115,8 @@ class PackagesListsView(MultipleFilterListViewMixin, ContextArchListView):
102 'rand':'?', # it slow
103 None: '-updated_datetime'
104 }
105 + allowed_many = set(['repo', 'use'])
106 +
107 paginate_by = 40
108 extra_context = {'page_name': 'Packages', 'arches': arches}
109 template_name = 'packages.html'