Esempio n. 1
0
class OrderItemFilter(OfferingFilterMixin, django_filters.FilterSet):
    project_uuid = django_filters.UUIDFilter(field_name='order__project__uuid')
    category_uuid = django_filters.UUIDFilter(
        field_name='offering__category__uuid')
    provider_uuid = django_filters.UUIDFilter(
        field_name='offering__customer__uuid')
    customer_uuid = django_filters.UUIDFilter(
        field_name='order__project__customer__uuid')
    service_manager_uuid = django_filters.UUIDFilter(
        method='filter_service_manager')
    state = core_filters.MappedMultipleChoiceFilter(
        choices=[
            (representation, representation)
            for db_value, representation in models.OrderItem.States.CHOICES
        ],
        choice_mappings={
            representation: db_value
            for db_value, representation in models.OrderItem.States.CHOICES
        },
    )
    type = core_filters.MappedMultipleChoiceFilter(
        choices=[(representation, representation)
                 for db_value, representation in models.OrderItem.Types.CHOICES
                 ],
        choice_mappings={
            representation: db_value
            for db_value, representation in models.OrderItem.Types.CHOICES
        },
    )
    order = core_filters.URLFilter(view_name='marketplace-order-detail',
                                   field_name='order__uuid')
    order_uuid = django_filters.UUIDFilter(field_name='order__uuid')

    resource = core_filters.URLFilter(view_name='marketplace-resource-detail',
                                      field_name='resource__uuid')
    resource_uuid = django_filters.UUIDFilter(field_name='resource__uuid')

    o = django_filters.OrderingFilter(fields=('created', ))

    class Meta:
        model = models.OrderItem
        fields = []

    def filter_service_manager(self, queryset, name, value):
        return queryset.filter(
            offering__shared=True,
            offering__permissions__user__uuid=value,
            offering__permissions__is_active=True,
        )
Esempio n. 2
0
class FeedbackFilter(django_filters.FilterSet):
    issue = core_filters.URLFilter(view_name='support-issue-detail',
                                   field_name='issue__uuid')
    issue_uuid = django_filters.UUIDFilter(field_name='issue__uuid')

    user = core_filters.URLFilter(view_name='user-detail',
                                  field_name='issue__caller__uuid')
    user_uuid = django_filters.UUIDFilter(field_name='issue__caller__uuid')

    created_before = django_filters.DateTimeFilter(field_name="created",
                                                   lookup_expr="lte")
    created_after = django_filters.DateTimeFilter(field_name="created",
                                                  lookup_expr="gte")

    evaluation = core_filters.MappedMultipleChoiceFilter(
        choices=[
            (representation, representation)
            for db_value, representation in models.Feedback.Evaluation.CHOICES
        ],
        choice_mappings={
            representation: db_value
            for db_value, representation in models.Feedback.Evaluation.CHOICES
        },
    )

    issue_key = django_filters.CharFilter(field_name='issue__key')
    user_full_name = django_filters.CharFilter(method='filter_by_full_name',
                                               label='User full name contains')

    def filter_by_full_name(self, queryset, name, value):
        return core_filters.filter_by_full_name(queryset, value,
                                                'issue__caller')
Esempio n. 3
0
class OrderFilter(django_filters.FilterSet):
    customer = core_filters.URLFilter(
        view_name='customer-detail', field_name='project__customer__uuid'
    )
    customer_uuid = django_filters.UUIDFilter(field_name='project__customer__uuid')
    project = core_filters.URLFilter(
        view_name='project-detail', field_name='project__uuid'
    )
    project_uuid = django_filters.UUIDFilter(field_name='project__uuid')
    state = core_filters.MappedMultipleChoiceFilter(
        choices=[
            (representation, representation)
            for db_value, representation in models.Order.States.CHOICES
        ],
        choice_mappings={
            representation: db_value
            for db_value, representation in models.Order.States.CHOICES
        },
    )
    o = django_filters.OrderingFilter(
        fields=('created', 'approved_at', 'total_cost', 'state')
    )

    class Meta:
        model = models.Order
        fields = []
