示例#1
0
文件: filters.py 项目: acdh-oeaw/delt
class TextVersionListFilter(django_filters.FilterSet):
    legacy_id = django_filters.LookupChoiceFilter(
        field_class=forms.CharField,
        lookup_choices=LOOKUP_CHOICES,
        help_text=TextVersion._meta.get_field('legacy_id').help_text,
        label=TextVersion._meta.get_field('legacy_id').verbose_name)
    text_id__participant_id = django_filters.ModelMultipleChoiceFilter(
        queryset=Participant.objects.all(),
        help_text=Text._meta.get_field('participant_id').help_text,
        label=Text._meta.get_field('participant_id').verbose_name)
    text_id__participant_id__learner_id__gender = django_filters.ChoiceFilter(
        choices=GENDER_CHOICES, help_text="Gender", label="Gender")
    text_id__participant_id__institution_level = django_filters.ChoiceFilter(
        choices=[(x[0], x[0]) for x in list(
            set(Participant.objects.all().values_list('institution_level')))],
        help_text="Institution Level",
        label="Institution Level")
    text_id__participant_id__clil = django_filters.ChoiceFilter(
        choices=YES_NO_OTHER, help_text="clil", label="clil")

    text_id__participant_id__learner_id__nationality = django_filters.ModelMultipleChoiceFilter(
        queryset=Place.objects.all(),
        help_text="Nationality",
        label="Nationality")
    text_id__participant_id__learner_id__lang_l = django_filters.ModelMultipleChoiceFilter(
        queryset=SkosConcept.objects.exclude(is_lang_l_of=None),
        help_text="mother tongue",
        label="mother tongue")
    text_id__participant_id__learner_id__lang_mother = django_filters.ModelMultipleChoiceFilter(
        queryset=SkosConcept.objects.exclude(is_mother_lang_of=None),
        help_text="lang mother",
        label="lang mother")
    text_id__participant_id__learner_id__lang_father = django_filters.ModelMultipleChoiceFilter(
        queryset=SkosConcept.objects.exclude(is_father_lang_of=None),
        help_text="lang father",
        label="lang father")
    text_id__participant_id__learner_id__lang_second = django_filters.ModelMultipleChoiceFilter(
        queryset=SkosConcept.objects.exclude(is_second_lang_of=None),
        help_text="second language",
        label="second language ≠ foreign language")
    text_id__participant_id__learner_id__lang_third = django_filters.ModelMultipleChoiceFilter(
        queryset=SkosConcept.objects.exclude(is_third_lang_of=None),
        help_text="third language",
        label="third language ≠ foreign language")

    text_id__participant_id__learner_profile_id__lang_spoken_home = django_filters.ChoiceFilter(
        choices=[(x[0], x[0]) for x in list(
            set(LearnerProfile.objects.all().values_list('lang_spoken_home')))
                 ],
        help_text=
        "(if more than one language is spoken, provide the % of use of each language)\
        format: Bosnian: 50% Slovenian: 50%",
        label="description of language use at home")
    text_id__participant_id__learner_profile_id__lang_instruction_primary = django_filters.ModelMultipleChoiceFilter(
        queryset=SkosConcept.objects.exclude(is_lang_instruction_primary=None),
        help_text="Language of instruction in primary school",
        label="Language of instruction in primary school")
    text_id__participant_id__learner_profile_id__proficiency_level = django_filters.ChoiceFilter(
        choices=[(x[0], x[0]) for x in list(
            set(LearnerProfile.objects.all().values_list('proficiency_level')))
                 ],
        help_text="A1;A2;B1;B2;C1;C2",
        label="Latest CEF score/placement")

    text_id__grade = django_filters.RangeFilter()
    text_id__medium = django_filters.ModelMultipleChoiceFilter(
        queryset=SkosConcept.objects.filter(
            scheme__dc_title__icontains="text_medium"),
        help_text=Text._meta.get_field('medium').help_text,
        label=Text._meta.get_field('medium').verbose_name,
        widget=forms.CheckboxSelectMultiple(
            attrs={'class': 'chbx-select-multi'}))
    text_id__mode = django_filters.ModelMultipleChoiceFilter(
        queryset=SkosConcept.objects.filter(
            scheme__dc_title__icontains="text_mode"),
        help_text=Text._meta.get_field('mode').help_text,
        label=Text._meta.get_field('mode').verbose_name,
        widget=forms.CheckboxSelectMultiple(
            attrs={'class': 'chbx-select-multi'}))
    text_id__text_type = django_filters.ModelMultipleChoiceFilter(
        queryset=SkosConcept.objects.filter(
            scheme__dc_title__icontains="text_type"),
        help_text=Text._meta.get_field('text_type').help_text,
        label=Text._meta.get_field('text_type').verbose_name,
        widget=forms.CheckboxSelectMultiple(
            attrs={'class': 'chbx-select-multi'}))
    text_id__clil_text = django_filters.ChoiceFilter(
        choices=[
            (x[0], x[0])
            for x in list(set(Text.objects.all().values_list('clil_text')))
        ],
        help_text=
        "(if more than one language is spoken, provide the % of use of each language)\
        format: Bosnian: 50% Slovenian: 50%",
        label="description of language use at home")
    text_id__assignment_id = django_filters.ModelMultipleChoiceFilter(
        queryset=Assignment.objects,
        help_text=Assignment._meta.get_field('title').help_text,
        label='Select Assignment Title',
        widget=forms.CheckboxSelectMultiple(
            attrs={'class': 'chbx-select-multi'}))
    text_id__assignment_id__title = django_filters.LookupChoiceFilter(
        field_class=forms.CharField,
        lookup_choices=LOOKUP_CHOICES,
        help_text=Assignment._meta.get_field('title').help_text,
        label=Assignment._meta.get_field('title').verbose_name)

    class Meta:
        model = TextVersion
        fields = "__all__"
