Пример #1
0
    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
            }})
Пример #2
0
    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})
Пример #3
0
    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
        })
Пример #4
0
    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
        })
Пример #5
0
    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}
            })