Message ID | 20190604183139.4909299f@coco.lan |
---|---|
State | Accepted |
Headers | show |
Series | [v2] filters: re-add the possibility of filtering undelegated patches | expand |
Thanks. Fixed some style issues and reworked the release note then applied it. Stephen On Tue, 2019-06-04 at 18:31 -0300, Mauro Carvalho Chehab wrote: > > Forwarded message: > > Date: Tue, 4 Jun 2019 15:07:58 -0300 > From: Mauro Carvalho Chehab <mchehab+samsung@kernel.org> > To: patchwork@lists.ozlabs.org > Subject: [PATCH v2] filters: re-add the possibility of filtering undelegated patches > > > The filters.py redesign that happened for patchwork 1.1 removed > a functionality that we use a lot: to filter patches that weren't > delegated to anyone. > > Also, it is a way harder to find someone to delegate with a free > text input. Use, instead a combo-box just like before. > > Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com> > > diff --git a/patchwork/filters.py b/patchwork/filters.py > index 79aaea437c6e..11d00390145a 100644 > --- a/patchwork/filters.py > +++ b/patchwork/filters.py > @@ -385,6 +385,7 @@ class ArchiveFilter(Filter): > class DelegateFilter(Filter): > name = 'Delegate' > param = 'delegate' > + no_delegate_str = 'Nobody' > ANY_DELEGATE = object() > > def __init__(self, filters): > @@ -416,6 +417,11 @@ class DelegateFilter(Filter): > if not key: > return > > + if key == self.no_delegate_str: > + self.delegate_match = key > + self.applied = True > + return > + > try: > self.delegate = User.objects.get(id=int(key)) > except (ValueError, User.DoesNotExist): > @@ -436,6 +442,9 @@ class DelegateFilter(Filter): > if self.delegate: > return {'delegate': self.delegate} > > + if self.delegate_match == self.no_delegate_str: > + return {'delegate__username__isnull': True} > + > if self.delegate_match: > return {'delegate__username__icontains': self.delegate_match} > > @@ -447,8 +456,33 @@ class DelegateFilter(Filter): > return mark_safe('<input type="hidden" value="%s">%s' % ( > self.param, self.condition)) > > - return mark_safe('<input type="text" name="delegate" ' > - 'id="delegate_input" class="form-control">') > + delegates = User.objects.filter(profile__maintainer_projects__isnull = False) > + > + str = '<select name="delegate">' > + > + selected = '' > + if not self.applied: > + selected = 'selected' > + > + str += '<option %s value="">------</option>' % selected > + > + selected = '' > + if self.applied and self.delegate is None: > + selected = 'selected' > + > + str += '<option %s value="%s">%s</option>' % ( > + selected, self.no_delegate_str, self.no_delegate_str) > + > + for delegate in delegates: > + selected = '' > + if delegate == self.delegate: > + selected = ' selected' > + > + str += '<option %s value="%s">%s</option>' % (selected, > + delegate.id, delegate.username) > + str += '</select>' > + > + return mark_safe(str) > > def set_status(self, *args, **kwargs): > if 'delegate' in kwargs: > diff --git a/patchwork/templates/patchwork/partials/filters.html b/patchwork/templates/patchwork/partials/filters.html > index 41ed2c268e46..e89c4d0f6284 100644 > --- a/patchwork/templates/patchwork/partials/filters.html > +++ b/patchwork/templates/patchwork/partials/filters.html > @@ -76,44 +76,6 @@ $(document).ready(function() { > }); > } > }); > - > - $('#delegate_input').selectize({ > - plugins: ['enter_key_submit'], > - maxItems: 1, > - persist: false, > - onInitialize: function() { > - this.on('submit', function() { > - if (!this.items.length) > - this.$input.val(this.lastValue); > - this.$input.closest('form').submit(); > - }, this); > - }, > -{% if "delegate" in filters.applied_filters %} > -{% with delegate_filter=filters.applied_filters.delegate %} > - options: [ > - { > - value: "{{ delegate_filter.key }}", > - text: "{{ delegate_filter.condition }}", > - }, > - ], > - items: ["{{ delegate_filter.key }}"], > -{% endwith %} > -{% endif %} > - load: function(query, callback) { > - req = $.ajax({ > - url: "{% url 'api-delegates' %}", > - data: {q: query, l: 10}, > - error: function() { > - callback(); > - }, > - success: function(res) { > - callback($.map(res, function (obj) { > - return {value: obj.pk, text: obj.name}; > - })); > - } > - }); > - } > - }); > }); > </script> > > diff --git a/releasenotes/notes/Re-added-delegate-to-nobody-filter-and-use-select-for-delegated-people-04a81a4a914965d8.yaml b/releasenotes/notes/Re-added-delegate-to-nobody-filter-and-use-select-for-delegated-people-04a81a4a914965d8.yaml > new file mode 100644 > index 000000000000..eb4246e5600e > --- /dev/null > +++ b/releasenotes/notes/Re-added-delegate-to-nobody-filter-and-use-select-for-delegated-people-04a81a4a914965d8.yaml > @@ -0,0 +1,11 @@ > +--- > +prelude: > > + In the past, Patchwork used to support filtering patches that weren't > + delegated to anyone. This feature was removed in 2015, as part of a > + patch designed to support deletation to anyone. Yet, the feature didn't > + scale and got removed in 2016. So, re-introduce the old logic, fixing > + a regression. > +fixes: > + - | > + Fix a regression introduced by changeset > + f439f5414206 ("Add delegate filter autocomplete support") > > > Thanks, > Mauro > > > > Thanks, > Mauro > _______________________________________________ > Patchwork mailing list > Patchwork@lists.ozlabs.org > https://lists.ozlabs.org/listinfo/patchwork
diff --git a/patchwork/filters.py b/patchwork/filters.py index 79aaea437c6e..11d00390145a 100644 --- a/patchwork/filters.py +++ b/patchwork/filters.py @@ -385,6 +385,7 @@ class ArchiveFilter(Filter): class DelegateFilter(Filter): name = 'Delegate' param = 'delegate' + no_delegate_str = 'Nobody' ANY_DELEGATE = object() def __init__(self, filters): @@ -416,6 +417,11 @@ class DelegateFilter(Filter): if not key: return + if key == self.no_delegate_str: + self.delegate_match = key + self.applied = True + return + try: self.delegate = User.objects.get(id=int(key)) except (ValueError, User.DoesNotExist): @@ -436,6 +442,9 @@ class DelegateFilter(Filter): if self.delegate: return {'delegate': self.delegate} + if self.delegate_match == self.no_delegate_str: + return {'delegate__username__isnull': True} + if self.delegate_match: return {'delegate__username__icontains': self.delegate_match} @@ -447,8 +456,33 @@ class DelegateFilter(Filter): return mark_safe('<input type="hidden" value="%s">%s' % ( self.param, self.condition)) - return mark_safe('<input type="text" name="delegate" ' - 'id="delegate_input" class="form-control">') + delegates = User.objects.filter(profile__maintainer_projects__isnull = False) + + str = '<select name="delegate">' + + selected = '' + if not self.applied: + selected = 'selected' + + str += '<option %s value="">------</option>' % selected + + selected = '' + if self.applied and self.delegate is None: + selected = 'selected' + + str += '<option %s value="%s">%s</option>' % ( + selected, self.no_delegate_str, self.no_delegate_str) + + for delegate in delegates: + selected = '' + if delegate == self.delegate: + selected = ' selected' + + str += '<option %s value="%s">%s</option>' % (selected, + delegate.id, delegate.username) + str += '</select>' + + return mark_safe(str) def set_status(self, *args, **kwargs): if 'delegate' in kwargs: diff --git a/patchwork/templates/patchwork/partials/filters.html b/patchwork/templates/patchwork/partials/filters.html index 41ed2c268e46..e89c4d0f6284 100644 --- a/patchwork/templates/patchwork/partials/filters.html +++ b/patchwork/templates/patchwork/partials/filters.html @@ -76,44 +76,6 @@ $(document).ready(function() { }); } }); - - $('#delegate_input').selectize({ - plugins: ['enter_key_submit'], - maxItems: 1, - persist: false, - onInitialize: function() { - this.on('submit', function() { - if (!this.items.length) - this.$input.val(this.lastValue); - this.$input.closest('form').submit(); - }, this); - }, -{% if "delegate" in filters.applied_filters %} -{% with delegate_filter=filters.applied_filters.delegate %} - options: [ - { - value: "{{ delegate_filter.key }}", - text: "{{ delegate_filter.condition }}", - }, - ], - items: ["{{ delegate_filter.key }}"], -{% endwith %} -{% endif %} - load: function(query, callback) { - req = $.ajax({ - url: "{% url 'api-delegates' %}", - data: {q: query, l: 10}, - error: function() { - callback(); - }, - success: function(res) { - callback($.map(res, function (obj) { - return {value: obj.pk, text: obj.name}; - })); - } - }); - } - }); }); </script> diff --git a/releasenotes/notes/Re-added-delegate-to-nobody-filter-and-use-select-for-delegated-people-04a81a4a914965d8.yaml b/releasenotes/notes/Re-added-delegate-to-nobody-filter-and-use-select-for-delegated-people-04a81a4a914965d8.yaml new file mode 100644 index 000000000000..eb4246e5600e --- /dev/null +++ b/releasenotes/notes/Re-added-delegate-to-nobody-filter-and-use-select-for-delegated-people-04a81a4a914965d8.yaml @@ -0,0 +1,11 @@ +--- +prelude: > + In the past, Patchwork used to support filtering patches that weren't + delegated to anyone. This feature was removed in 2015, as part of a + patch designed to support deletation to anyone. Yet, the feature didn't + scale and got removed in 2016. So, re-introduce the old logic, fixing + a regression. +fixes: + - | + Fix a regression introduced by changeset + f439f5414206 ("Add delegate filter autocomplete support")