示例#2
0
文件: filters.py 项目: yuta2/netbox
class RackFilterSet(TenancyFilterSet, CustomFieldFilterSet, CreatedUpdatedFilterSet):
    id__in = NumericInFilter(
        field_name='id',
        lookup_expr='in'
    )
    q = django_filters.CharFilter(
        method='search',
        label='Search',
    )
    region_id = TreeNodeMultipleChoiceFilter(
        queryset=Region.objects.all(),
        field_name='site__region__in',
        label='Region (ID)',
    )
    region = TreeNodeMultipleChoiceFilter(
        queryset=Region.objects.all(),
        field_name='site__region__in',
        to_field_name='slug',
        label='Region (slug)',
    )
    site_id = django_filters.ModelMultipleChoiceFilter(
        queryset=Site.objects.all(),
        label='Site (ID)',
    )
    site = django_filters.ModelMultipleChoiceFilter(
        field_name='site__slug',
        queryset=Site.objects.all(),
        to_field_name='slug',
        label='Site (slug)',
    )
    group_id = django_filters.ModelMultipleChoiceFilter(
        queryset=RackGroup.objects.all(),
        label='Group (ID)',
    )
    group = django_filters.ModelMultipleChoiceFilter(
        field_name='group__slug',
        queryset=RackGroup.objects.all(),
        to_field_name='slug',
        label='Group',
    )
    status = django_filters.MultipleChoiceFilter(
        choices=RackStatusChoices,
        null_value=None
    )
    role_id = django_filters.ModelMultipleChoiceFilter(
        queryset=RackRole.objects.all(),
        label='Role (ID)',
    )
    role = django_filters.ModelMultipleChoiceFilter(
        field_name='role__slug',
        queryset=RackRole.objects.all(),
        to_field_name='slug',
        label='Role (slug)',
    )
    serial = django_filters.CharFilter(
        lookup_expr='iexact'
    )
    tag = TagFilter()

    class Meta:
        model = Rack
        fields = [
            'id', 'name', 'facility_id', 'asset_tag', 'type', 'width', 'u_height', 'desc_units',
            'outer_width', 'outer_depth', 'outer_unit',
        ]

    def search(self, queryset, name, value):
        if not value.strip():
            return queryset
        return queryset.filter(
            Q(name__icontains=value) |
            Q(facility_id__icontains=value) |
            Q(serial__icontains=value.strip()) |
            Q(asset_tag__icontains=value.strip()) |
            Q(comments__icontains=value)
        )
