diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2018-02-07 10:59:06 +1300 |
---|---|---|
committer | Paul Eggleton <paul.eggleton@linux.intel.com> | 2018-02-07 11:27:48 +1300 |
commit | f6ab721ea0d0115c840062ca667a6a3592020824 (patch) | |
tree | bad620e9887ce1caa64a72ef6a4933461dc2f253 /layerindex | |
parent | 00594313093e02dfdab0c856ed358a81f8526d36 (diff) | |
download | openembedded-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.py | 58 | ||||
-rw-r--r-- | layerindex/urls.py | 1 |
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'^$', |