Esempio n. 1
0
 def _order(self, request, queryset):
     order_by = get_ordering(request)
     item_name = self._get_item_name(order_by)
     if item_name:
         filter_kwargs = {self.db_field + '__name__startswith': item_name}
         queryset = queryset.filter(**filter_kwargs).order_by(self.db_field + '__name')
     return queryset
Esempio n. 2
0
    def filter(self, request, queryset, view):

        order_by = get_ordering(request)
        if order_by not in ('current_cost', '-current_cost'):
            return queryset

        year, month = invoice_utils.parse_period(request.query_params)
        invoices = invoice_models.Invoice.objects.filter(
            year=year, month=month, customer=OuterRef('pk'))
        queryset = queryset.annotate(
            current_cost=Subquery(invoices.values('current_cost')[:1]))
        return order_with_nulls(queryset, order_by)
Esempio n. 3
0
    def filter(self, request, queryset, view):

        order_by = get_ordering(request)
        if order_by not in ('estimated_cost', '-estimated_cost'):
            return queryset

        ct = ContentType.objects.get_for_model(structure_models.Customer)
        estimates = models.PriceEstimate.objects.filter(
            content_type=ct, object_id=OuterRef('pk'))
        queryset = queryset.annotate(
            estimated_cost=Subquery(estimates.values('total')[:1]))
        return order_with_nulls(queryset, order_by)
Esempio n. 4
0
    def filter_queryset(self, request, queryset, view):
        period = get_period(request)

        if 'actual_sla' in request.query_params:
            value = request.query_params.get('actual_sla')
            return queryset.filter(sla_items__value=value, sla_items__period=period)

        elif get_ordering(request) == 'actual_sla':
            return queryset.filter(sla_items__period=period).order_by('sla_items__value')

        else:
            return queryset
Esempio n. 5
0
    def filter_queryset(self, request, queryset, view):
        for key in request.query_params.keys():
            item_name = self._get_item_name(key)
            if item_name:
                value = request.query_params.get(key)
                queryset = queryset.filter(monitoring_items__name=item_name,
                                           monitoring_items__value=value)

        order_by = get_ordering(request)
        item_name = self._get_item_name(order_by)
        if item_name:
            queryset = queryset.filter(monitoring_items__name=item_name)\
                               .order_by('monitoring_items__value')

        return queryset
Esempio n. 6
0
 def filter_queryset(self, request, queryset, view):
     order_by = get_ordering(request)
     if order_by not in ('start_time', '-start_time'):
         return queryset
     return order_with_nulls(queryset, order_by)
Esempio n. 7
0
    def filter_queryset(self, request, queryset, view):
        search_text = request.query_params.get(
            settings.api_settings.SEARCH_PARAM, '')
        must_terms = {}
        must_not_terms = {}
        should_terms = {}
        excluded_event_types = set()

        if 'event_type' in request.query_params:
            must_terms['event_type'] = request.query_params.getlist(
                'event_type')

        if 'feature' in request.query_params:
            features = request.query_params.getlist('feature')
            must_terms['event_type'] = expand_event_groups(features)

        # Group events by features in order to prevent large HTTP GET request
        if 'exclude_features' in request.query_params:
            features = request.query_params.getlist('exclude_features')
            excluded_event_types.update(expand_event_groups(features))

        if 'exclude_extra' in request.query_params:
            excluded_event_types.update(expand_event_groups(['update']))

        if not django_settings.DEBUG:
            excluded_event_types.update(expand_event_groups(['debug_only']))

        if excluded_event_types:
            must_not_terms['event_type'] = list(excluded_event_types)

        if 'user_username' in request.query_params:
            must_terms['user_username'] = [
                request.query_params.get('user_username')
            ]

        if 'scope' in request.query_params:
            field = core_serializers.GenericRelatedField(
                related_models=utils.get_loggable_models())
            field._context = {'request': request}
            obj = field.to_internal_value(request.query_params['scope'])

            # XXX: Ilja - disabling this hack and re-opening a ticket. Additional analysis is required for
            # a proper resolution
            # # XXX: hack to prevent leaking customer events
            # permitted_uuids = [uuid.hex for uuids in
            #                    obj.get_permitted_objects_uuids(request.user).values() for uuid in uuids]
            # if obj.uuid.hex not in permitted_uuids:
            #     raise ValidationError('You do not have permission to view events for scope %s'
            #                           % request.query_params['scope'])

            for key, val in obj.filter_by_logged_object().items():
                must_terms[format_raw_field(key)] = [val]

        elif 'scope_type' in request.query_params:
            choices = utils.get_scope_types_mapping()
            try:
                scope_type = choices[request.query_params['scope_type']]
            except KeyError:
                raise ValidationError(
                    _('Scope type "%(value)s" is not valid. Has to be one from list: %(items)s.'
                      ) % dict(value=request.query_params['scope_type'],
                               items=', '.join(choices.keys())))
            else:
                permitted_items = scope_type.get_permitted_objects_uuids(
                    request.user).items()
                if not permitted_items:
                    return EmptyQueryset()
                for field, uuids in permitted_items:
                    must_terms[field] = [uuid.hex for uuid in uuids]

        elif 'resource_type' in request.query_params and 'resource_uuid' in request.query_params:
            # Filter events by resource type and uuid.
            # Please note, that permission checks are skipped,
            # because we can't check permission for deleted resources.
            # Also note, that resource type validation is skipped as well,
            # because resource type name formatting is defined in structure application,
            # but we don't want to create circular dependency between logging and structure apps.
            # This issue could be fixed by switching resource type name formatting to str(model._meta)
            # as it is done for scope_type parameter validation.
            must_terms[format_raw_field('resource_type')] = [
                request.query_params['resource_type']
            ]
            must_terms[format_raw_field('resource_uuid')] = [
                request.query_params['resource_uuid']
            ]

        else:
            should_terms.update(
                event_logger.get_permitted_objects_uuids(request.user))

        mapped = {
            'start': request.query_params.get('from'),
            'end': request.query_params.get('to'),
        }
        timestamp_interval_serializer = core_serializers.TimestampIntervalSerializer(
            data={k: v
                  for k, v in mapped.items() if v})
        timestamp_interval_serializer.is_valid(raise_exception=True)
        filter_data = timestamp_interval_serializer.get_filter_data()

        queryset = queryset.filter(search_text=search_text,
                                   should_terms=should_terms,
                                   must_terms=must_terms,
                                   must_not_terms=must_not_terms,
                                   start=filter_data.get('start'),
                                   end=filter_data.get('end'))

        order_by = get_ordering(request) or '-@timestamp'
        if order_by:
            queryset = queryset.order_by(order_by)

        return queryset