示例#3
0
class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet):
    id__in = NumericInFilter(name='id', lookup_expr='in')
    q = django_filters.CharFilter(
        method='search',
        label='Search',
    )
    manufacturer_id = django_filters.ModelMultipleChoiceFilter(
        name='device_type__manufacturer',
        queryset=Manufacturer.objects.all(),
        label='Manufacturer (ID)',
    )
    manufacturer = django_filters.ModelMultipleChoiceFilter(
        name='device_type__manufacturer__slug',
        queryset=Manufacturer.objects.all(),
        to_field_name='slug',
        label='Manufacturer (slug)',
    )
    device_type_id = django_filters.ModelMultipleChoiceFilter(
        queryset=DeviceType.objects.all(),
        label='Device type (ID)',
    )
    role_id = django_filters.ModelMultipleChoiceFilter(
        name='device_role_id',
        queryset=DeviceRole.objects.all(),
        label='Role (ID)',
    )
    role = django_filters.ModelMultipleChoiceFilter(
        name='device_role__slug',
        queryset=DeviceRole.objects.all(),
        to_field_name='slug',
        label='Role (slug)',
    )
    tenant_id = NullableModelMultipleChoiceFilter(
        queryset=Tenant.objects.all(),
        label='Tenant (ID)',
    )
    tenant = NullableModelMultipleChoiceFilter(
        name='tenant',
        queryset=Tenant.objects.all(),
        to_field_name='slug',
        label='Tenant (slug)',
    )
    platform_id = NullableModelMultipleChoiceFilter(
        queryset=Platform.objects.all(),
        label='Platform (ID)',
    )
    platform = NullableModelMultipleChoiceFilter(
        name='platform',
        queryset=Platform.objects.all(),
        to_field_name='slug',
        label='Platform (slug)',
    )
    name = NullableCharFieldFilter()
    asset_tag = NullableCharFieldFilter()
    site_id = django_filters.ModelMultipleChoiceFilter(
        queryset=Site.objects.all(),
        label='Site (ID)',
    )
    site = django_filters.ModelMultipleChoiceFilter(
        name='site__slug',
        queryset=Site.objects.all(),
        to_field_name='slug',
        label='Site name (slug)',
    )
    rack_group_id = django_filters.ModelMultipleChoiceFilter(
        name='rack__group',
        queryset=RackGroup.objects.all(),
        label='Rack group (ID)',
    )
    rack_id = NullableModelMultipleChoiceFilter(
        name='rack',
        queryset=Rack.objects.all(),
        label='Rack (ID)',
    )
    model = django_filters.ModelMultipleChoiceFilter(
        name='device_type__slug',
        queryset=DeviceType.objects.all(),
        to_field_name='slug',
        label='Device model (slug)',
    )
    status = django_filters.MultipleChoiceFilter(
        choices=STATUS_CHOICES
    )
    is_full_depth = django_filters.BooleanFilter(
        name='device_type__is_full_depth',
        label='Is full depth',
    )
    is_console_server = django_filters.BooleanFilter(
        name='device_type__is_console_server',
        label='Is a console server',
    )
    is_pdu = django_filters.BooleanFilter(
        name='device_type__is_pdu',
        label='Is a PDU',
    )
    is_network_device = django_filters.BooleanFilter(
        name='device_type__is_network_device',
        label='Is a network device',
    )
    mac_address = django_filters.CharFilter(
        method='_mac_address',
        label='MAC address',
    )
    has_primary_ip = django_filters.BooleanFilter(
        method='_has_primary_ip',
        label='Has a primary IP',
    )

    class Meta:
        model = Device
        fields = ['serial']

    def search(self, queryset, name, value):
        if not value.strip():
            return queryset
        return queryset.filter(
            Q(name__icontains=value) |
            Q(serial__icontains=value.strip()) |
            Q(inventory_items__serial__icontains=value.strip()) |
            Q(asset_tag=value.strip()) |
            Q(comments__icontains=value)
        ).distinct()

    def _mac_address(self, queryset, name, value):
        value = value.strip()
        if not value:
            return queryset
        try:
            mac = EUI(value.strip())
            return queryset.filter(interfaces__mac_address=mac).distinct()
        except AddrFormatError:
            return queryset.none()

    def _has_primary_ip(self, queryset, name, value):
        if value:
            return queryset.filter(
                Q(primary_ip4__isnull=False) |
                Q(primary_ip6__isnull=False)
            )
        else:
            return queryset.exclude(
                Q(primary_ip4__isnull=False) |
                Q(primary_ip6__isnull=False)
            )
