Exemple #1
0
class UserTagFilter(filterset.FilterSet):
    created_date__lte = filters.DateTimeFilter(field_name="created_date",
                                               lookup_expr="lte")
    created_date__gte = filters.DateTimeFilter(field_name="created_date",
                                               lookup_expr="gte")
    user = filters.NumberFilter(field_name="user")
    album = filters.NumberFilter(field_name="photo__album")
Exemple #2
0
class CourseViewFilter(FilterSet):
    start_at = filters.DateTimeFilter(lookup_expr='gte')
    end_at = filters.DateTimeFilter(lookup_expr='lte')

    class Meta:
        model = Course
        fields = ['start_at', 'end_at']
Exemple #3
0
class AlbumFilter(filterset.FilterSet, TagsFilterMixin):
    published_date__lte = filters.DateTimeFilter(field_name="published_date",
                                                 lookup_expr="lte")
    published_date__gte = filters.DateTimeFilter(field_name="published_date",
                                                 lookup_expr="gte")
    public = filters.BooleanFilter(field_name="public")
    query = WatsonFilter()
Exemple #4
0
class PhotoFilter(filterset.FilterSet, TagsFilterMixin):
    created_date__lte = filters.DateTimeFilter(field_name="created_date",
                                               lookup_expr="lte")
    created_date__gte = filters.DateTimeFilter(field_name="created_date",
                                               lookup_expr="gte")
    album = filters.NumberFilter(field_name="album")
    photographer = filters.NumberFilter(field_name="photographer")
Exemple #5
0
class OrderFilter(FilterSet):
    start_date = filters.DateTimeFilter(
        field_name='order_created_datetime', lookup_expr='lt', input_formats=['%d-%m-%Y %H:%M']
    )
    end_date = filters.DateTimeFilter(
        field_name='order_created_datetime', lookup_expr='gt', input_formats=['%d-%m-%Y %H:%M']
    )
    date_range = filters.DateRangeFilter(field_name='order_created_datetime')
    status = filters.ChoiceFilter(field_name='status', choices=StatusChoice.choices())

    class Meta:
        model = Order
        fields = ['start_date', 'end_date', 'date_range', 'status']
Exemple #6
0
class PostFilter(FilterSet):
    title_contains = filters.CharFilter(field_name="title",
                                        lookup_expr='icontains')
    created_before = filters.DateTimeFilter(field_name='created_on',
                                            lookup_expr='lte')
    updated_before = filters.DateTimeFilter(field_name='updated_on',
                                            lookup_expr='lte')

    class Meta:
        model = Post
        fields = [
            'title_contains', 'created_before', 'updated_before', 'categories'
        ]
Exemple #7
0
class MarketFilter(FilterSet):

    title = filters.CharFilter(field_name='title', lookup_expr='icontains')
    user = filters.CharFilter(field_name='user__name', lookup_expr='icontains')
    coadjutant = filters.CharFilter(field_name='coadjutant__name', lookup_expr='icontains')
    company = filters.CharFilter(field_name='company', lookup_expr='icontains')
    end_traceTime = filters.DateTimeFilter(field_name='traceTime', lookup_expr='lte')
    department = filters.CharFilter(field_name='user__department')
    start_time = filters.DateTimeFilter(field_name='estimated_time', lookup_expr='gte')
    end_time = filters.DateTimeFilter(field_name='estimated_time', lookup_expr='lte')

    class Meta:
        model = models.Market
        fields =['hit_rate', 'address']
Exemple #8
0
class JournalFilter(FilterSet):

    user = filters.CharFilter(method='filter_user')
    department = filters.CharFilter(method='filter_department')
    department_list = filters.CharFilter(method='filter_department')
    work_status_list = filters.CharFilter(method='filter_work_status')
    start_time = filters.DateTimeFilter(field_name='create_time', lookup_expr='gte')
    end_time = filters.DateTimeFilter(field_name='create_time', lookup_expr='lte')

    month = filters.CharFilter(method='filter_month')

    def filter_user(self, queryset, name, value):
        obj = p_models.User.objects.filter(name__contains=value).values('id')
        userList = [v['id'] for v in obj]
        return queryset.filter(user__in=userList)

    def filter_department(self, queryset, name, value):
        value_list = value.split(',')
        obj = p_models.Structure.objects.filter(deptid__in=value_list).values('users__id')
        userList = [v['users__id'] for v in obj]
        return queryset.filter(user__in=userList)

    def filter_work_status(self, queryset, name, value):
        value_list = value.split(',')
        return queryset.filter(work_status__in=value_list)

    def filter_month(self, queryset, name, value):
        year, month, day = value.split('-')
        t = datetime.datetime(int(year), int(month), int(day))
        year = t.strftime('%Y')
        month = t.strftime('%m')
        if int(month) == 12:
            end_year = '%d'%(int(year)+1)
            end_month = '1'
        else:
            end_year = year
            end_month = '%d'%(int(month)+1)
        return queryset.filter(create_time__gte="%s-%s-%s"%(year, month, day)).filter(create_time__lte="%s-%s-%s"%(end_year, end_month, day))

    class Meta:
        model = models.WorkLogs
        fields =[]