Esempio n. 4
0
class OrderItemFilter(django_filters.FilterSet):
    offering = core_filters.URLFilter(view_name='marketplace-offering-detail',
                                      name='offering__uuid')
    offering_uuid = django_filters.UUIDFilter(name='offering__uuid')
    project_uuid = django_filters.UUIDFilter(name='order__project__uuid')
    category_uuid = django_filters.UUIDFilter(name='offering__category__uuid')
    provider_uuid = django_filters.UUIDFilter(name='offering__customer__uuid')
    customer_uuid = django_filters.UUIDFilter(
        name='order__project__customer__uuid')
    state = core_filters.MappedMultipleChoiceFilter(
        choices=[
            (representation, representation)
            for db_value, representation in models.OrderItem.States.CHOICES
        ],
        choice_mappings={
            representation: db_value
            for db_value, representation in models.OrderItem.States.CHOICES
        },
    )

    order = core_filters.URLFilter(view_name='marketplace-order-detail',
                                   name='order__uuid')
    order_uuid = django_filters.UUIDFilter(name='order__uuid')

    class Meta(object):
        model = models.OrderItem
        fields = []
Esempio n. 5
0
class OfferingFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='icontains')
    description = django_filters.CharFilter(lookup_expr='icontains')
    type = django_filters.ChoiceFilter(
        choices=[(item, item)
                 for item in settings.WALDUR_SUPPORT['OFFERINGS'].keys()])
    issue = core_filters.URLFilter(view_name='support-issue-detail',
                                   name='issue__uuid')
    issue_uuid = django_filters.UUIDFilter(name='issue__uuid')
    project = core_filters.URLFilter(view_name='project-detail',
                                     name='project__uuid')
    project_uuid = django_filters.UUIDFilter(name='project__uuid')
    state = core_filters.MappedMultipleChoiceFilter(
        choices=[(representation, representation)
                 for db_value, representation in models.Offering.States.CHOICES
                 ],
        choice_mappings={
            representation: db_value
            for db_value, representation in models.Offering.States.CHOICES
        },
    )

    o = django_filters.OrderingFilter(fields=('created', 'modified', 'state'))

    class Meta(object):
        model = models.Offering
        fields = ('name', 'description', 'type', 'issue', 'issue_uuid',
                  'project', 'project_uuid', 'state')
Esempio n. 6
0
class ResourceFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='icontains')
    name_exact = django_filters.CharFilter(field_name='name')
    query = django_filters.CharFilter(method='filter_query')
    offering = core_filters.URLFilter(view_name='marketplace-offering-detail',
                                      field_name='offering__uuid')
    offering_uuid = django_filters.UUIDFilter(field_name='offering__uuid')
    offering_type = django_filters.CharFilter(field_name='offering__type')
    offering_billable = django_filters.UUIDFilter(
        field_name='offering__billable')
    project_uuid = django_filters.UUIDFilter(field_name='project__uuid')
    project_name = django_filters.CharFilter(field_name='project__name')
    customer_uuid = django_filters.UUIDFilter(
        field_name='project__customer__uuid')
    category_uuid = django_filters.UUIDFilter(
        field_name='offering__category__uuid')
    provider_uuid = django_filters.UUIDFilter(
        field_name='offering__customer__uuid')
    backend_id = django_filters.CharFilter(method='filter_backend_id')
    state = core_filters.MappedMultipleChoiceFilter(
        choices=[(representation, representation)
                 for db_value, representation in models.Resource.States.CHOICES
                 ],
        choice_mappings={
            representation: db_value
            for db_value, representation in models.Resource.States.CHOICES
        },
    )
    o = django_filters.OrderingFilter(fields=(
        'name',
        'created',
    ))

    class Meta:
        model = models.Resource
        fields = []

    def filter_query(self, queryset, name, value):
        if is_uuid_like(value):
            return queryset.filter(uuid=value)
        else:
            return queryset.filter(name__icontains=value)

    def filter_backend_id(self, queryset, name, value):
        resource_models = [
            b['resource_model'] for b in manager.backends.values()
            if 'resource_model' in b.keys()
        ]
        for resource_model in resource_models:
            resources_ids = resource_model.objects.filter(
                backend_id=value).values_list('id', flat=True)

            if not resources_ids:
                continue

            ct = ContentType.objects.get_for_model(resource_model)
            return queryset.filter(content_type=ct,
                                   object_id__in=resources_ids)

        return queryset.none()
