[Patchew-devel] [PATCH v2 03/12] Generalize Review model to Queue
Paolo Bonzini
pbonzini at redhat.com
Wed Nov 28 16:57:06 UTC 2018
On 28/11/18 15:34, Fam Zheng wrote:
> From: Fam Zheng <famz at redhat.com>
>
> The concept of a queue is a per-user model for maintainers. A maintainer
> can have one ore more queues. The current Review model already has
> accept and reject stautus, so we generalize that to support a more
> flexible queue feature.
>
> Previously, "mark as accepted" adds a (user, message, accept=True)
> record in the Review model. Now it adds a (user, message, name='accept')
> record in the Queue model.
>
> Similary, for 'mark as rejected', a (user, message, name='reject')
> record is added in the Queue model.
>
> This makes the two queue names specially purposed on the web interface
> and search terms, which we'll extend to also support normal queues.
Can you rename this to QueuedSeries? Apart from this nit, I'm totally
okay with the series!
Paolo
> Signed-off-by: Fam Zheng <famz at redhat.com>
> ---
> api/migrations/0042_review_to_queue.py | 19 +++++++++++
> api/migrations/0043_auto_20181120_0636.py | 40 +++++++++++++++++++++++
> api/models.py | 12 +++++--
> api/search.py | 10 +++---
> mods/maintainer.py | 23 +++++++------
> 5 files changed, 86 insertions(+), 18 deletions(-)
> create mode 100644 api/migrations/0042_review_to_queue.py
> create mode 100644 api/migrations/0043_auto_20181120_0636.py
>
> diff --git a/api/migrations/0042_review_to_queue.py b/api/migrations/0042_review_to_queue.py
> new file mode 100644
> index 0000000..3101349
> --- /dev/null
> +++ b/api/migrations/0042_review_to_queue.py
> @@ -0,0 +1,19 @@
> +# -*- coding: utf-8 -*-
> +# Generated by Django 1.11.16 on 2018-11-20 06:33
> +from __future__ import unicode_literals
> +
> +from django.conf import settings
> +from django.db import migrations, models
> +import django.db.models.deletion
> +
> +
> +class Migration(migrations.Migration):
> +
> + dependencies = [
> + migrations.swappable_dependency(settings.AUTH_USER_MODEL),
> + ('api', '0041_postgres_fts'),
> + ]
> +
> + operations = [
> + migrations.RenameModel('Review', 'Queue'),
> + ]
> diff --git a/api/migrations/0043_auto_20181120_0636.py b/api/migrations/0043_auto_20181120_0636.py
> new file mode 100644
> index 0000000..4f83f28
> --- /dev/null
> +++ b/api/migrations/0043_auto_20181120_0636.py
> @@ -0,0 +1,40 @@
> +# -*- coding: utf-8 -*-
> +# Generated by Django 1.11.16 on 2018-11-20 06:36
> +from __future__ import unicode_literals
> +
> +from django.conf import settings
> +from django.db import migrations, models
> +
> +
> +class Migration(migrations.Migration):
> +
> + dependencies = [
> + migrations.swappable_dependency(settings.AUTH_USER_MODEL),
> + ('api', '0042_review_to_queue'),
> + ]
> +
> + operations = [
> + migrations.RenameField(
> + model_name='message',
> + old_name='reviews',
> + new_name='queues',
> + ),
> + migrations.AddField(
> + model_name='queue',
> + name='name',
> + field=models.CharField(default='accept', help_text='Name of the queue', max_length=1024),
> + preserve_default=False,
> + ),
> + migrations.RemoveField(
> + model_name='queue',
> + name='accept',
> + ),
> + migrations.AlterUniqueTogether(
> + name='queue',
> + unique_together=set([('user', 'message', 'name')]),
> + ),
> + migrations.AlterIndexTogether(
> + name='queue',
> + index_together=set([('user', 'message')]),
> + ),
> + ]
> diff --git a/api/models.py b/api/models.py
> index e24098b..c2cd2ac 100644
> --- a/api/models.py
> +++ b/api/models.py
> @@ -436,11 +436,17 @@ def HeaderFieldModel(**args):
> return models.CharField(max_length=4096, **args)
>
>
> -class Review(models.Model):
> +class Queue(models.Model):
> user = models.ForeignKey(User)
> message = models.ForeignKey('Message')
> - accept = models.BooleanField()
> + # Special purposed queues:
> + # accept: When user marked series as "accepted"
> + # reject: When user marked series as "rejected"
> + name = models.CharField(max_length=1024, help_text="Name of the queue")
>
> + class Meta:
> + unique_together = ('user', 'message', 'name')
> + index_together = [('user', 'message')]
>
> class Message(models.Model):
> """ Patch email message """
> @@ -479,7 +485,7 @@ class Message(models.Model):
> # number of patches we've got if is_series_head
> num_patches = models.IntegerField(null=False, default=-1, blank=True)
>
> - reviews = models.ManyToManyField(User, blank=True, through=Review)
> + queues = models.ManyToManyField(User, blank=True, through=Queue)
>
> objects = MessageManager()
>
> diff --git a/api/search.py b/api/search.py
> index 659f65d..3067235 100644
> --- a/api/search.py
> +++ b/api/search.py
> @@ -8,7 +8,7 @@
> # This work is licensed under the MIT License. Please see the LICENSE file or
> # http://opensource.org/licenses/MIT.
>
> -from .models import Message, MessageProperty, MessageResult, Result, Review
> +from .models import Message, MessageProperty, MessageResult, Result, Queue
> from functools import reduce
>
> from django.db import connection
> @@ -265,7 +265,7 @@ Search text keyword in the email message. Example:
> q = Q(user=user, **kwargs)
> else:
> q = Q(user__username=username, **kwargs)
> - return self._make_filter_subquery(Review, q)
> + return self._make_filter_subquery(Queue, q)
>
> def _make_filter(self, term, user):
> if term.startswith("age:"):
> @@ -310,13 +310,13 @@ Search text keyword in the email message. Example:
> return self._make_filter_result(term[8:], status=Result.RUNNING)
> elif term.startswith("ack:") or term.startswith("accept:") or term.startswith("accepted:"):
> username = term[term.find(":") + 1:]
> - return self._make_filter_review(username, user, accept=True)
> + return self._make_filter_review(username, user, name="accept")
> elif term.startswith("nack:") or term.startswith("reject:") or term.startswith("rejected:"):
> username = term[term.find(":") + 1:]
> - return self._make_filter_review(username, user, accept=False)
> + return self._make_filter_review(username, user, name="reject")
> elif term.startswith("review:") or term.startswith("reviewed:"):
> username = term[term.find(":") + 1:]
> - return self._make_filter_review(username, user)
> + return self._make_filter_review(username, user, name="accept")
> elif term.startswith("project:"):
> cond = term[term.find(":") + 1:]
> self._projects.add(cond)
> diff --git a/mods/maintainer.py b/mods/maintainer.py
> index a3874de..7f4f5fe 100644
> --- a/mods/maintainer.py
> +++ b/mods/maintainer.py
> @@ -12,7 +12,7 @@ from django.conf.urls import url
> from django.http import Http404, HttpResponseRedirect
> from django.urls import reverse
> from mod import PatchewModule
> -from api.models import Message, Review
> +from api.models import Message, Queue
>
> class MaintainerModule(PatchewModule):
> """ Project maintainer related tasks """
> @@ -25,8 +25,12 @@ class MaintainerModule(PatchewModule):
> msg = Message.objects.find_series(message_id)
> if not msg:
> raise Http404("Series not found")
> - Review.objects.update_or_create(user=request.user, message=msg,
> - defaults = { 'accept': accept })
> + if accept:
> + to_create, to_delete = 'accept', 'reject'
> + else:
> + to_create, to_delete = 'reject', 'accept'
> + Queue.objects.filter(user=request.user, message=msg, name=to_delete).delete()
> + Queue.objects.get_or_create(user=request.user, message=msg, name=to_create)
> return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
>
> def _delete_review(self, request, message_id):
> @@ -35,7 +39,8 @@ class MaintainerModule(PatchewModule):
> msg = Message.objects.find_series(message_id)
> if not msg:
> raise Http404("Series not found")
> - r = Review.objects.filter(user=request.user, message=msg)
> + r = Queue.objects.filter(user=request.user, message=msg,
> + name__in=['accept', 'reject'])
> r.delete()
> return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
>
> @@ -96,11 +101,9 @@ class MaintainerModule(PatchewModule):
> "icon": "check",
> "title": "Mark series as merged"})
>
> - try:
> - r = Review.objects.get(user=request.user, message=message)
> - except Review.DoesNotExist:
> - r = None
> - if r and r.accept:
> + r = Queue.objects.filter(user=request.user, message=message,
> + name__in=['accept', 'reject']).first()
> + if r and r.name == 'accept':
> message.extra_status.append({
> "icon": "fa-check",
> "html": 'The series is marked for merging'
> @@ -112,7 +115,7 @@ class MaintainerModule(PatchewModule):
> "icon": "check",
> "title": "Mark series as accepted"})
>
> - if r and not r.accept:
> + if r and r.name == 'reject':
> message.extra_status.append({
> "icon": "fa-times",
> "html": 'The series is marked as rejected'
>
More information about the Patchew-devel
mailing list