示例#4
0
class ExperimentFilterset(filters.FilterSet):

    search = filters.CharFilter(
        method="filter_search",
        widget=SearchWidget(attrs={
            "class": "form-control",
            "placeholder": "Search Deliveries"
        }),
    )
    type = filters.MultipleChoiceFilter(
        choices=Experiment.TYPE_CHOICES,
        conjoined=False,
        widget=forms.SelectMultiple(attrs={
            "class": "form-control",
            "data-none-selected-text": "All Types"
        }),
    )
    projects = filters.ModelMultipleChoiceFilter(
        queryset=Project.objects.all(),
        null_label="No Projects",
        widget=forms.SelectMultiple(attrs={
            "class": "form-control",
            "data-none-selected-text": "All Projects"
        }),
    )
    status = filters.ChoiceFilter(
        empty_label="All Statuses",
        choices=Experiment.STATUS_CHOICES,
        widget=forms.Select(attrs={"class": "form-control"}),
    )
    firefox_channel = filters.ChoiceFilter(
        empty_label="All Channels",
        choices=Experiment.CHANNEL_CHOICES[1:],
        widget=forms.Select(attrs={"class": "form-control"}),
    )
    firefox_version = filters.ChoiceFilter(
        empty_label="All Versions",
        choices=Experiment.VERSION_CHOICES[1:],
        widget=forms.Select(attrs={"class": "form-control"}),
        method="version_filter",
    )
    owner = filters.ModelChoiceFilter(
        empty_label="All Owners",
        queryset=get_user_model().objects.all().order_by("email"),
        widget=forms.Select(attrs={"class": "form-control"}),
    )
    analysis_owner = filters.ModelChoiceFilter(
        empty_label="All Data Scientists",
        queryset=get_user_model().objects.all().filter(
            id__in=Experiment.objects.all().values_list(
                "analysis_owner__id", flat=True)).order_by("email"),
        widget=forms.Select(attrs={"class": "form-control"}),
    )

    archived = filters.BooleanFilter(
        label="Show archived deliveries",
        widget=forms.CheckboxInput(),
        method="archived_filter",
    )
    experiment_date_field = filters.ChoiceFilter(
        empty_label="No Date Restriction",
        choices=[
            (Experiment.EXPERIMENT_STARTS, "Delivery Starts"),
            (Experiment.EXPERIMENT_PAUSES, "Delivery Pauses"),
            (Experiment.EXPERIMENT_ENDS, "Delivery Ends"),
        ],
        widget=forms.Select(attrs={"class": "form-control"}),
        method="experiment_date_field_filter",
    )
    date_range = filters.DateFromToRangeFilter(
        method="date_range_filter",
        widget=DateRangeWidget(attrs={
            "type": "date",
            "class": "form-control"
        }),
    )

    in_qa = filters.BooleanFilter(
        label="Show only deliveries in QA",
        widget=forms.CheckboxInput(),
        method="in_qa_filter",
    )

    surveys = filters.BooleanFilter(
        label="Show deliveries with surveys",
        widget=forms.CheckboxInput(),
        method="surveys_filter",
    )

    subscribed = filters.BooleanFilter(
        label="Show subscribed deliveries",
        widget=forms.CheckboxInput(),
        method="subscribed_filter",
    )

    longrunning = filters.BooleanFilter(
        label="Show long-running deliveries",
        widget=forms.CheckboxInput(),
        method="longrunning_filter",
    )

    is_paused = filters.BooleanFilter(
        label="Show enrollment complete deliveries",
        widget=forms.CheckboxInput(),
        method="is_paused_filter",
    )

    completed_results = filters.BooleanFilter(
        label="Show deliveries with results completed",
        widget=forms.CheckboxInput(),
        method="completed_results_filter",
    )

    class Meta:
        model = Experiment
        fields = (
            "search",
            "type",
            "projects",
            "status",
            "firefox_channel",
            "firefox_version",
            "owner",
            "analysis_owner",
            "in_qa",
            "surveys",
            "archived",
            "subscribed",
            "longrunning",
            "is_paused",
            "completed_results",
        )

    def filter_search(self, queryset, name, value):
        vector = SearchVector(
            "name",
            "short_description",
            "owner__email",
            "analysis_owner__email",
            "slug",
            "related_work",
            "addon_experiment_id",
            "pref_name",
            "public_description",
            "objectives",
            "analysis",
            "engineering_owner",
            "bugzilla_id",
            "recipe_slug",
            "data_science_issue_url",
            "feature_bugzilla_url",
        )

        query = SearchQuery(value)

        return (queryset.annotate(
            rank=SearchRank(vector, query),
            search=vector).filter(search=value).order_by("-rank"))

    def archived_filter(self, queryset, name, value):
        if not value:
            return queryset.exclude(archived=True)
        return queryset

    def experiment_date_field_filter(self, queryset, name, value):
        # this custom method isn't doing anything. There has to
        # be a custom method to be able to display the select
        # filter that controls which date range we show
        return queryset

    def version_filter(self, queryset, name, value):
        return queryset.filter(
            Q(firefox_min_version__lte=value, firefox_max_version__gte=value)
            | Q(firefox_min_version=value))

    def date_range_filter(self, queryset, name, value):
        date_type = self.form.cleaned_data["experiment_date_field"]
        if date_type:
            experiment_date_field = {
                Experiment.EXPERIMENT_STARTS: "start_date",
                Experiment.EXPERIMENT_PAUSES: "enrollment_end_date",
                Experiment.EXPERIMENT_ENDS: "end_date",
            }[date_type]

            results = []

            for experiment in queryset.all():
                date = getattr(experiment, experiment_date_field)

                # enrollment end dates are optional, so there won't always
                # be a pause date for an experiment
                if date:
                    if value.start and date < value.start.date():
                        continue
                    if value.stop and date > value.stop.date():
                        continue
                    results.append(experiment.id)

            return queryset.filter(pk__in=results)
        return queryset

    def in_qa_filter(self, queryset, name, value):
        if value:
            return queryset.filter(review_qa_requested=True, review_qa=False)

        return queryset

    def surveys_filter(self, queryset, name, value):
        if value:
            return queryset.filter(survey_required=True)

        return queryset

    def subscribed_filter(self, queryset, name, value):
        if value:
            return queryset.filter(subscribers__in=[self.request.user.id])

        return queryset

    def longrunning_filter(self, queryset, name, value):
        if value:
            return (queryset.exclude(firefox_max_version__exact="").annotate(
                firefox_min_int=Cast(
                    Func(
                        F("firefox_min_version"),
                        Value(ExperimentConstants.VERSION_REGEX.pattern),
                        function="substring",
                    ),
                    IntegerField(),
                ),
                firefox_max_int=Cast(
                    Func(
                        F("firefox_max_version"),
                        Value(ExperimentConstants.VERSION_REGEX.pattern),
                        function="substring",
                    ),
                    IntegerField(),
                ),
                version_count=F("firefox_max_int") - F("firefox_min_int"),
            ).filter(version_count__gte=3))

        return queryset

    def is_paused_filter(self, queryset, name, value):
        if value:
            return queryset.filter(is_paused=True,
                                   status=Experiment.STATUS_LIVE)

        return queryset

    def completed_results_filter(self, queryset, name, value):
        if value:
            return queryset.exclude(
                Q(results_url="") | Q(results_url=None),
                Q(results_initial="") | Q(results_initial=None),
                Q(results_lessons_learned="")
                | Q(results_lessons_learned=None),
            )
        return queryset

    def get_type_display_value(self):
        return ", ".join([
            dict(Experiment.TYPE_CHOICES)[type].replace(" Experiment", "")
            for type in self.data.getlist("type")
        ])

    def get_project_display_value(self):
        project_ids = self.data.getlist("projects")

        if project_ids:
            if "null" in project_ids:
                project_ids.remove("null")
            project_name_list = Project.objects.filter(
                id__in=project_ids).values_list("name")
            if project_name_list:
                return ", ".join(project_name[0]
                                 for project_name in project_name_list)
            return "No Projects"

    def get_owner_display_value(self):
        user_id = self.data.get("owner")

        if user_id is not None:
            return str(get_user_model().objects.get(id=user_id))

    def get_display_start_date_info(self):
        experiment_date_field = self.data.get("experiment_date_field")
        date_after = self.data.get("date_range_after")
        date_before = self.data.get("date_range_before")

        if date_after and date_before:
            return f"{experiment_date_field} between {date_after} and {date_before}"
        elif date_after and date_before == "":
            return f"{experiment_date_field} after {date_after}"
        elif date_after == "" and date_before:
            return f"{experiment_date_field} before {date_before}"
        else:
            return ""
