def post(self, request): data = request.data try: flavorslug = data['flavor'] except KeyError: raise exceptions.ValidationError( {'flavor': ['Flavor not specified in payload']}) try: flavor = AlertFlavor.objects.get(slug=flavorslug) except AlertFlavor.DoesNotExist: raise NotFound({ 'flavor': ['Flavor "{0}" does not exist.'.format(flavorslug)] }) self.check_object_permissions(request, flavor) if not flavor.enabled: raise exceptions.ValidationError( {'flavor': ['Flavor "{0}" is disabled.'.format(flavorslug)]}) # Get the links out--we'll deal with them next. link_data = data.pop('links', []) # Validate the alert data alert_ser = AlertSerializer(data=data) if not alert_ser.is_valid(): raise exceptions.ValidationError({'detail': alert_ser.errors}) # Validate links link_errors = [] for link_item in link_data: if 'name' not in link_item or 'url' not in link_item: link_errors.append( 'Missing names or urls in link data. {}'.format( repr(link_item))) if link_errors: raise exceptions.ValidationError( {'detail': { 'links': link_errors }}) # Everything is good, so let's save it all to the db. alert = alert_ser.save() for link_item in link_data: link = Link(alert=alert, name=link_item['name'], url=link_item['url']) link.save() return rest_framework.response.Response( status=201, data={'detail': { 'id': alert.id }})
def post(self, request): data = request.DATA try: flavorslug = request.DATA['flavor'] except KeyError: return self.rest_error(status=404, errors='Flavor not specified in payload.') try: flavor = AlertFlavor.objects.get(slug=flavorslug) except AlertFlavor.DoesNotExist: return self.rest_error( status=404, errors='Flavor "{}" does not exist.'.format(flavorslug)) self.check_object_permissions(request, flavor) if not flavor.enabled: return self.rest_error( status=400, errors='Flavor "{}" is disabled.'.format(flavorslug)) # Get the links out--we'll deal with them next. link_data = data.pop('links', []) # Validate the alert data alert_ser = AlertSerializer(data=data) if not alert_ser.is_valid(): return self.rest_error(status=400, errors=alert_ser.errors) # Validate links for link_item in link_data: if 'name' not in link_item or 'url' not in link_item: link_errors = 'Missing names or urls in link data. {}'.format( repr(link_data)) return self.rest_error(status=400, errors={'links': link_errors}) # Everything is good, so let's save it all to the db alert = alert_ser.object alert.save() for link_item in link_data: link = Link(alert=alert, name=link_item['name'], url=link_item['url']) link.save() return self.rest_created({'id': alert.id})
def get(self, request): serializer = AlertsGETSerializer(data=request.GET) if not serializer.is_valid(): raise exceptions.ValidationError({'detail': serializer.errors}) data = serializer.validated_data max_count = min(data['max'], 10000) flavors = data['flavors'] # Make sure the token has permission to view each flavor. for flavor in flavors: self.check_object_permissions(request, flavor) alerts = Alert.objects.filter(flavor__in=flavors) if data.get('start_time_start'): alerts = alerts.filter(start_time__gte=data['start_time_start']) if data.get('start_time_end'): alerts = alerts.filter(start_time__lte=data['start_time_end']) if data.get('end_time_start'): alerts = alerts.filter(end_time__gte=data['end_time_start']) if data.get('end_time_end'): alerts = alerts.filter(end_time__lte=data['end_time_end']) if data.get('created_start'): alerts = alerts.filter(created__gte=data['created_start']) if data.get('created_end'): alerts = alerts.filter(created__lte=data['created_end']) alerts = alerts.order_by('-created') alerts_ser = AlertSerializer(alerts[:max_count], many=True) return rest_framework.response.Response({ 'total': alerts.count(), 'count': len(alerts_ser.data), 'alerts': alerts_ser.data })
def get(self, request): flavorslugs = smart_str(request.GET.get('flavors', '')).split(',') max_count = smart_int(request.GET.get('max', None)) max_count = max_count or 100 max_count = min(max(1, max_count), 10000) if not flavorslugs: return self.rest_error( status=400, errors='You must specify flavors to retrieve alerts for.') flavors = [] for flavorslug in flavorslugs: try: flavor = AlertFlavor.objects.get(slug=flavorslug) except AlertFlavor.DoesNotExist: return self.rest_error( status=404, errors='Flavor "{}" does not exist.'.format(flavorslug)) self.check_object_permissions(request, flavor) if not flavor.enabled: return self.rest_error( status=400, errors='Flavor "{}" is disabled.'.format(flavorslug)) flavors.append(flavor) alerts = Alert.objects.filter(flavor__in=flavors).order_by('-created') alerts_ser = AlertSerializer(alerts[:max_count], many=True) return rest_framework.response.Response({ 'total': alerts.count(), 'count': len(alerts_ser.data), 'alerts': alerts_ser.data })
def post(self, request): data = request.data try: flavorslug = data['flavor'] except KeyError: raise exceptions.ValidationError({ 'flavor': [ 'Flavor not specified in payload' ] }) try: flavor = AlertFlavor.objects.get(slug=flavorslug) except AlertFlavor.DoesNotExist: raise NotFound({ 'flavor': [ 'Flavor "{0}" does not exist.'.format(flavorslug) ] }) self.check_object_permissions(request, flavor) if not flavor.enabled: raise exceptions.ValidationError({ 'flavor': [ 'Flavor "{0}" is disabled.'.format(flavorslug) ] }) # Get the links out--we'll deal with them next. link_data = data.pop('links', []) # Validate the alert data alert_ser = AlertSerializer(data=data) if not alert_ser.is_valid(): raise exceptions.ValidationError({'detail': alert_ser.errors}) # Validate links link_errors = [] for link_item in link_data: if 'name' not in link_item or 'url' not in link_item: link_errors.append( 'Missing names or urls in link data. {}'.format( repr(link_item))) if link_errors: raise exceptions.ValidationError( {'detail': {'links': link_errors}}) # Everything is good, so let's save it all to the db. alert = alert_ser.save() for link_item in link_data: link = Link( alert=alert, name=link_item['name'], url=link_item['url'] ) link.save() return rest_framework.response.Response( status=201, data={ 'detail': {'id': alert.id} })