def get(self, request, pk): if not is_objectid_valid(pk): return Response({'detail': '%s is not valid ObjectId.' % pk}, status=status.HTTP_400_BAD_REQUEST) user = self.get_user(pk) serializer = UserSerializer(user, context={'request': request}) return Response(serializer.data)
def delete(self, request, pk): if not is_objectid_valid(pk): return Response({'detail': '%s is not valid ObjectId.' % pk}, status=status.HTTP_400_BAD_REQUEST) user = self.get_user(pk) # super admin can not be deleted if "webmaster" == user.username: return Response({'detail': 'Super admin can not be deleted.'}, status=status.HTTP_403_FORBIDDEN) user.delete() return Response(status=status.HTTP_204_NO_CONTENT)
def get(self, request, pk, format=None): if not is_objectid_valid(pk): return Response({'detail': '%s is not valid ObjectId.' % pk}, status=status.HTTP_400_BAD_REQUEST) supernode = self.get_object(pk) if request.user != supernode.user: return Response({'detail': 'Not found.'}, status=status.HTTP_404_NOT_FOUND) serializer = SuperNodesSerializer(supernode, context={'request': request}) return Response(serializer.data)
def delete(self, request, pk, format=None): if not is_objectid_valid(pk): return Response({'detail': '%s is not valid ObjectId.' % pk}, status=status.HTTP_400_BAD_REQUEST) supernode = self.get_object(pk) if request.user != supernode.user: return Response( {'detail': 'You can not delete another person supernode.'}, status=status.HTTP_403_FORBIDDEN) supernode.delete() return Response(status=status.HTTP_204_NO_CONTENT)
def get(self, request, pk, sensorid): if not is_objectid_valid(pk): return Response({ 'detail': '%s is not valid ObjectId.' % pk }, status=status.HTTP_400_BAD_REQUEST) data = self.get_node(pk, sensorid) # no access to another user private node if request.user != data.get('node').user and 0 == data.get('node').is_public: return Response({ 'detail': 'Not found.' }, status=status.HTTP_404_NOT_FOUND) serializer = NodeSensorSerializer(data.get('sensor'), context={'request': request, 'nodeid': pk}) return Response(serializer.data)
def delete(self, request, pk, sensorid): if not is_objectid_valid(pk): return Response({ 'detail': '%s is not valid ObjectId.' % pk }, status=status.HTTP_400_BAD_REQUEST) # check that nodeid and sensorid is valid data = self.get_supernode(pk, sensorid) # no access to delete another user sensor node if request.user != data.get('supernode').user: return Response({ 'detail': 'You can not delete another person node.' }, status=status.HTTP_403_FORBIDDEN) Supernodes.objects(pk=pk).update_one(pull__sensors__id=sensorid) # delete referer subscription Sensordatas.objects(sensor=sensorid).delete() return Response(status=status.HTTP_204_NO_CONTENT)
def put(self, request, pk): if not is_objectid_valid(pk): return Response({'detail': '%s is not valid ObjectId.' % pk}, status=status.HTTP_400_BAD_REQUEST) user = self.get_user(pk) # ensure that super admin only edited by him/his self if "webmaster" == user.username: return Response( {'detail': 'You can not update super admin user data.'}, status=status.HTTP_403_FORBIDDEN) serializer = UserSerializer(user, data=request.data, context={'request': request}, partial=True) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def get(self, request, *args, **kwargs): # check if request came from supernodes urls if is_url_regex_match(r'^/supernodes/(?P<pk>\w+)/nodes/', request.get_full_path()): if not is_objectid_valid(kwargs.get('pk')): return Response({ 'detail': '%s is not valid ObjectId.' % kwargs.get('pk') }, status=status.HTTP_400_BAD_REQUEST) queryset = self.filter_queryset( self.get_nodes(request.user, kwargs.get('pk'), request.GET.get('role')) ) else: queryset = self.filter_queryset(self.get_nodes(user=request.user, role=request.GET.get('role'))) page = self.paginate_queryset(queryset) if page is not None: serializer = NodeSerializer(page, many=True, context={'request': request}) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data)
def put(self, request, pk, sensorid): # check that label field was defined in the post header if 'label' not in request.data: return Response({'label': 'This field is required.'}, status=status.HTTP_400_BAD_REQUEST) if not is_objectid_valid(pk): return Response({ 'detail': '%s is not valid ObjectId.' % pk }, status=status.HTTP_400_BAD_REQUEST) """ Manual validation cause any selializer cannot handle EmbededDocummentList update """ data = self.get_supernode(pk, sensorid) supernode = data.get('supernode') serializer = SupernodeSensorSerializer(data=request.data, context={ 'request': request, 'supernodeid': pk, 'isupdate': True }, partial=True) if serializer.is_valid(): tmp_sensors = data.get('supernode').sensors self_sensor = Sensors() # check that the new value is unique to other for index, sensor in enumerate(supernode.sensors): if str(sensor.id) == sensorid: tmp_sensors[index].label = request.data.get('label') self_sensor = tmp_sensors[index] continue if sensor.label == request.data.get('label'): return Response({'label': 'This field must be unique.'}, status=status.HTTP_400_BAD_REQUEST) supernode.sensors = tmp_sensors supernode.save() return Response( SupernodeSensorSerializer( self_sensor, context={'request': request, 'supernodeid': pk} ).data, status=status.HTTP_200_OK ) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def put(self, request, pk, format=None): if not is_objectid_valid(pk): return Response({'detail': '%s is not valid ObjectId.' % pk}, status=status.HTTP_400_BAD_REQUEST) supernode = self.get_object(pk) if request.user != supernode.user: return Response( {'detail': 'You can not update another person supernode.'}, status=status.HTTP_403_FORBIDDEN) # SlugRelatedField, avoid 'query does not matching' exception on non valid data payload if request.data.get('user'): request.data.pop('user') serializer = SuperNodesSerializer(supernode, data=request.data, context={'request': request}, partial=True) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def validate(self, attrs): super(SensordataFormatSerializer, self).validate(attrs=attrs) supernode = self.context.get('request').user node = Nodes() errors = OrderedDict() # node sensors nodeiderror = [] nodeformaterror = [] nodesensorerror = [] ''' validate format from sensors[i] publish sensordata captured from supernode sensors ''' sensorerror = self.supernode_sensors_validate(supernode, attrs.get('sensors')) '''validate format from nodes[i]''' for index, nodes in enumerate(attrs.get('nodes')): if not nodes.get('id'): nodeiderror.append( "node[%d].id: This field may not be null." % index ) else: if not is_objectid_valid(nodes.get('id')): nodeiderror.append( "node[%d].id: %s is not valid ObjectId." % (index, nodes.get('id')) ) continue else: node = self.get_node(supernode.id, nodes.get('id')) if not node: nodeiderror.append( "node[%d].id: Object with label=%s does not exist.." % (index, nodes.get('id')) ) continue if not nodes.get('format'): nodeformaterror.append( "node[%d].format: This field may not be null." % index ) else: if not isinstance(nodes.get('format'), list): nodeformaterror.append( "node[%d].format: Expected a list." % index ) else: if 2 != len(nodes.get('format')) or \ ('data' != nodes.get('format')[0] or 'timestamp' != nodes.get('format')[1]): nodeformaterror.append( "node[%d].format: Expected format ['data', 'timestamp']." % index ) if not nodes.get('sensors'): nodesensorerror.append( "node[%d].sensors: This field may not be null." % index ) else: if not isinstance(nodes.get('sensors'), list): nodesensorerror.append( "node[%d].sensors: Expected a list." % index ) else: _sensorerror = self.nodes_sensors_validate(index, node, nodes.get('sensors')) if _sensorerror: nodesensorerror.append(_sensorerror) else: if sensorerror: errors['supernode'] = {'sensors': sensorerror} if nodeiderror: errors['node'] = {'id': nodeiderror} if nodeformaterror: errors['node'] = {'format': nodeformaterror} if nodesensorerror: errors['node'] = {'sensors': nodesensorerror} if errors: raise serializers.ValidationError(errors) return attrs