Esempio n. 7
0
class BaseOfferingFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='icontains')
    name_exact = django_filters.CharFilter(field_name='name')
    customer = core_filters.URLFilter(
        view_name='customer-detail', field_name='customer__uuid'
    )
    customer_uuid = django_filters.UUIDFilter(field_name='customer__uuid')
    project_uuid = django_filters.UUIDFilter(method='filter_project')
    allowed_customer_uuid = django_filters.UUIDFilter(
        field_name='customer__uuid', method='filter_allowed_customer'
    )
    attributes = django_filters.CharFilter(
        field_name='attributes', method='filter_attributes'
    )
    state = core_filters.MappedMultipleChoiceFilter(
        choices=[
            (representation, representation)
            for db_value, representation in models.Offering.States.CHOICES
        ],
        choice_mappings={
            representation: db_value
            for db_value, representation in models.Offering.States.CHOICES
        },
    )
    category_uuid = django_filters.UUIDFilter(field_name='category__uuid')
    billable = django_filters.BooleanFilter(widget=BooleanWidget)
    o = django_filters.OrderingFilter(fields=('name', 'created'))

    def filter_allowed_customer(self, queryset, name, value):
        return queryset.filter_for_customer(value)

    def filter_project(self, queryset, name, value):
        return queryset.filter_for_project(value)

    def filter_attributes(self, queryset, name, value):
        try:
            value = json.loads(value)
        except ValueError:
            raise rf_exceptions.ValidationError(
                _('Filter attribute is not valid json.')
            )

        if not isinstance(value, dict):
            raise rf_exceptions.ValidationError(
                _('Filter attribute should be an dict.')
            )

        for k, v in value.items():
            if isinstance(v, list):
                # If a filter value is a list, use multiple choice.
                queryset = queryset.filter(
                    **{'attributes__{key}__has_any_keys'.format(key=k): v}
                )
            else:
                queryset = queryset.filter(attributes__contains={k: v})
        return queryset
Esempio n. 8
0
class OfferingFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='icontains')
    description = django_filters.CharFilter(lookup_expr='icontains')
    type = django_filters.ModelMultipleChoiceFilter(
        queryset=models.OfferingTemplate.objects.all(),
        to_field_name='name',
        method='offering_template_filter',
    )
    template = django_filters.ModelMultipleChoiceFilter(
        queryset=models.OfferingTemplate.objects.all(),
    )
    issue = core_filters.URLFilter(
        view_name='support-issue-detail', field_name='issue__uuid'
    )
    issue_uuid = django_filters.UUIDFilter(field_name='issue__uuid')
    issue_key = django_filters.CharFilter(field_name='issue__key')
    project = core_filters.URLFilter(
        view_name='project-detail', field_name='project__uuid'
    )
    project_uuid = django_filters.UUIDFilter(field_name='project__uuid')
    state = core_filters.MappedMultipleChoiceFilter(
        choices=[
            (representation, representation)
            for db_value, representation in models.Offering.States.CHOICES
        ],
        choice_mappings={
            representation: db_value
            for db_value, representation in models.Offering.States.CHOICES
        },
    )

    o = django_filters.OrderingFilter(fields=('created', 'modified', 'state'))

    def offering_template_filter(self, queryset, name, value):
        if value:
            return queryset.filter(template__in=value)
        return queryset

    class Meta:
        model = models.Offering
        fields = (
            'name',
            'description',
            'template',
            'issue',
            'issue_uuid',
            'project',
            'project_uuid',
            'state',
        )
Esempio n. 9
0
class ResourceFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='icontains')
    name_exact = django_filters.CharFilter(field_name='name')
    query = django_filters.CharFilter(method='filter_query')
    offering = core_filters.URLFilter(view_name='marketplace-offering-detail',
                                      field_name='offering__uuid')
    offering_uuid = django_filters.UUIDFilter(field_name='offering__uuid')
    offering_type = django_filters.CharFilter(field_name='offering__type')
    offering_billable = django_filters.UUIDFilter(
        field_name='offering__billable')
    project_uuid = django_filters.UUIDFilter(field_name='project__uuid')
    project_name = django_filters.CharFilter(field_name='project__name')
    customer_uuid = django_filters.UUIDFilter(
        field_name='project__customer__uuid')
    category_uuid = django_filters.UUIDFilter(
        field_name='offering__category__uuid')
    provider_uuid = django_filters.UUIDFilter(
        field_name='offering__customer__uuid')
    state = core_filters.MappedMultipleChoiceFilter(
        choices=[(representation, representation)
                 for db_value, representation in models.Resource.States.CHOICES
                 ],
        choice_mappings={
            representation: db_value
            for db_value, representation in models.Resource.States.CHOICES
        },
    )
    o = django_filters.OrderingFilter(fields=(
        'name',
        'created',
    ))

    class Meta:
        model = models.Resource
        fields = []

    def filter_query(self, queryset, name, value):
        if is_uuid_like(value):
            return queryset.filter(uuid=value)
        else:
            return queryset.filter(name__icontains=value)
