mirror of
git://git.yoctoproject.org/layerindex-web.git
synced 2025-07-19 12:49:01 +02:00
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>
This commit is contained in:
parent
0059431309
commit
f6ab721ea0
|
@ -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
|
||||
|
||||
|
|
|
@ -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'^$',
|
||||
|
|
Loading…
Reference in New Issue
Block a user