From nobody Fri Oct 18 08:38:25 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=patchew-devel-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=patchew-devel-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1542766181948890.827495300414; Tue, 20 Nov 2018 18:09:41 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 41461811D9; Wed, 21 Nov 2018 02:09:41 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 356C55885A; Wed, 21 Nov 2018 02:09:41 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 2AA773F953; Wed, 21 Nov 2018 02:09:41 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id wAL29d6h006082 for ; Tue, 20 Nov 2018 21:09:39 -0500 Received: by smtp.corp.redhat.com (Postfix) id 52AE666079; Wed, 21 Nov 2018 02:09:39 +0000 (UTC) Received: from magic.redhat.com (ovpn-12-78.pek2.redhat.com [10.72.12.78]) by smtp.corp.redhat.com (Postfix) with ESMTP id B05F266077; Wed, 21 Nov 2018 02:09:33 +0000 (UTC) From: Fam Zheng To: patchew-devel@redhat.com Date: Wed, 21 Nov 2018 10:08:36 +0800 Message-Id: <20181121020846.7875-7-famz@redhat.com> In-Reply-To: <20181121020846.7875-1-famz@redhat.com> References: <20181121020846.7875-1-famz@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: patchew-devel@redhat.com Cc: ymankad@redhat.com, armbru@redhat.com Subject: [Patchew-devel] [PATCH 06/16] maintainer: Queue operations in extra ops X-BeenThere: patchew-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Patchew development and discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: patchew-devel-bounces@redhat.com Errors-To: patchew-devel-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Wed, 21 Nov 2018 02:09:41 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Aside 'review' and 'reject' we add operations to add and drop whole series from/to ustom queues. Initially a "add to new queue..." link is shown in the extra ops menu, which prompts for a queue name before creating and adding the current series there. Implementing the prompt takes a little enhancement to the HTML js. Once added to a queue, the series will show a new op "drop from queue '...'". A convenient op will show in the ops, "add to queue 'foo'", if the user has previously created and added some other series. This saves typing the queue name. Signed-off-by: Fam Zheng --- mods/maintainer.py | 156 +++++++++++++++++++++++-------- www/templates/series-detail.html | 30 +++++- 2 files changed, 145 insertions(+), 41 deletions(-) diff --git a/mods/maintainer.py b/mods/maintainer.py index 7f4f5fe..d5d7c8c 100644 --- a/mods/maintainer.py +++ b/mods/maintainer.py @@ -8,17 +8,31 @@ # This work is licensed under the MIT License. Please see the LICENSE fil= e or # http://opensource.org/licenses/MIT. =20 +import re from django.conf.urls import url -from django.http import Http404, HttpResponseRedirect +from django.http import Http404, HttpResponseRedirect, HttpResponseBadRequ= est from django.urls import reverse from mod import PatchewModule -from api.models import Message, Queue +from api.models import Message, Queue, WatchedQuery =20 class MaintainerModule(PatchewModule): """ Project maintainer related tasks """ =20 name =3D "maintainer" =20 + def _add_to_queue(self, user, m, queue): + for x in [m] + list(m.get_patches()): + q, created =3D Queue.objects.get_or_create(user=3Duser, messag= e=3Dx, name=3Dqueue) + if created: + emit_event("MessageQueued", message=3Dx, queue=3Dq) + + def _drop_from_queue(self, user, m, queue): + query =3D Queue.objects.filter(user=3Duser, message__in=3Dm.get_pa= tches() + [m], + name=3Dqueue) + for q in query: + emit_event("MessageDropping", message=3Dq.message, queue=3Dq) + q.delete() + def _update_review_state(self, request, message_id, accept): if not request.user.is_authenticated: return HttpResponseForbidden() @@ -69,6 +83,27 @@ class MaintainerModule(PatchewModule): def www_view_clear_reviewed(self, request, message_id): return self._delete_review(request, message_id) =20 + def www_view_add_to_queue(self, request, message_id): + if not request.user.is_authenticated: + raise PermissionDenied() + m =3D Message.objects.filter(message_id=3Dmessage_id).first() + if not m: + raise Http404("Series not found") + queue =3D request.GET.get("queue") + if not queue or re.match(r'[^_a-zA-Z0-9\-]', queue): + return HttpResponseBadRequest("Invalid queue name") + self._add_to_queue(request.user, m, queue) + return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + + def www_view_drop_from_queue(self, request, queue, message_id): + if not request.user.is_authenticated: + raise PermissionDenied() + m =3D Message.objects.filter(message_id=3Dmessage_id).first() + if not m: + raise Http404("Series not found") + self._drop_from_queue(request.user, m, queue) + return HttpResponseRedirect(request.META.get('HTTP_REFERER')) + def www_url_hook(self, urlpatterns): urlpatterns.append(url(r"^mark-as-merged/(?P.*)/", self.www_view_mark_as_merged, @@ -85,50 +120,91 @@ class MaintainerModule(PatchewModule): urlpatterns.append(url(r"^clear-reviewed/(?P.*)/", self.www_view_clear_reviewed, name=3D"clear-reviewed")) + urlpatterns.append(url(r"^add-to-queue/(?P.*)/", + self.www_view_add_to_queue, + name=3D"add-to-queue")) + urlpatterns.append(url(r"^drop-from-queue/(?P[^/]*)/(?P.*)/", + self.www_view_drop_from_queue, + name=3D"drop-from-queue")) =20 def prepare_message_hook(self, request, message, detailed): if not detailed or not request.user.is_authenticated: return - if message.is_series_head: - if message.is_merged: - message.extra_ops.append({"url": reverse("clear-merged", - kwargs=3D{"messag= e_id": message.message_id}), - "icon": "eraser", - "title": "Clear merged state"}) + if not message.is_series_head: + return + if message.is_merged: + message.extra_ops.append({"url": reverse("clear-merged", + kwargs=3D{"message_id= ": message.message_id}), + "icon": "eraser", + "title": "Clear merged state"}) + else: + message.extra_ops.append({"url": reverse("mark-as-merged", + kwargs=3D{"message_id= ": message.message_id}), + "icon": "check", + "title": "Mark series as merged"}) + + accepted =3D False + rejected =3D False + queues =3D [] + for r in Queue.objects.filter(user=3Drequest.user, message=3Dmessa= ge): + if r.name =3D=3D 'accept': + message.extra_status.append({ + "icon": "fa-check", + "html": 'The series is marked for merging' + }) + accepted =3D True + elif r.name =3D=3D 'reject': + message.extra_status.append({ + "icon": "fa-times", + "html": 'The series is marked as rejected' + }) + rejected =3D True else: - message.extra_ops.append({"url": reverse("mark-as-merged", - kwargs=3D{"messag= e_id": message.message_id}), - "icon": "check", - "title": "Mark series as merged"= }) - - r =3D Queue.objects.filter(user=3Drequest.user, message=3Dmessage, - name__in=3D['accept', 'reject']).first() - if r and r.name =3D=3D 'accept': - message.extra_status.append({ - "icon": "fa-check", - "html": 'The series is marked for merging' - }) - else: - if message.is_series_head: - message.extra_ops.append({"url": reverse("mark-as-accepted= ", - kwargs=3D{"messag= e_id": message.message_id}), - "icon": "check", - "title": "Mark series as accepte= d"}) - - if r and r.name =3D=3D 'reject': - message.extra_status.append({ - "icon": "fa-times", - "html": 'The series is marked as rejected' - }) - else: - if message.is_series_head: - message.extra_ops.append({"url": reverse("mark-as-rejected= ", - kwargs=3D{"messag= e_id": message.message_id}), - "icon": "times", - "title": "Mark series as rejecte= d"}) - - if r: + queues.append(r.name) + message.extra_ops.append({ + "url": reverse("drop-from-queue", + kwargs=3D{ + "queue": r.name, + "message_id": message.message_id + }), + "icon": "remove", + "title": "Drop from queue '%s'" % r.nam= e}) + if not accepted: + message.extra_ops.append({"url": reverse("mark-as-accepted", + kwargs=3D{"message_id= ": message.message_id}), + "icon": "check", + "title": "Mark series as accepted"}) + if not rejected: + message.extra_ops.append({"url": reverse("mark-as-rejected", + kwargs=3D{"message_id= ": message.message_id}), + "icon": "times", + "title": "Mark series as rejected"}) + if accepted or rejected: message.extra_ops.append({"url": reverse("clear-reviewed", kwargs=3D{"message_id= ": message.message_id}), "icon": "eraser", "title": "Clear review state"}) + + if queues: + message.extra_status.append({ + "icon": "fa-bookmark", + "html": 'The series is queued in: %s' % ', '.join(queues), + }) + for q in Queue.objects.filter(user=3Drequest.user).values("name").= distinct(): + qn =3D q["name"] + if qn in queues + ['reject', 'accept']: + continue + message.extra_ops.append({ + "url": "%s?queue=3D%s" % (\ + reverse("add-to-queue", + kwargs=3D{"message_id": message.message_id= }), + qn), + "icon": "bookmark", + "title": "Add to '%s' queue" % qn}) + + message.extra_ops.append({ + "url": reverse("add-to-queue", + kwargs=3D{"message_id": message.message_id}), + "get_prompt": {"queue": "What is the name of the new queue?" }, + "icon": "bookmark", + "title": "Add to new queue..."}) diff --git a/www/templates/series-detail.html b/www/templates/series-detail= .html index c7b7f1d..dcf7b79 100644 --- a/www/templates/series-detail.html +++ b/www/templates/series-detail.html @@ -40,11 +40,39 @@
    {% for op in series.extra_ops %}
  • + {% if op.get_prompt %} + {% for k, v in op.get_prompt.items %} + + {% endfor %} + {% endif %} {{ op.title }}
  • + {% if op.get_prompt %} + href=3D"#" + onclick=3D"prompt_and_open(this, '{{ op.url }}')" + {% else %} + href=3D"{{ op.url }}" + {% endif %}">{{ op.title }} {% endfor %}
+ {% endif %} =20
--=20 2.17.2 _______________________________________________ Patchew-devel mailing list Patchew-devel@redhat.com https://www.redhat.com/mailman/listinfo/patchew-devel