示例#5
0
class DeviceTypeComponentFilterSet(django_filters.FilterSet):
    devicetype_id = django_filters.ModelMultipleChoiceFilter(
        queryset=DeviceType.objects.all(),
        label='Device type (ID)',
    )
示例#6
0
class ModelMultipleChoiceFieldFilterSet(django_filters.FilterSet):
    categories = django_filters.ModelMultipleChoiceFilter(
        label='Category', queryset=Category.objects.all())
示例#7
0
class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet):
    q = django_filters.MethodFilter(
        action='search',
        label='Search',
    )
    parent = django_filters.MethodFilter(
        action='search_by_parent',
        label='Parent prefix',
    )
    vrf_id = NullableModelMultipleChoiceFilter(
        name='vrf_id',
        queryset=VRF.objects.all(),
        label='VRF',
    )
    vrf = NullableModelMultipleChoiceFilter(
        name='vrf',
        queryset=VRF.objects.all(),
        to_field_name='rd',
        label='VRF (RD)',
    )
    tenant_id = NullableModelMultipleChoiceFilter(
        name='tenant',
        queryset=Tenant.objects.all(),
        label='Tenant (ID)',
    )
    tenant = NullableModelMultipleChoiceFilter(
        name='tenant',
        queryset=Tenant.objects.all(),
        to_field_name='slug',
        label='Tenant (slug)',
    )
    site_id = NullableModelMultipleChoiceFilter(
        name='site',
        queryset=Site.objects.all(),
        label='Site (ID)',
    )
    site = NullableModelMultipleChoiceFilter(
        name='site',
        queryset=Site.objects.all(),
        to_field_name='slug',
        label='Site (slug)',
    )
    vlan_id = django_filters.ModelMultipleChoiceFilter(
        name='vlan',
        queryset=VLAN.objects.all(),
        label='VLAN (ID)',
    )
    vlan_vid = django_filters.NumberFilter(
        name='vlan__vid',
        label='VLAN number (1-4095)',
    )
    role_id = NullableModelMultipleChoiceFilter(
        name='role',
        queryset=Role.objects.all(),
        label='Role (ID)',
    )
    role = NullableModelMultipleChoiceFilter(
        name='role',
        queryset=Role.objects.all(),
        to_field_name='slug',
        label='Role (slug)',
    )

    class Meta:
        model = Prefix
        fields = [
            'family', 'site_id', 'site', 'vlan_id', 'vlan_vid', 'status',
            'role_id', 'role'
        ]

    def search(self, queryset, value):
        qs_filter = Q(description__icontains=value)
        try:
            prefix = str(IPNetwork(value.strip()).cidr)
            qs_filter |= Q(prefix__net_contains_or_equals=prefix)
        except AddrFormatError:
            pass
        return queryset.filter(qs_filter)

    def search_by_parent(self, queryset, value):
        value = value.strip()
        if not value:
            return queryset
        try:
            query = str(IPNetwork(value).cidr)
            return queryset.filter(prefix__net_contained_or_equal=query)
        except AddrFormatError:
            return queryset.none()

    def _tenant(self, queryset, value):
        if str(value) == '':
            return queryset
        return queryset.filter(
            Q(tenant__slug=value)
            | Q(tenant__isnull=True, vrf__tenant__slug=value))

    def _tenant_id(self, queryset, value):
        try:
            value = int(value)
        except ValueError:
            return queryset.none()
        return queryset.filter(
            Q(tenant__pk=value)
            | Q(tenant__isnull=True, vrf__tenant__pk=value))
