X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=apps%2Fpatchwork%2Ffilters.py;h=8c9690eeaf22de4fbe152354ce1bdccea946cc8e;hb=a48f76a2d3a98c21d4b37f19cf84073e77db55c8;hp=f7fb6525c133b3fb878592e9dcd33034c2e8354e;hpb=c561ebe710d6e6a43aa4afc6c2036a215378ce87;p=patchwork diff --git a/apps/patchwork/filters.py b/apps/patchwork/filters.py index f7fb652..8c9690e 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 @@ -315,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 = '' return mark_safe(str) @@ -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,28 @@ 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()]) + 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)