Exemple #9
0
class ElectedSetFilter(ResultsFilterMixin):
    class Meta:
        model = Membership
        fields = ["election_date", "election_id", "last_updated"]

    last_updated = filters.DateTimeFilter(
        field_name="updated_at",
        lookup_expr="gt",
        label="Last updated",
        help_text="An ISO datetime",
    )
Exemple #10
0
class ResultsFilterMixin(filterset.FilterSet):
    election_id = filters.CharFilter(
        field_name="ballot__election__slug",
        label="Election Slug",
        help_text="An election slug, used to get all "
        "results for a given election",
    )
    election_date = filters.DateFilter(
        field_name="ballot__election__election_date",
        label="Election Date",
        help_text="Election Date in ISO format",
    )
    last_updated = filters.DateTimeFilter(
        field_name="modified",
        lookup_expr="gt",
        label="Last updated",
        help_text="An ISO datetime",
    )
Exemple #11
0
class MarketHistoryFilter(FilterSet):

    department = filters.CharFilter(field_name='user__department')
    start_time = filters.DateTimeFilter(field_name='date', lookup_expr='gte')
    end_time = filters.DateTimeFilter(field_name='date', lookup_expr='lte')
Exemple #12
0
class ChangesetFilter(GeoFilterSet):
    """Allows to filter Changesets by any of its fields, except 'uuid' (id of
    OSM user). The 'reasons' and the 'harmful_reasons' fields can be filtered
    by the exact match (filter changesets that have all the search reasons) or
    by contains match (filter changesets that have any of the reasons).
    """
    geometry = GeometryFilter(
        field_name='bbox',
        lookup_expr='intersects',
        help_text="""Geospatial filter of changeset whose bbox intersects with
            another geometry. You can use any geometry type in this filter.""")
    checked_by = filters.CharFilter(
        field_name='check_user',
        method='filter_checked_by',
        help_text="""Filter changesets that were checked by a user. Use commas
            to search for more than one user.""")
    users = filters.CharFilter(
        field_name='user',
        method='filter_users',
        help_text="""Filter changesets created by a user. Use commas to search
            for more than one user.""")
    ids = filters.CharFilter(
        field_name='id',
        method='filter_ids',
        help_text="""Filter changesets by its ID. Use commas to search for more
            than one id.""")
    uids = filters.CharFilter(
        field_name='uid',
        method='filter_uids',
        help_text="""Filter changesets by its uid. The uid is a unique identifier
        of each user in OSM. Use commas to search for more than one uid.""")
    checked = filters.BooleanFilter(
        field_name='checked',
        widget=BooleanWidget(),
        help_text="""Filter changesets that were checked or not. Use true/false,
            1/0 values.""")
    harmful = filters.BooleanFilter(
        field_name='harmful',
        widget=BooleanWidget(),
        help_text="""Filter changesets that were marked as harmful or not.
            Use true/false, 1/0 values.""")
    is_suspect = filters.BooleanFilter(
        field_name='is_suspect',
        widget=BooleanWidget(),
        help_text='Filter changesets that were considered suspect by OSMCHA.')
    powerfull_editor = filters.BooleanFilter(
        field_name='powerfull_editor',
        widget=BooleanWidget(),
        help_text="""Filter changesets that were created using a software editor
            considered powerfull (those that allow to create, modify or delete
            data in a batch).""")
    order_by = filters.CharFilter(
        field_name='order',
        method='order_queryset',
        help_text="""Order the Changesets by one of the following fields: id,
            date, check_date, create, modify, delete or number_reasons. Use a
            minus sign (-) before the field name to reverse the ordering.
            Default ordering is '-id'.""")
    hide_whitelist = filters.BooleanFilter(
        field_name='user',
        method='filter_whitelist',
        widget=BooleanWidget(),
        help_text="""If True, it will exclude the changesets created by the
            users that you whitelisted.""")
    blacklist = filters.BooleanFilter(
        field_name='user',
        method='filter_blacklist',
        widget=BooleanWidget(),
        help_text="""If True, it will get only the changesets created by the
            users that you blacklisted.""")
    mapping_teams = filters.CharFilter(
        field_name='user',
        method='filter_mapping_team',
        help_text="""Filter changesets created by users that are on a Mapping
            Team. It accepts a list of teams separated by commas.""")
    exclude_teams = filters.CharFilter(
        field_name='user',
        method='exclude_mapping_team',
        help_text="""Exclude changesets created by users that are on a Mapping
            Team. It accepts a list of teams separated by commas.""")
    exclude_trusted_teams = filters.BooleanFilter(
        field_name='user',
        method='filter_hide_trusted_teams',
        widget=BooleanWidget(),
        help_text="""If True, it will exclude the changesets created by the
            users that are part of trusted teams.""")
    area_lt = filters.CharFilter(
        field_name='user',
        method='filter_area_lt',
        help_text="""Filter changesets that have a bbox area lower than X times
            the area of your geospatial filter. For example, if the bbox or
            geometry you defined in your filter has an area of 1 degree and you
            set 'area_lt=2', it will filter the changesets whose bbox area is
            lower than 2 degrees.""")
    create__gte = filters.NumberFilter(
        field_name='create',
        lookup_expr='gte',
        help_text="""Filter changesets whose number of elements created are
            greater than or equal to a number.""")
    create__lte = filters.NumberFilter(
        field_name='create',
        lookup_expr='lte',
        help_text="""Filter changesets whose number of elements created are
            lower than or equal to a number.""")
    modify__gte = filters.NumberFilter(
        field_name='modify',
        lookup_expr='gte',
        help_text="""Filter changesets whose number of elements modified are
            greater than or equal to a number.""")
    modify__lte = filters.NumberFilter(
        field_name='modify',
        lookup_expr='lte',
        help_text="""Filter changesets whose number of elements modified are
            lower than or equal to a number.""")
    delete__gte = filters.NumberFilter(
        field_name='delete',
        lookup_expr='gte',
        help_text="""Filter changesets whose number of elements deleted are
            greater than or equal to a number.""")
    delete__lte = filters.NumberFilter(
        field_name='delete',
        lookup_expr='lte',
        help_text="""Filter changesets whose number of elements deleted are
            lower than or equal to a number.""")
    date__gte = filters.DateTimeFilter(
        field_name='date',
        lookup_expr='gte',
        help_text="""Filter changesets whose date is greater than or equal to a
            date or a datetime value.""")
    date__lte = filters.DateTimeFilter(
        field_name='date',
        lookup_expr='lte',
        help_text="""Filter changesets whose date is lower than or equal to a
            date or a datetime value.""")
    check_date__gte = filters.DateTimeFilter(
        field_name='check_date',
        lookup_expr='gte',
        help_text="""Filter changesets whose check_date is greater than or equal
            to a date or a datetime value.""")
    check_date__lte = filters.DateTimeFilter(
        field_name='check_date',
        lookup_expr='lte',
        help_text="""Filter changesets whose check_date is lower than or equal
            to a date or a datetime value.""")
    editor = filters.CharFilter(
        field_name='editor',
        lookup_expr='icontains',
        help_text="""Filter changesets created with a software editor. It uses
            the icontains lookup expression, so a query for 'josm' will return
            changesets created or last modified with all JOSM versions.""")
    comment = filters.CharFilter(
        field_name='comment',
        lookup_expr='icontains',
        help_text="""Filter changesets by its comment field using the icontains
            lookup expression.""")
    source = filters.CharFilter(
        field_name='source',
        lookup_expr='icontains',
        help_text="""Filter changesets by its source field using the icontains
            lookup expression.""")
    imagery_used = filters.CharFilter(
        field_name='imagery_used',
        lookup_expr='icontains',
        help_text="""Filter changesets by its imagery_used field using the
            icontains lookup expression.""")
    reasons = filters.CharFilter(
        field_name='reasons',
        method='filter_any_reasons',
        help_text="""Filter changesets that have one or more of the Suspicion
            Reasons. Inform the Suspicion Reasons ids separated by commas.""")
    all_reasons = filters.CharFilter(
        field_name='reasons',
        method='filter_all_reasons',
        help_text="""Filter changesets that have ALL the Suspicion Reasons of a
            list. Inform the Suspicion Reasons ids separated by commas.""")
    number_reasons__gte = filters.NumberFilter(
        field_name='number_reasons',
        method='filter_number_reasons',
        help_text="""Filter changesets whose number of Suspicion Reasons is
            equal or greater than a value.""")
    tags = filters.CharFilter(
        field_name='tags',
        method='filter_any_reasons',
        help_text="""Filter changesets that have one or more of the Tags. Inform
            the Tags ids separated by commas.""")
    all_tags = filters.CharFilter(
        field_name='tags',
        method='filter_all_reasons',
        help_text="""Filter changesets that have ALL the Tags of a list. Inform
            the Tags ids separated by commas.""")

    def filter_whitelist(self, queryset, name, value):
        if (self.request is None
                or self.request.user.is_authenticated) and value:
            whitelist = self.request.user.whitelists.values_list(
                'whitelist_user', flat=True)
            return queryset.exclude(user__in=whitelist)
        else:
            return queryset

    def filter_blacklist(self, queryset, name, value):
        if (self.request is None
                or self.request.user.is_authenticated) and value:
            blacklist = self.request.user.blacklisteduser_set.values_list(
                'uid', flat=True)
            return queryset.filter(uid__in=blacklist)
        else:
            return queryset

    def get_username_from_teams(self, teams):
        users = []
        for i in teams.values_list('users', flat=True):
            values = i
            if type(values) in [str, bytes, bytearray]:
                values = json.loads(values)
            for e in values:
                users.append(e.get('username'))
        return users

    def filter_mapping_team(self, queryset, name, value):
        try:
            # added `if team` to avoid empty strings
            teams = MappingTeam.objects.filter(
                name__in=[team.strip() for team in value.split(',') if team])
            users = self.get_username_from_teams(teams)
            return queryset.filter(user__in=users)
        except MappingTeam.DoesNotExist:
            return queryset

    def exclude_mapping_team(self, queryset, name, value):
        try:
            teams = MappingTeam.objects.filter(
                name__in=[team.strip() for team in value.split(',') if team])
            users = self.get_username_from_teams(teams)
            return queryset.exclude(user__in=users)
        except MappingTeam.DoesNotExist:
            return queryset

    def filter_hide_trusted_teams(self, queryset, name, value):
        teams = MappingTeam.objects.filter(trusted=True)
        users = self.get_username_from_teams(teams)
        if users:
            return queryset.exclude(user__in=users)
        else:
            return queryset

    def filter_checked_by(self, queryset, name, value):
        if (self.request is None
                or self.request.user.is_authenticated) and value:
            lookup = '__'.join([name, 'name__in'])
            users = [t.strip() for t in value.split(',')]
            return queryset.filter(**{lookup: users})
        else:
            return queryset

    def filter_users(self, queryset, name, value):
        if (self.request is None
                or self.request.user.is_authenticated) and value:
            lookup = '__'.join([name, 'in'])
            users_array = [t.strip() for t in value.split(',')]
            return queryset.filter(**{lookup: users_array})
        else:
            return queryset

    def filter_ids(self, queryset, name, value):
        lookup = '__'.join([name, 'in'])
        values = [int(n) for n in value.split(',')]
        return queryset.filter(**{lookup: values})

    def filter_uids(self, queryset, name, value):
        if (self.request is None
                or self.request.user.is_authenticated) and value:
            lookup = '__'.join([name, 'in'])
            values = [n for n in value.split(',')]
            return queryset.filter(**{lookup: values})
        else:
            return queryset

    def filter_any_reasons(self, queryset, name, value):
        lookup = '__'.join([name, 'id', 'in'])
        values = [int(t) for t in value.split(',')]
        return queryset.filter(**{lookup: values}).distinct()

    def filter_all_reasons(self, queryset, name, value):
        lookup = '__'.join([name, 'id'])
        values = [int(t) for t in value.split(',')]
        for term in values:
            queryset = queryset.filter(**{lookup: term})
        return queryset

    def filter_number_reasons(self, queryset, name, value):
        lookup = '__'.join([name, 'gte'])
        queryset = queryset.annotate(number_reasons=Count('reasons'))
        return queryset.filter(**{lookup: value})

    def order_queryset(self, queryset, name, value):
        allowed_fields = [
            'date', '-date', 'id', 'check_date', '-check_date', 'create',
            'modify', 'delete', '-create', '-modify', '-delete',
            'number_reasons', '-number_reasons'
        ]
        if value in allowed_fields:
            if value in ['number_reasons', '-number_reasons']:
                queryset = queryset.annotate(number_reasons=Count('reasons'))
            return queryset.order_by(value)
        else:
            return queryset

    def filter_area_lt(self, queryset, name, value):
        """This filter method was designed to exclude changesets that are much
        bigger than the filter area. For example, if you want to exclude
        changesets that are greater than 5 times the filter area, you need to
        set the value to 5.
        """
        if 'geometry' in self.data.keys():
            try:
                filter_area = self.data['geometry'].area
            except AttributeError:
                filter_area = GeometryField().to_internal_value(
                    self.data['geometry']).area
            return queryset.filter(area__lt=float(value) * filter_area)
        elif 'in_bbox' in self.data.keys():
            try:
                filter_area = Polygon.from_bbox(
                    (float(n) for n in self.data['in_bbox'].split(','))).area
                return queryset.filter(area__lt=float(value) * filter_area)
            except ValueError:
                return queryset
        else:
            return queryset

    class Meta:
        model = Changeset
        fields = ['geometry', 'users', 'area_lt']