示例#8
0
class VLANFilter(CustomFieldFilterSet, django_filters.FilterSet):
    q = django_filters.MethodFilter(
        action='search',
        label='Search',
    )
    site_id = django_filters.ModelMultipleChoiceFilter(
        name='site',
        queryset=Site.objects.all(),
        label='Site (ID)',
    )
    site = django_filters.ModelMultipleChoiceFilter(
        name='site',
        queryset=Site.objects.all(),
        to_field_name='slug',
        label='Site (slug)',
    )
    group_id = NullableModelMultipleChoiceFilter(
        name='group',
        queryset=VLANGroup.objects.all(),
        label='Group (ID)',
    )
    group = NullableModelMultipleChoiceFilter(
        name='group',
        queryset=VLANGroup.objects.all(),
        to_field_name='slug',
        label='Group',
    )
    name = django_filters.CharFilter(
        name='name',
        lookup_type='icontains',
        label='Name',
    )
    vid = django_filters.NumberFilter(
        name='vid',
        label='VLAN number (1-4095)',
    )
    tenant_id = NullableModelMultipleChoiceFilter(
        name='tenant',
        queryset=Tenant.objects.all(),
        label='Tenant (ID)',
    )
    tenant = NullableModelMultipleChoiceFilter(
        name='tenant',
        queryset=Tenant.objects.all(),
        to_field_name='slug',
        label='Tenant (slug)',
    )
    role_id = NullableModelMultipleChoiceFilter(
        name='role',
        queryset=Role.objects.all(),
        label='Role (ID)',
    )
    role = NullableModelMultipleChoiceFilter(
        name='role',
        queryset=Role.objects.all(),
        to_field_name='slug',
        label='Role (slug)',
    )

    class Meta:
        model = VLAN
        fields = [
            'site_id', 'site', 'vid', 'name', 'status', 'role_id', 'role'
        ]

    def search(self, queryset, value):
        qs_filter = Q(name__icontains=value) | Q(description__icontains=value)
        try:
            qs_filter |= Q(vid=int(value))
        except ValueError:
            pass
        return queryset.filter(qs_filter)
