X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=apps%2Fpatchwork%2Ffilters.py;h=52fc03fe19d655f78324cea43ef3533a7d232b6e;hb=56e2243f3be7e859666ce0e4e1a8b8b94444f8d4;hp=f7fb6525c133b3fb878592e9dcd33034c2e8354e;hpb=c561ebe710d6e6a43aa4afc6c2036a215378ce87;p=patchwork
diff --git a/apps/patchwork/filters.py b/apps/patchwork/filters.py
index f7fb652..52fc03f 100644
--- a/apps/patchwork/filters.py
+++ b/apps/patchwork/filters.py
@@ -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):
@@ -79,7 +80,7 @@ class SubmitterFilter(Filter):
def __init__(self, filters):
super(SubmitterFilter, self).__init__(filters)
self.name = 'Submitter'
- self.person = None
+ self.person = None
self.person_match = None
def _set_key(self, str):
@@ -127,14 +128,14 @@ class SubmitterFilter(Filter):
return ''
def _form(self):
- name = ''
- if self.person:
- name = self.person.name
- return mark_safe((' ' % escape(name)) +
- '')
+ '')
def key(self):
if self.person:
@@ -143,12 +144,22 @@ class SubmitterFilter(Filter):
class StateFilter(Filter):
param = 'state'
+ any_key = '*'
+ action_req_str = 'Action Required'
+
def __init__(self, filters):
super(StateFilter, self).__init__(filters)
self.name = 'State'
- self.state = None
+ self.state = None
+ self.applied = True
def _set_key(self, str):
+ self.state = None
+
+ if str == self.any_key:
+ self.applied = False
+ return
+
try:
self.state = State.objects.get(id=int(str))
except:
@@ -157,44 +168,70 @@ class StateFilter(Filter):
self.applied = True
def kwargs(self):
- return {'state': self.state}
+ if self.state is not None:
+ return {'state': self.state}
+ else:
+ return {'state__in': \
+ State.objects.filter(action_required = True) \
+ .values('pk').query}
def condition(self):
- return self.state.name
+ if self.state:
+ return self.state.name
+ return self.action_req_str
def key(self):
- 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 = ''
return mark_safe(str);
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):
super(SearchFilter, self).__init__(filters)
self.name = 'Search'
self.param = 'q'
- self.search = None
+ self.search = None
def _set_key(self, str):
- str = str.strip()
- if str == '':
- return
+ str = str.strip()
+ if str == '':
+ return
self.search = str
self.applied = True
@@ -208,11 +245,11 @@ class SearchFilter(Filter):
return self.search
def _form(self):
- value = ''
- if self.search:
- value = escape(self.search)
+ value = ''
+ if self.search:
+ value = escape(self.search)
return mark_safe('' %\
- (self.param, value))
+ (self.param, value))
def form_function(self):
return mark_safe('function(form) { return form.x.value }')
@@ -253,9 +290,9 @@ class ArchiveFilter(Filter):
return self.description_map[self.archive_state]
def key(self):
- if self.archive_state == False:
- return None
- return self.param_map[self.archive_state]
+ if self.archive_state == False:
+ return None
+ return self.param_map[self.archive_state]
def _form(self):
s = ''
@@ -283,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
@@ -316,7 +351,7 @@ class DelegateFilter(Filter):
def condition(self):
if self.delegate:
return self.delegate.get_profile().name()
- return 'Nobody'
+ return self.no_delegate_str
def _form(self):
delegates = User.objects.filter(userprofile__maintainer_projects =
@@ -328,13 +363,14 @@ class DelegateFilter(Filter):
if not self.applied:
selected = 'selected'
- str += '' % selected
+ str += '' % selected
selected = ''
- if self.delegate is None:
+ if self.applied and self.delegate is None:
selected = 'selected'
- str += '' % selected
+ str += '' % \
+ (selected, self.no_delegate_key, self.no_delegate_str)
for d in delegates:
selected = ''
@@ -351,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:
@@ -402,20 +432,21 @@ class Filters:
def params(self):
return [ (f.param, f.key()) for f in self._filters \
- if f.key() is not None ]
+ if f.key() is not None ]
def querystring(self, remove = None):
params = dict(self.params())
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()])
+ return '?' + '&'.join(['%s=%s' % (quote(k), quote(v))
+ for (k,v) in params.iteritems()])
def querystring_without_filter(self, filter):
return self.querystring(filter)