[patch 1/1] models: add "comment added to patch" event

Carlos O'Donell carlos at redhat.com
Fri Feb 25 07:39:38 AEDT 2022


On 2/24/22 15:25, DJ Delorie wrote:
> 
> This small patch stitches in "comment added" events into the event
> queue.
> 
> Signed-off-by: DJ Delorie <dj at redhat.com>
> Closes: #424

I'm not going to comment on the technical parts of DJ's patch, but I will add some
context here. I filed issue #424 because it is a feature I want to help improve
the patch review workflow for glibc, though I am looking to support adoption
across the whole GNU Toolchain.

I really want the ability to trigger *further* CI/CD based on the content of
replies to patches. This will eventually allow bots to trigger further CI/CD
scenarios when reviewers reply to patches.

Thank you for your review :-)
 
> diff --git a/patchwork/api/event.py b/patchwork/api/event.py
> index 71f9593..45b3f4f 100644
> --- a/patchwork/api/event.py
> +++ b/patchwork/api/event.py
> @@ -13,6 +13,7 @@ from rest_framework.serializers import SlugRelatedField
>  from patchwork.api.embedded import CheckSerializer
>  from patchwork.api.embedded import CoverSerializer
>  from patchwork.api.embedded import PatchSerializer
> +from patchwork.api.comment import PatchCommentSerializer
>  from patchwork.api.embedded import ProjectSerializer
>  from patchwork.api.embedded import SeriesSerializer
>  from patchwork.api.embedded import UserSerializer
> @@ -31,6 +32,7 @@ class EventSerializer(ModelSerializer):
>      current_state = SlugRelatedField(slug_field='slug', read_only=True)
>      previous_delegate = UserSerializer()
>      current_delegate = UserSerializer()
> +    comment_added = PatchCommentSerializer()
>      created_check = SerializerMethodField()
>      created_check = CheckSerializer()
>      previous_relation = SerializerMethodField()
> @@ -40,6 +42,7 @@ class EventSerializer(ModelSerializer):
>          Event.CATEGORY_COVER_CREATED: ['cover'],
>          Event.CATEGORY_PATCH_CREATED: ['patch'],
>          Event.CATEGORY_PATCH_COMPLETED: ['patch', 'series'],
> +        Event.CATEGORY_PATCH_COMMENT_ADDED: ['patch', 'comment_added'],
>          Event.CATEGORY_PATCH_STATE_CHANGED: ['patch', 'previous_state',
>                                               'current_state'],
>          Event.CATEGORY_PATCH_DELEGATED: ['patch', 'previous_delegate',
> @@ -80,7 +83,7 @@ class EventSerializer(ModelSerializer):
>              'id', 'category', 'project', 'date', 'actor', 'patch',
>              'series', 'cover', 'previous_state', 'current_state',
>              'previous_delegate', 'current_delegate', 'created_check',
> -            'previous_relation', 'current_relation',
> +            'previous_relation', 'current_relation', 'comment_added',
>          )
>          read_only_fields = fields
>          versioned_fields = {
> @@ -102,4 +105,4 @@ class EventList(ListAPIView):
>              .prefetch_related('project', 'patch__project', 'series__project',
>                                'cover', 'previous_state', 'current_state',
>                                'previous_delegate', 'current_delegate',
> -                              'created_check')
> +                              'created_check', 'comment_added')
> diff --git a/patchwork/migrations/0046_patch_comment_events.py b/patchwork/migrations/0046_patch_comment_events.py
> new file mode 100644
> index 0000000..6d1a798
> --- /dev/null
> +++ b/patchwork/migrations/0046_patch_comment_events.py
> @@ -0,0 +1,24 @@
> +# Generated by Django 3.1.13 on 2022-02-25 07:01
> +
> +from django.db import migrations, models
> +import django.db.models.deletion
> +
> +
> +class Migration(migrations.Migration):
> +
> +    dependencies = [
> +        ('patchwork', '0045_addressed_fields'),
> +    ]
> +
> +    operations = [
> +        migrations.AddField(
> +            model_name='event',
> +            name='comment_added',
> +            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='patchwork.patchcomment'),
> +        ),
> +        migrations.AlterField(
> +            model_name='event',
> +            name='category',
> +            field=models.CharField(choices=[('cover-created', 'Cover Letter Created'), ('patch-created', 'Patch Created'), ('patch-completed', 'Patch Completed'), ('patch-comment-added', 'Patch Comment Added'), ('patch-state-changed', 'Patch State Changed'), ('patch-delegated', 'Patch Delegate Changed'), ('patch-relation-changed', 'Patch Relation Changed'), ('check-created', 'Check Created'), ('series-created', 'Series Created'), ('series-completed', 'Series Completed')], db_index=True, help_text='The category of the event.', max_length=25),
> +        ),
> +    ]
> diff --git a/patchwork/models.py b/patchwork/models.py
> index 6304b34..74229de 100644
> --- a/patchwork/models.py
> +++ b/patchwork/models.py
> @@ -1022,6 +1022,7 @@ class Event(models.Model):
>      CATEGORY_COVER_CREATED = 'cover-created'
>      CATEGORY_PATCH_CREATED = 'patch-created'
>      CATEGORY_PATCH_COMPLETED = 'patch-completed'
> +    CATEGORY_PATCH_COMMENT_ADDED = 'patch-comment-added'
>      CATEGORY_PATCH_STATE_CHANGED = 'patch-state-changed'
>      CATEGORY_PATCH_DELEGATED = 'patch-delegated'
>      CATEGORY_PATCH_RELATION_CHANGED = 'patch-relation-changed'
> @@ -1032,6 +1033,7 @@ class Event(models.Model):
>          (CATEGORY_COVER_CREATED, 'Cover Letter Created'),
>          (CATEGORY_PATCH_CREATED, 'Patch Created'),
>          (CATEGORY_PATCH_COMPLETED, 'Patch Completed'),
> +        (CATEGORY_PATCH_COMMENT_ADDED, 'Patch Comment Added'),
>          (CATEGORY_PATCH_STATE_CHANGED, 'Patch State Changed'),
>          (CATEGORY_PATCH_DELEGATED, 'Patch Delegate Changed'),
>          (CATEGORY_PATCH_RELATION_CHANGED, 'Patch Relation Changed'),
> @@ -1113,6 +1115,12 @@ class Event(models.Model):
>          Check, related_name='+', null=True, blank=True,
>          on_delete=models.CASCADE)
>  
> +    # fields for 'patch-comment-added' events
> +
> +    comment_added = models.ForeignKey(
> +        PatchComment, related_name='+', null=True, blank=True,
> +        on_delete=models.CASCADE)
> +
>      # TODO(stephenfin): Validate that the correct fields are being set by way
>      # of a 'clean' method
>  
> diff --git a/patchwork/signals.py b/patchwork/signals.py
> index dc08129..4697993 100644
> --- a/patchwork/signals.py
> +++ b/patchwork/signals.py
> @@ -15,7 +15,7 @@ from patchwork.models import Event
>  from patchwork.models import Patch
>  from patchwork.models import PatchChangeNotification
>  from patchwork.models import Series
> -
> +from patchwork.models import PatchComment
>  
>  @receiver(pre_save, sender=Patch)
>  def patch_change_callback(sender, instance, raw, **kwargs):
> @@ -53,6 +53,18 @@ def patch_change_callback(sender, instance, raw, **kwargs):
>      notification.last_modified = dt.utcnow()
>      notification.save()
>  
> + at receiver(post_save, sender=PatchComment)
> +def create_patch_comment_created_callback(sender, instance, raw, **kwargs):
> +
> +    def create_event(comment):
> +        return Event.objects.create(
> +            category=Event.CATEGORY_PATCH_COMMENT_ADDED,
> +            project=comment.patch.project,
> +            patch=comment.patch,
> +            comment_added=comment)
> +
> +    create_event(instance)
> +
>  
>  @receiver(post_save, sender=Cover)
>  def create_cover_created_event(sender, instance, created, raw, **kwargs):
> 


-- 
Cheers,
Carlos.



More information about the Patchwork mailing list