]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
api: Add fields to series detail view
authorAdam Hassick <ahassick@iol.unh.edu>
Thu, 30 Jan 2025 19:56:37 +0000 (14:56 -0500)
committerStephen Finucane <stephen@that.guru>
Mon, 10 Mar 2025 22:31:21 +0000 (22:31 +0000)
* Add the "dependencies" and "dependents" fields to the series detail
  view.
* Add "parse_dependencies" to the project detail view.

Signed-off-by: Adam Hassick <ahassick@iol.unh.edu>
Acked-by: Aaron Conole <aconole@redhat.com>
[stephenfin: Rename Project field from parse_dependencies to
             show_dependencies]
Signed-off-by: Stephen Finucane <stephen@that.guru>
patchwork/api/project.py
patchwork/api/series.py

index 2f0b47844bc4372926ba9c7c18ebcc20da84f600..6307dda0c45bbfdb07a746bcb44433d6770af8e6 100644 (file)
@@ -39,6 +39,7 @@ class ProjectSerializer(BaseHyperlinkedModelSerializer):
             'list_archive_url',
             'list_archive_url_format',
             'commit_url_format',
+            'show_dependencies',
         )
         read_only_fields = (
             'name',
@@ -55,6 +56,7 @@ class ProjectSerializer(BaseHyperlinkedModelSerializer):
                 'list_archive_url_format',
                 'commit_url_format',
             ),
+            '1.4': ('show_dependencies',),
         }
         extra_kwargs = {
             'url': {'view_name': 'api-project-detail'},
index b88ed1f5f38a922170b40ff0086436e5847e8ac8..c9f5f54bdbfd6bc3d7c4246a95f5c73c9ee4e9c6 100644 (file)
@@ -5,7 +5,10 @@
 
 from rest_framework.generics import ListAPIView
 from rest_framework.generics import RetrieveAPIView
-from rest_framework.serializers import SerializerMethodField
+from rest_framework.serializers import (
+    SerializerMethodField,
+    HyperlinkedRelatedField,
+)
 
 from patchwork.api.base import BaseHyperlinkedModelSerializer
 from patchwork.api.base import PatchworkPermission
@@ -24,6 +27,12 @@ class SeriesSerializer(BaseHyperlinkedModelSerializer):
     mbox = SerializerMethodField()
     cover_letter = CoverSerializer(read_only=True)
     patches = PatchSerializer(read_only=True, many=True)
+    dependencies = HyperlinkedRelatedField(
+        read_only=True, view_name='api-series-detail', many=True
+    )
+    dependents = HyperlinkedRelatedField(
+        read_only=True, view_name='api-series-detail', many=True
+    )
 
     def get_web_url(self, instance):
         request = self.context.get('request')
@@ -33,6 +42,16 @@ class SeriesSerializer(BaseHyperlinkedModelSerializer):
         request = self.context.get('request')
         return request.build_absolute_uri(instance.get_mbox_url())
 
+    def to_representation(self, instance):
+        if not instance.project.show_dependencies:
+            for field in ('dependencies', 'dependents'):
+                if field in self.fields:
+                    del self.fields[field]
+
+        data = super().to_representation(instance)
+
+        return data
+
     class Meta:
         model = Series
         fields = (
@@ -50,6 +69,8 @@ class SeriesSerializer(BaseHyperlinkedModelSerializer):
             'mbox',
             'cover_letter',
             'patches',
+            'dependencies',
+            'dependents',
         )
         read_only_fields = (
             'date',
@@ -60,9 +81,12 @@ class SeriesSerializer(BaseHyperlinkedModelSerializer):
             'mbox',
             'cover_letter',
             'patches',
+            'dependencies',
+            'dependents',
         )
         versioned_fields = {
             '1.1': ('web_url',),
+            '1.4': ('dependencies', 'dependents'),
         }
         extra_kwargs = {
             'url': {'view_name': 'api-series-detail'},
@@ -76,7 +100,12 @@ class SeriesMixin(object):
     def get_queryset(self):
         return (
             Series.objects.all()
-            .prefetch_related('patches__project', 'cover_letter__project')
+            .prefetch_related(
+                'patches__project',
+                'cover_letter__project',
+                'dependencies',
+                'dependents',
+            )
             .select_related('submitter', 'project')
         )