Esempio n. 10
0
class OfferingFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='icontains')
    customer = core_filters.URLFilter(view_name='customer-detail',
                                      name='customer__uuid')
    customer_uuid = django_filters.UUIDFilter(name='customer__uuid')
    attributes = django_filters.CharFilter(name='attributes',
                                           method='filter_attributes')
    state = core_filters.MappedMultipleChoiceFilter(
        choices=[(representation, representation)
                 for db_value, representation in models.Offering.States.CHOICES
                 ],
        choice_mappings={
            representation: db_value
            for db_value, representation in models.Offering.States.CHOICES
        },
    )
    category_uuid = django_filters.UUIDFilter(name='category__uuid')

    def filter_attributes(self, queryset, name, value):
        try:
            value = json.loads(value)
        except ValueError:
            raise rf_exceptions.ValidationError(
                _('Filter attribute is not valid json.'))

        if not isinstance(value, dict):
            raise rf_exceptions.ValidationError(
                _('Filter attribute should be an dict.'))

        for k, v in value.items():
            if isinstance(v, list):
                # If a filter value is a list, use multiple choice.
                queryset = queryset.filter(
                    **{'attributes__{key}__has_any_keys'.format(key=k): v})
            else:
                queryset = queryset.filter(attributes__contains={k: v})
        return queryset

    class Meta(object):
        model = models.Offering
        fields = ['shared', 'type']
Esempio n. 11
0
class OrderFilter(django_filters.FilterSet):
    customer = core_filters.URLFilter(view_name='customer-detail',
                                      field_name='project__customer__uuid')
    customer_uuid = django_filters.UUIDFilter(
        field_name='project__customer__uuid')
    project = core_filters.URLFilter(view_name='project-detail',
                                     field_name='project__uuid')
    project_uuid = django_filters.UUIDFilter(field_name='project__uuid')
    state = core_filters.MappedMultipleChoiceFilter(
        choices=[(representation, representation)
                 for db_value, representation in models.Order.States.CHOICES],
        choice_mappings={
            representation: db_value
            for db_value, representation in models.Order.States.CHOICES
        },
    )
    type = django_filters.MultipleChoiceFilter(
        choices=[(representation, representation) for db_value, representation
                 in models.RequestTypeMixin.Types.CHOICES],
        method='filter_items_type',
        label='Items type',
    )
    o = django_filters.OrderingFilter(fields=('created', 'approved_at',
                                              'total_cost', 'state'))

    class Meta:
        model = models.Order
        fields = []

    def filter_items_type(self, queryset, name, value):
        type_ids = []

        for v in value:
            for type_id, type_name in models.RequestTypeMixin.Types.CHOICES:
                if type_name == v:
                    type_ids.append(type_id)

        order_ids = models.OrderItem.objects.filter(
            type__in=type_ids).values_list('order_id', flat=True)
        return queryset.filter(id__in=order_ids)
