Ejemplo n.º 1
0
class GeometryStoreFilter(filters.FilterSet):
    label = filters.AllLookupsFilter(name='label')
    identifier = UUIDFilter()
    project = filters.RelatedFilter(
        'api.filters.infrastructure.ProjectFilter',
        name='project',
        distinct=True
    )
    project_identifiers = filters.MethodFilter()

    def filter_project_identifiers(self, name, queryset, value):
        value_list = [v for v in value.split(',') if len(v) == 36 or len(v) == 32]
        if value_list:
            return queryset.filter(project__identifier__in=value_list)
        return queryset.none()

    class Meta:
        model = GeometryStore
        fields = ('identifier', 'project')
Ejemplo n.º 2
0
class AdFilter(django_filters.rest_framework.FilterSet):
    user__uuid__ne = UUIDFilter(field_name='user__uuid', method='exclude_user')
    age = CharFilter(field_name='ages', method='filter_ages')
    # XXX: BooleanFilter doesn't work as expected
    is_favorite = CharFilter(field_name='favorited_for',
                             method='filter_favorite')
    is_archive = CharFilter(method='filter_archive')
    is_actual = CharFilter(method='filter_actual')

    class Meta:
        model = Ad
        fields = {
            'user__uuid': ['exact'],
            'created_at': ['lt', 'gt'],
            'type': ['exact'],
            'sex': ['exact']
        }

    def exclude_user(self, queryset, name, value):
        return queryset.exclude(user__uuid=value)

    def filter_actual(self, queryset, name, value):
        """ Актуальные предложения. """
        if value in ('true', 'True', '1'):
            return queryset.filter(
                Q(period__startswith__gte=timezone.now())
                | Q(period__endswith__gte=timezone.now()))
        elif value in ('false', 'False', '0'):
            return queryset.filter(
                Q(period__startswith__lt=timezone.now())
                | Q(period__endswith__lt=timezone.now()))

        return queryset

    def filter_archive(self, queryset, name, value):
        """ Срок завершения предложения вышел. """
        if value in ('true', 'True', '1'):
            return queryset.filter(
                Q(period__startswith__lt=timezone.now())
                | Q(period__endswith__lt=timezone.now()))

        return queryset

    def filter_favorite(self, queryset, name, value):
        if value in (True, 'True', 'true', '1'):
            value = True
        elif value in (False, 'False', 'false', '0'):
            value = False
        else:
            value = None

        if value:
            queryset = queryset.filter(
                favorited_for__contains=[self.request.user.uuid])
        elif value is False:
            queryset = queryset.exclude(
                favorited_for__contains=[self.request.user.uuid])

        return queryset

    def filter_ages(self, queryset, name, value):
        if not value:
            return queryset
        age_from, age_to = self._get_age_filter_params(value)
        return queryset.filter(ages__contains=NumericRange(age_from, age_to))

    def _get_age_filter_params(self, param):
        ages = [x.strip() for x in param.split('-')]
        try:
            age_from = int(ages[0])
        except (ValueError, IndexError):
            age_from = None

        try:
            age_to = int(ages[1])
        except (ValueError, IndexError):
            age_to = None

        return age_from, age_to
Ejemplo n.º 3
0
 def test_default_field(self):
     f = UUIDFilter()
     field = f.field
     self.assertIsInstance(field, forms.UUIDField)
Ejemplo n.º 4
0
class APNSDeviceFilter(BaseDeviceFilter):
    device_id = UUIDFilter(lookup_expr='exact')

    class Meta(BaseDeviceFilter.Meta):
        model = APNSDevice