diff mbox series

[v2] filters: re-add the possibility of filtering undelegated patches

Message ID 20190604183139.4909299f@coco.lan
State Accepted
Headers show
Series [v2] filters: re-add the possibility of filtering undelegated patches | expand

Commit Message

Mauro Carvalho Chehab June 4, 2019, 9:31 p.m. UTC
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>



Thanks,
Mauro



Thanks,
Mauro

Comments

Stephen Finucane June 5, 2019, 10:28 a.m. UTC | #1
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 mbox series

Patch

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")