public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Slava Bacherikov" <slava@bacherikov.org.ua>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/apps/generic/
Date: Tue, 10 Jul 2012 23:13:58 +0000 (UTC)	[thread overview]
Message-ID: <1341857646.c2eb04db5bce7a617a8a9e88812303e2664c3778.bacher09@gentoo> (raw)

commit:     c2eb04db5bce7a617a8a9e88812303e2664c3778
Author:     Slava Bacherikov <slava <AT> bacher09 <DOT> org>
AuthorDate: Mon Jul  9 18:14:06 2012 +0000
Commit:     Slava Bacherikov <slava <AT> bacherikov <DOT> org <DOT> ua>
CommitDate: Mon Jul  9 18:14:06 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoo-packages.git;a=commit;h=c2eb04db

Add dynamic search by multiple args with __in

---
 gpackages/apps/generic/views.py  |   45 ++++++++++++++++++-------------------
 gpackages/apps/packages/views.py |    2 +
 2 files changed, 24 insertions(+), 23 deletions(-)

diff --git a/gpackages/apps/generic/views.py b/gpackages/apps/generic/views.py
index 098c2db..731c845 100644
--- a/gpackages/apps/generic/views.py
+++ b/gpackages/apps/generic/views.py
@@ -24,18 +24,25 @@ set_lang_view = SetLang.as_view()
 # but it is too big and i need just a litle of its functionly
 # but if this code have to be grove maybe i replace it to django-filter
 # application or another.
-def dynamic_filter(filter_set, allowed):
+def dynamic_filter(filter_set, allowed, many_set = set([])):
     result = {}
-    for k in allowed.iterkeys():
+    for k, v in allowed.iteritems():
         if k in filter_set:
-            result[allowed[k]] = filter_set[k]
+            vv = filter_set[k]
+            if k in many_set:
+                l = vv.split(',')
+                if len(l)>1:
+                    v += '__in'
+                    vv = l
+            result[v] = vv
     return result
 
-def exclude_blank(res_dict):
+def filter_req(filter_set, allowed):
     result = {}
-    for k in res_dict.iterkeys():
-        if res_dict[k]:
-            result[k] = res_dict[k]
+    for k in allowed.iterkeys():
+        v = filter_set.get(k)
+        if v:
+            result[k] = v
     return result
 
 def dynamic_order(args_list, allowed_list, reverse = None):
@@ -57,24 +64,15 @@ def dynamic_order(args_list, allowed_list, reverse = None):
 class MultipleFilterListViewMixin(object):
     allowed_filter = {}
     allowed_order = {}
-    m2m_filter = ()
+    allowed_many = set()
+    m2m_filter = set()
 
     base_queryset = None # should be queryset
 
-    def __init__(self, *args, **kwargs):
-        super(MultipleFilterListViewMixin, self).__init__(*args, **kwargs)
-        l =  []
-        for key, val in self.allowed_filter.iteritems():
-            if key in self.m2m_filter:
-                l.append(val)
-        self.m2m_set = frozenset(l)
-
     def get_queryset(self):
-        qs = dynamic_filter(exclude_blank(self.request.GET),
-                                        self.allowed_filter)
-        qs.update( dynamic_filter(exclude_blank(self.kwargs),
-                                        self.allowed_filter) )
-        
+        qs = filter_req(self.request.GET, self.allowed_filter)
+        qs.update(filter_req(self.kwargs, self.allowed_filter))
+
         if self.kwargs.get('rev') is None:
             reverse = bool(self.request.GET.get('rev',False))
         else:
@@ -87,10 +85,11 @@ class MultipleFilterListViewMixin(object):
             if self.kwargs.get('order') not in self.allowed_order:
                 raise Http404('no such order')
 
-        queryset = self.base_queryset.filter(**qs).order_by(order)
+        qa = dynamic_filter(qs, self.allowed_filter, self.allowed_many)
+        queryset = self.base_queryset.filter(**qa).order_by(order)
 
         for q in qs.iterkeys():
-            if q in self.m2m_set:
+            if q in self.m2m_filter:
                 queryset = queryset.distinct()
                 break
 

diff --git a/gpackages/apps/packages/views.py b/gpackages/apps/packages/views.py
index 32b4e7d..9fe1b94 100644
--- a/gpackages/apps/packages/views.py
+++ b/gpackages/apps/packages/views.py
@@ -115,6 +115,8 @@ class PackagesListsView(MultipleFilterListViewMixin, ContextArchListView):
                       'rand':'?', # it slow
                       None: '-updated_datetime'
                     }
+    allowed_many = set(['repo', 'use'])
+
     paginate_by = 40
     extra_context = {'page_name': 'Packages', 'arches': arches}
     template_name = 'packages.html'



             reply	other threads:[~2012-07-10 23:14 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-10 23:13 Slava Bacherikov [this message]
  -- strict thread matches above, loose matches on Subject: below --
2012-08-27 21:19 [gentoo-commits] proj/gentoo-packages:master commit in: gpackages/apps/packages/, gpackages/apps/generic/ Slava Bacherikov
2012-07-30 12:59 Slava Bacherikov
2012-07-14 20:15 Slava Bacherikov
2012-07-10 23:13 Slava Bacherikov
2012-06-30 21:02 Slava Bacherikov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1341857646.c2eb04db5bce7a617a8a9e88812303e2664c3778.bacher09@gentoo \
    --to=slava@bacherikov.org.ua \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox