aboutsummaryrefslogtreecommitdiffstats
path: root/layerindex
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2018-02-07 10:59:06 +1300
committerPaul Eggleton <paul.eggleton@linux.intel.com>2018-02-07 11:27:48 +1300
commitf6ab721ea0d0115c840062ca667a6a3592020824 (patch)
treebad620e9887ce1caa64a72ef6a4933461dc2f253 /layerindex
parent00594313093e02dfdab0c856ed358a81f8526d36 (diff)
downloadopenembedded-core-contrib-f6ab721ea0d0115c840062ca667a6a3592020824.tar.gz
restviews: add additional layer view with extra nested fields
It was a bit awkward to query layers externally - you had to do multiple queries and you couldn't get the YP Compatible version info at all. Add an additional LayerBranch-based view that exposes the branch name, layer fields, YP Compatible Version and active maintainer information with just one call. Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Diffstat (limited to 'layerindex')
-rw-r--r--layerindex/restviews.py58
-rw-r--r--layerindex/urls.py1
2 files changed, 56 insertions, 3 deletions
diff --git a/layerindex/restviews.py b/layerindex/restviews.py
index 47997ab33c..6e0bc75b84 100644
--- a/layerindex/restviews.py
+++ b/layerindex/restviews.py
@@ -1,7 +1,28 @@
-from layerindex.models import Branch, LayerItem, LayerMaintainer, LayerNote, LayerBranch, LayerDependency, Recipe, Machine, Distro, BBClass
+from layerindex.models import Branch, LayerItem, LayerMaintainer, YPCompatibleVersion, LayerNote, LayerBranch, LayerDependency, Recipe, Machine, Distro, BBClass
from rest_framework import viewsets, serializers
from layerindex.querysethelper import params_to_queryset, get_search_tuple
+class DynamicFieldsModelSerializer(serializers.ModelSerializer):
+ """
+ A ModelSerializer that takes an additional "fields" argument that
+ controls which fields should be displayed. Borrowed from the Django
+ REST Framework documentation.
+ """
+
+ def __init__(self, *args, **kwargs):
+ # Don't pass the 'fields' arg up to the superclass
+ fields = kwargs.pop('fields', None)
+
+ # Instantiate the superclass normally
+ super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)
+
+ if fields is not None:
+ # Drop any fields that are not specified in the `fields` argument.
+ allowed = set(fields)
+ existing = set(self.fields)
+ for field_name in existing - allowed:
+ self.fields.pop(field_name)
+
class ParametricSearchableModelViewSet(viewsets.ReadOnlyModelViewSet):
def get_queryset(self):
model = self.__class__.serializer_class.Meta.model
@@ -9,7 +30,7 @@ class ParametricSearchableModelViewSet(viewsets.ReadOnlyModelViewSet):
(filter_string, search_term, ordering_string) = get_search_tuple(self.request, model)
return params_to_queryset(model, qs, filter_string, search_term, ordering_string)
-class BranchSerializer(serializers.ModelSerializer):
+class BranchSerializer(DynamicFieldsModelSerializer):
class Meta:
model = Branch
fields = '__all__'
@@ -45,7 +66,7 @@ class LayerDependencyViewSet(ParametricSearchableModelViewSet):
queryset = LayerDependency.objects.filter(layerbranch__layer__status__in=['P', 'X'])
serializer_class = LayerDependencySerializer
-class LayerMaintainerSerializer(serializers.ModelSerializer):
+class LayerMaintainerSerializer(DynamicFieldsModelSerializer):
class Meta:
model = LayerMaintainer
fields = '__all__'
@@ -98,3 +119,34 @@ class ClassSerializer(serializers.ModelSerializer):
class ClassViewSet(ParametricSearchableModelViewSet):
queryset = BBClass.objects.all()
serializer_class = ClassSerializer
+
+class YPCompatibleVersionSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = YPCompatibleVersion
+ fields = '__all__'
+
+class LayerSerializer(serializers.ModelSerializer):
+ """
+ A more fleshed-out LayerBranch serializer for external applications
+ """
+ branch = BranchSerializer(read_only=True, fields=('id', 'name'))
+ layer = LayerItemSerializer(read_only=True)
+ yp_compatible_version = YPCompatibleVersionSerializer(read_only=True)
+ maintainers = serializers.SerializerMethodField()
+
+ class Meta:
+ model = LayerBranch
+ fields = '__all__'
+
+ def get_maintainers(self, layerbranch):
+ qs = layerbranch.layermaintainer_set.filter(status='A')
+ serializer = LayerMaintainerSerializer(instance=qs, many=True, read_only=True, fields=('name', 'email', 'responsibility'))
+ return serializer.data
+
+class LayerViewSet(ParametricSearchableModelViewSet):
+ """
+ A more fleshed-out LayerBranch viewset for external applications
+ """
+ queryset = LayerBranch.objects.filter(layer__status__in=['P', 'X'])
+ serializer_class = LayerSerializer
+
diff --git a/layerindex/urls.py b/layerindex/urls.py
index a74498a0ef..a665a31d76 100644
--- a/layerindex/urls.py
+++ b/layerindex/urls.py
@@ -25,6 +25,7 @@ router.register(r'recipes', restviews.RecipeViewSet)
router.register(r'machines', restviews.MachineViewSet)
router.register(r'distros', restviews.DistroViewSet)
router.register(r'classes', restviews.ClassViewSet)
+router.register(r'layers', restviews.LayerViewSet)
urlpatterns = patterns('',
url(r'^$',