Exemple #13
0
class FeatureFilter(GeoFilterSet):
    """Filter Feature model objects."""
    geometry = GeometryFilter(
        name='geometry',
        lookup_expr='intersects',
        help_text="""Geospatial filter of features whose geometry intersects with
            another geometry. You can use any geometry type in this filter.""")
    checked = filters.BooleanFilter(
        widget=BooleanWidget(),
        help_text="""Filter features that were checked or not. Use true/false or
            1/0 values.""")
    changeset_checked = filters.BooleanFilter(
        name='changeset__checked',
        widget=BooleanWidget(),
        help_text="""Filter features whose changeset is checked or not. Use
            true/false or 1/0 values.""")
    harmful = filters.BooleanFilter(
        widget=BooleanWidget(),
        help_text="""Filter features that were marked as harmful or not harmful.
            Use true/false or 1/0 values.""")
    users = filters.CharFilter(
        name='changeset__user',
        method='filter_changeset_users',
        help_text="""Filter features whose last edit was made by a user. Use
            commas to search for more than one username.""")
    uids = filters.CharFilter(
        name='changeset__uid',
        method='filter_changeset_uid',
        help_text="""Filter features whose last edit was made by a user. Use
            commas to search for more than one user uid. The uid is a unique
            identifier of a OSM user.""")
    checked_by = filters.CharFilter(
        name='check_user',
        method='filter_check_users',
        help_text="""Filter features that were checked by a user. Use commas to
            search for more than one user.""")
    order_by = filters.CharFilter(
        name=None,
        method='order_queryset',
        help_text="""Order the Features by one of the following fields: id,
            osm_id, changeset__date, changeset_id, check_date or number_reasons.
            Use a minus sign (-) before the field name to reverse the ordering.
            Default ordering is '-changeset_id'.""")
    changeset_ids = filters.CharFilter(
        name='changeset__id',
        method='filter_changeset_ids',
        help_text="""Filter features by its changeset id. Send the ids separated
            by commas.""")
    osm_version__gte = filters.NumberFilter(
        name='osm_version',
        lookup_expr='gte',
        help_text="""Filter items whose osm_version is greater than or equal to
            a number.""")
    osm_version__lte = filters.NumberFilter(
        name='osm_version',
        lookup_expr='lte',
        help_text="""Filter items whose osm_version is lower than or equal to a
            number.""")
    osm_type = filters.CharFilter(
        name='osm_type',
        lookup_expr='exact',
        help_text="""Filter features by its osm_type. The value options are node,
            way or relation.""")
    date__gte = filters.DateTimeFilter(
        name='changeset__date',
        lookup_expr='gte',
        help_text="""Filter features whose changeset date is greater than or
            equal to a date or a datetime.""")
    date__lte = filters.DateTimeFilter(
        name='changeset__date',
        lookup_expr='lte',
        help_text="""Filter features whose changeset date is lower than or equal
            to a date or a datetime.""")
    check_date__gte = filters.DateTimeFilter(
        name='check_date',
        lookup_expr='gte',
        help_text="""Filter features whose check_date is greater than or equal
            to a date or a datetime.""")
    check_date__lte = filters.DateTimeFilter(
        name='check_date',
        lookup_expr='lte',
        help_text="""Filter features whose check_date is lower than or equal to
            a date or a datetime.""")
    editor = filters.CharFilter(
        name='changeset__editor',
        lookup_expr='icontains',
        help_text="""Filter features that were created or last modified with a
            software editor. The lookup expression used is 'icontains', so a
            query for 'josm' will get features created or last modified with
            all JOSM versions.
            """)
    reasons = filters.CharFilter(
        name='reasons',
        method='filter_any_reasons',
        help_text="""Filter features that have one or more of the Suspicion
            Reasons. Inform the Suspicion Reasons ids separated by commas.""")
    all_reasons = filters.CharFilter(
        name='reasons',
        method='filter_all_reasons',
        help_text="""Filter features that have ALL the Suspicion Reasons of a
        list. Inform the Suspicion Reasons ids separated by commas.""")
    number_reasons__gte = filters.NumberFilter(
        name='number_reasons',
        method='filter_number_reasons',
        help_text="""Filter features whose number of Suspicion Reasons is
            equal or greater than a value.""")
    tags = filters.CharFilter(
        name='tags',
        method='filter_any_reasons',
        help_text="""Filter features that have one or more of the Tags. Inform
            the Tags ids separated by commas.""")
    all_tags = filters.CharFilter(
        name='tags',
        method='filter_all_reasons',
        help_text="""Filter features that have ALL the Tags of a list. Inform
            the Tags ids separated by commas.""")

    def filter_changeset_users(self, queryset, name, value):
        if (self.request is None
                or self.request.user.is_authenticated) and value:
            lookup = '__'.join([name, 'in'])
            users_array = [t.strip() for t in value.split(',')]
            return queryset.filter(**{lookup: users_array})
        else:
            return queryset

    def filter_changeset_uid(self, queryset, name, value):
        if (self.request is None
                or self.request.user.is_authenticated) and value:
            lookup = '__'.join([name, 'in'])
            uids_array = [t.strip() for t in value.split(',')]
            return queryset.filter(**{lookup: uids_array})
        else:
            return queryset

    def filter_check_users(self, queryset, name, value):
        if (self.request is None
                or self.request.user.is_authenticated) and value:
            lookup = '__'.join([name, 'name', 'in'])
            check_users_array = [t.strip() for t in value.split(',')]
            return queryset.filter(**{lookup: check_users_array})
        else:
            return queryset

    def filter_any_reasons(self, queryset, name, value):
        lookup = '__'.join([name, 'id', 'in'])
        values = [int(t) for t in value.split(',')]
        return queryset.filter(**{lookup: values}).distinct()

    def filter_all_reasons(self, queryset, name, value):
        lookup = '__'.join([name, 'id'])
        values = [int(t) for t in value.split(',')]
        for term in values:
            queryset = queryset.filter(**{lookup: term})
        return queryset

    def filter_number_reasons(self, queryset, name, value):
        lookup = '__'.join([name, 'gte'])
        queryset = queryset.annotate(number_reasons=Count('reasons'))
        return queryset.filter(**{lookup: value})

    def order_queryset(self, queryset, name, value):
        allowed_fields = [
            '-id', 'id', '-osm_id', 'osm_id', 'changeset__date',
            '-changeset__date', 'changeset_id', 'check_date', '-check_date',
            'number_reasons', '-number_reasons'
        ]
        if value in allowed_fields:
            if value in ['number_reasons', '-number_reasons']:
                queryset = queryset.annotate(number_reasons=Count('reasons'))
            return queryset.order_by(value)
        else:
            return queryset

    def filter_changeset_ids(self, queryset, name, value):
        lookup = '__'.join([name, 'in'])
        values = [int(t) for t in value.split(',')]
        return queryset.filter(**{lookup: values})

    class Meta:
        model = Feature
        fields = []