Esempio n. 12
0
class BaseResourceFilter(NameFilterSet, metaclass=ResourceFilterMetaclass):
    def __init__(self, *args, **kwargs):
        super(BaseResourceFilter, self).__init__(*args, **kwargs)
        self.filters['o'] = django_filters.OrderingFilter(fields=self.ORDERING_FIELDS)

    # customer
    customer = django_filters.UUIDFilter(
        field_name='service_project_link__service__customer__uuid'
    )
    customer_uuid = django_filters.UUIDFilter(
        field_name='service_project_link__service__customer__uuid'
    )
    customer_name = django_filters.CharFilter(
        field_name='service_project_link__service__customer__name',
        lookup_expr='icontains',
    )
    customer_native_name = django_filters.CharFilter(
        field_name='service_project_link__project__customer__native_name',
        lookup_expr='icontains',
    )
    customer_abbreviation = django_filters.CharFilter(
        field_name='service_project_link__project__customer__abbreviation',
        lookup_expr='icontains',
    )
    # project
    project = django_filters.UUIDFilter(
        field_name='service_project_link__project__uuid'
    )
    project_uuid = django_filters.UUIDFilter(
        field_name='service_project_link__project__uuid'
    )
    project_name = django_filters.CharFilter(
        field_name='service_project_link__project__name', lookup_expr='icontains'
    )
    # service
    service_uuid = django_filters.UUIDFilter(
        field_name='service_project_link__service__uuid'
    )
    service_name = django_filters.CharFilter(
        field_name='service_project_link__service__settings__name',
        lookup_expr='icontains',
    )
    # service settings
    service_settings_uuid = django_filters.UUIDFilter(
        field_name='service_project_link__service__settings__uuid'
    )
    service_settings_name = django_filters.CharFilter(
        field_name='service_project_link__service__settings__name',
        lookup_expr='icontains',
    )
    # resource
    description = django_filters.CharFilter(lookup_expr='icontains')
    state = core_filters.MappedMultipleChoiceFilter(
        choices=[
            (representation, representation)
            for db_value, representation in core_models.StateMixin.States.CHOICES
        ],
        choice_mappings={
            representation: db_value
            for db_value, representation in core_models.StateMixin.States.CHOICES
        },
    )
    uuid = django_filters.UUIDFilter(lookup_expr='exact')
    backend_id = django_filters.CharFilter(field_name='backend_id', lookup_expr='exact')
    tag = django_filters.ModelMultipleChoiceFilter(
        field_name='tags__name',
        label='tag',
        to_field_name='name',
        queryset=taggit.models.Tag.objects.all(),
    )
    rtag = django_filters.ModelMultipleChoiceFilter(
        field_name='tags__name',
        label='rtag',
        to_field_name='name',
        queryset=taggit.models.Tag.objects.all(),
        conjoined=True,
    )
    external_ip = core_filters.EmptyFilter()

    ORDERING_FIELDS = (
        ('name', 'name'),
        ('state', 'state'),
        ('service_project_link__project__customer__name', 'customer_name'),
        (
            'service_project_link__project__customer__native_name',
            'customer_native_name',
        ),
        (
            'service_project_link__project__customer__abbreviation',
            'customer_abbreviation',
        ),
        ('service_project_link__project__name', 'project_name'),
        ('service_project_link__service__settings__name', 'service_name'),
        ('service_project_link__service__uuid', 'service_uuid'),
        ('created', 'created'),
    )

    class Meta:
        model = models.ResourceMixin
        fields = (
            # customer
            'customer',
            'customer_uuid',
            'customer_name',
            'customer_native_name',
            'customer_abbreviation',
            # project
            'project',
            'project_uuid',
            'project_name',
            # service
            'service_uuid',
            'service_name',
            # service settings
            'service_settings_name',
            'service_settings_uuid',
            # resource
            'name',
            'name_exact',
            'description',
            'state',
            'uuid',
            'backend_id',
            'tag',
            'rtag',
        )
Esempio n. 13
0
class ResourceFilter(OfferingFilterMixin, structure_filters.NameFilterSet,
                     django_filters.FilterSet):
    query = django_filters.CharFilter(method='filter_query')
    offering_type = django_filters.CharFilter(field_name='offering__type')
    offering_billable = django_filters.UUIDFilter(
        field_name='offering__billable')
    project_uuid = django_filters.UUIDFilter(field_name='project__uuid')
    project_name = django_filters.CharFilter(field_name='project__name')
    customer_uuid = django_filters.UUIDFilter(
        field_name='project__customer__uuid')
    customer = core_filters.URLFilter(view_name='customer-detail',
                                      field_name='project__customer__uuid')
    service_manager_uuid = django_filters.UUIDFilter(
        method='filter_service_manager')
    category_uuid = django_filters.UUIDFilter(
        field_name='offering__category__uuid')
    provider_uuid = django_filters.UUIDFilter(
        field_name='offering__customer__uuid')
    backend_id = django_filters.CharFilter()
    state = core_filters.MappedMultipleChoiceFilter(
        choices=[(representation, representation)
                 for db_value, representation in models.Resource.States.CHOICES
                 ],
        choice_mappings={
            representation: db_value
            for db_value, representation in models.Resource.States.CHOICES
        },
    )
    o = django_filters.OrderingFilter(fields=(
        'name',
        'created',
    ))

    class Meta:
        model = models.Resource
        fields = []

    def filter_query(self, queryset, name, value):
        if is_uuid_like(value):
            if queryset.filter(uuid=value).exists():
                return queryset.filter(uuid=value)
            else:
                return self.filter_scope_uuid(queryset, name, value)
        else:
            return queryset.filter(
                Q(name__icontains=value)
                | Q(backend_metadata__external_ips__icontains=value)
                | Q(backend_metadata__internal_ips__icontains=value))

    def filter_service_manager(self, queryset, name, value):
        return queryset.filter(
            offering__shared=True,
            offering__permissions__user__uuid=value,
            offering__permissions__is_active=True,
        )

    def filter_scope_uuid(self, queryset, name, value):

        for offering_type in plugins.manager.get_offering_types():
            resource_model = plugins.manager.get_resource_model(offering_type)

            if not resource_model:
                continue

            try:
                obj = resource_model.objects.get(uuid=value)
                ct = ContentType.objects.get_for_model(resource_model)

                if queryset.filter(content_type=ct, object_id=obj.id).exists():
                    return queryset.filter(content_type=ct, object_id=obj.id)

            except resource_model.DoesNotExist:
                continue

        return queryset.none()