]> git.ozlabs.org Git - patchwork/blobdiff - apps/patchwork/filters.py
tox: Add tox.ini file
[patchwork] / apps / patchwork / filters.py
index b0b204ed68623b2b2384e9e0b02b0ce36c765f93..8c9690eeaf22de4fbe152354ce1bdccea946cc8e 100644 (file)
@@ -22,6 +22,7 @@ from patchwork.models import Person, State
 from django.utils.safestring import mark_safe
 from django.utils.html import escape
 from django.contrib.auth.models import User
+from urllib import quote
 
 class Filter(object):
     def __init__(self, filters):
@@ -143,21 +144,20 @@ class SubmitterFilter(Filter):
 
 class StateFilter(Filter):
     param = 'state'
-    action_req_key = '!'
+    any_key = '*'
+    action_req_str = 'Action Required'
 
     def __init__(self, filters):
         super(StateFilter, self).__init__(filters)
         self.name = 'State'
         self.state = None
-        self.action_req = None
+        self.applied = True
 
     def _set_key(self, str):
-        self.action_req = None
         self.state = None
 
-        if str == self.action_req_key:
-            self.action_req = True
-            self.applied = True
+        if str == self.any_key:
+            self.applied = False
             return
 
         try:
@@ -168,34 +168,39 @@ class StateFilter(Filter):
         self.applied = True
 
     def kwargs(self):
-        if self.action_req == True:
+        if self.state is not None:
+            return {'state': self.state}
+        else:
             return {'state__in': \
                         State.objects.filter(action_required = True) \
                             .values('pk').query}
-        if self.state is not None:
-            return {'state': self.state}
 
     def condition(self):
         if self.state:
             return self.state.name
-        elif self.action_req == True:
-            return 'Action Required'
-        return None
-
+        return self.action_req_str
 
     def key(self):
-        if self.action_req == True:
-            return self.action_req_key
-        if self.state is None:
-            return None
-        return self.state.id
+        if self.state is not None:
+            return self.state.id
+        if not self.applied:
+            return '*'
+        return None
 
     def _form(self):
         str = '<select name="%s">' % self.param
-        str += '<option value="">any</option>'
-        if self.action_req_key:
-            str += '<option value="%s">Action Required</option>' % \
-                   self.action_req_key
+
+        selected = ''
+        if not self.applied:
+            selected = 'selected'
+        str += '<option %s value="%s">any</option>' % (selected, self.any_key)
+
+        selected = ''
+        if self.applied and self.state == None:
+            selected = 'selected'
+        str += '<option %s value="">%s</option>' % \
+               (selected, self.action_req_str)
+
         for state in State.objects.all():
             selected = ''
             if self.state and self.state == state:
@@ -209,6 +214,12 @@ class StateFilter(Filter):
     def form_function(self):
         return 'function(form) { return form.x.value }'
 
+    def url_without_me(self):
+        qs = self.filters.querystring_without_filter(self)
+        if qs != '?':
+            qs += '&'
+        return qs + '%s=%s' % (self.param, self.any_key)
+
 class SearchFilter(Filter):
     param = 'q'
     def __init__(self, filters):
@@ -309,21 +320,19 @@ class ArchiveFilter(Filter):
 
 class DelegateFilter(Filter):
     param = 'delegate'
+    no_delegate_key = '-'
+    no_delegate_str = 'Nobody'
     AnyDelegate = 1
 
     def __init__(self, filters):
         super(DelegateFilter, self).__init__(filters)
         self.name = 'Delegate'
         self.param = 'delegate'
-
-        # default to applied, but no delegate - this will result in patches with
-        # no delegate
         self.delegate = None
-        self.applied = True
 
     def _set_key(self, str):
-        if str == "*":
-            self.applied = False
+        if str == self.no_delegate_key:
+            self.applied = True
             self.delegate = None
             return
 
@@ -341,11 +350,11 @@ class DelegateFilter(Filter):
 
     def condition(self):
         if self.delegate:
-            return self.delegate.get_profile().name()
-        return 'Nobody'
+            return self.delegate.profile.name()
+        return self.no_delegate_str
 
     def _form(self):
-        delegates = User.objects.filter(userprofile__maintainer_projects =
+        delegates = User.objects.filter(profile__maintainer_projects =
                 self.filters.project)
 
         str = '<select name="delegate">'
@@ -354,13 +363,14 @@ class DelegateFilter(Filter):
         if not self.applied:
             selected = 'selected'
 
-        str += '<option %s value="*">------</option>' % selected
+        str += '<option %s value="">------</option>' % selected
 
         selected = ''
-        if self.delegate is None:
+        if self.applied and self.delegate is None:
             selected = 'selected'
 
-        str += '<option %s value="">Nobody</option>' % selected
+        str += '<option %s value="%s">%s</option>' % \
+                (selected, self.no_delegate_key, self.no_delegate_str)
 
         for d in delegates:
             selected = ''
@@ -368,7 +378,7 @@ class DelegateFilter(Filter):
                 selected = ' selected'
 
             str += '<option %s value="%s">%s</option>' % (selected,
-                    d.id, d.get_profile().name())
+                    d.id, d.profile.name())
         str += '</select>'
 
         return mark_safe(str)
@@ -377,14 +387,8 @@ class DelegateFilter(Filter):
         if self.delegate:
             return self.delegate.id
         if self.applied:
-            return None
-        return '*'
-
-    def url_without_me(self):
-        qs = self.filters.querystring_without_filter(self)
-        if qs != '?':
-            qs += '&'
-        return qs + ('%s=*' % self.param)
+            return self.no_delegate_key
+        return None
 
     def set_status(self, *args, **kwargs):
         if 'delegate' in kwargs:
@@ -435,13 +439,21 @@ class Filters:
 
         for (k, v) in self.dict.iteritems():
             if k not in params:
-                params[k] = v[0]
+                params[k] = v
 
         if remove is not None:
             if remove.param in params.keys():
                 del params[remove.param]
 
-        return '?' + '&'.join(['%s=%s' % x for x in params.iteritems()])
+        pairs = params.iteritems()
+
+        def sanitise(s):
+            if not isinstance(s, basestring):
+                s = unicode(s)
+            return quote(s.encode('utf-8'))
+
+        return '?' + '&'.join(['%s=%s' % (sanitise(k), sanitise(v))
+                                    for (k, v) in pairs])
 
     def querystring_without_filter(self, filter):
         return self.querystring(filter)