X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetstack%2Fcore%2Fxoslib%2Fmethods%2Fsliceplus.py;h=0a8852ab5c5e2c37af8eae9a177b04dc2a846b22;hb=0093647259a08b6a8ac35bab421a2a4d3a194f19;hp=fa17c1c68cb5ae9f78bc6bf8758c4532a64fb691;hpb=0d947b28a5b28a642631c1019811f7520e2725a8;p=plstackapi.git diff --git a/planetstack/core/xoslib/methods/sliceplus.py b/planetstack/core/xoslib/methods/sliceplus.py index fa17c1c..0a8852a 100644 --- a/planetstack/core/xoslib/methods/sliceplus.py +++ b/planetstack/core/xoslib/methods/sliceplus.py @@ -22,7 +22,14 @@ class NetworkPortsField(serializers.WritableField): # note: maybe just Field i def to_internal_value(self, data): return data -class SiteAllocationField(serializers.WritableField): # note: maybe just Field in rest_framework 3.x instead of WritableField +class DictionaryField(serializers.WritableField): # note: maybe just Field in rest_framework 3.x instead of WritableField + def to_representation(self, obj): + return json.dumps(obj) + + def to_internal_value(self, data): + return json.loads(data) + +class ListField(serializers.WritableField): # note: maybe just Field in rest_framework 3.x instead of WritableField def to_representation(self, obj): return json.dumps(obj) @@ -35,7 +42,18 @@ class SlicePlusIdSerializer(serializers.ModelSerializer, PlusSerializerMixin): sliceInfo = serializers.SerializerMethodField("getSliceInfo") humanReadableName = serializers.SerializerMethodField("getHumanReadableName") network_ports = NetworkPortsField(required=False) - site_allocation = SiteAllocationField(required=False) + site_allocation = DictionaryField(required=False) + site_ready = DictionaryField(required=False) + users = ListField(required=False) + user_names = ListField(required=False) # readonly = True ? + current_user_can_see = serializers.SerializerMethodField("getCurrentUserCanSee") + + def getCurrentUserCanSee(self, slice): + # user can 'see' the slice if he is the creator or he has a role + current_user = self.context['request'].user + if (slice.creator and slice.creator==current_user): + return True; + return (len(slice.getSliceInfo(current_user)["roles"]) > 0) def getSliceInfo(self, slice): return slice.getSliceInfo(user=self.context['request'].user) @@ -44,14 +62,14 @@ class SlicePlusIdSerializer(serializers.ModelSerializer, PlusSerializerMixin): return str(obj) networks = serializers.PrimaryKeyRelatedField(many=True, read_only=True) -# availableNetworks = serializers.PrimaryKeyRelatedField(many=True, read_only=True, view_name='network-detail') class Meta: model = SlicePlus - fields = ('humanReadableName', 'id','created','updated','enacted','name','enabled','omf_friendly','description','slice_url','site','max_slivers','image_preference','service','network','mount_data_sets', - 'serviceClass','creator','networks','sliceInfo','network_ports','backendIcon','backendHtml','site_allocation') + fields = ('humanReadableName', 'id','created','updated','enacted','name','enabled','omf_friendly','description','slice_url','site','max_slivers','service','network','mount_data_sets', + 'default_image', 'default_flavor', + 'serviceClass','creator','networks','sliceInfo','network_ports','backendIcon','backendHtml','site_allocation','site_ready','users',"user_names","current_user_can_see") -class SlicePlusList(PlusListCreateAPIView): #generics.ListCreateAPIView): +class SlicePlusList(PlusListCreateAPIView): queryset = SlicePlus.objects.select_related().all() serializer_class = SlicePlusIdSerializer @@ -59,7 +77,22 @@ class SlicePlusList(PlusListCreateAPIView): #generics.ListCreateAPIView): method_name = "slicesplus" def get_queryset(self): - return SlicePlus.select_by_user(self.request.user) + current_user_can_see = self.request.QUERY_PARAMS.get('current_user_can_see', False) + + slices = SlicePlus.select_by_user(self.request.user) + + # If current_user_can_see is set, then filter the queryset to return + # only those slices that the user is either creator or has privilege + # on. + if (current_user_can_see): + slice_ids = [] + for slice in slices: + if (self.request.user == slice.creator) or (len(slice.getSliceInfo(self.request.user)["roles"]) > 0): + slice_ids.append(slice.id) + + slices = SlicePlus.objects.filter(id__in=slice_ids) + + return slices class SlicePlusDetail(PlusRetrieveUpdateDestroyAPIView): queryset = SlicePlus.objects.select_related().all()