示例#9
0
class IPAddressFilter(CustomFieldFilterSet, django_filters.FilterSet):
    q = django_filters.MethodFilter(
        action='search',
        label='Search',
    )
    parent = django_filters.MethodFilter(
        action='search_by_parent',
        label='Parent prefix',
    )
    vrf_id = NullableModelMultipleChoiceFilter(
        name='vrf_id',
        queryset=VRF.objects.all(),
        label='VRF',
    )
    vrf = NullableModelMultipleChoiceFilter(
        name='vrf',
        queryset=VRF.objects.all(),
        to_field_name='rd',
        label='VRF (RD)',
    )
    tenant_id = NullableModelMultipleChoiceFilter(
        name='tenant',
        queryset=Tenant.objects.all(),
        label='Tenant (ID)',
    )
    tenant = NullableModelMultipleChoiceFilter(
        name='tenant',
        queryset=Tenant.objects.all(),
        to_field_name='slug',
        label='Tenant (slug)',
    )
    device_id = django_filters.ModelMultipleChoiceFilter(
        name='interface__device',
        queryset=Device.objects.all(),
        label='Device (ID)',
    )
    device = django_filters.ModelMultipleChoiceFilter(
        name='interface__device',
        queryset=Device.objects.all(),
        to_field_name='name',
        label='Device (name)',
    )
    interface_id = django_filters.ModelMultipleChoiceFilter(
        name='interface',
        queryset=Interface.objects.all(),
        label='Interface (ID)',
    )

    class Meta:
        model = IPAddress
        fields = [
            'q', 'family', 'status', 'device_id', 'device', 'interface_id'
        ]

    def search(self, queryset, value):
        qs_filter = Q(description__icontains=value)
        try:
            ipaddress = str(IPNetwork(value.strip()))
            qs_filter |= Q(address__net_host=ipaddress)
        except AddrFormatError:
            pass
        return queryset.filter(qs_filter)

    def search_by_parent(self, queryset, value):
        value = value.strip()
        if not value:
            return queryset
        try:
            query = str(IPNetwork(value).cidr)
            return queryset.filter(address__net_contained_or_equal=query)
        except AddrFormatError:
            return queryset.none()