| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754 |
- import django_filters
- import netaddr
- from django.contrib.contenttypes.models import ContentType
- from django.utils.translation import gettext as _
- from drf_spectacular.types import OpenApiTypes
- from drf_spectacular.utils import extend_schema_field
- from netaddr.core import AddrFormatError
- from circuits.models import CircuitTermination, VirtualCircuit, VirtualCircuitTermination
- from extras.filtersets import LocalConfigContextFilterSet
- from extras.models import ConfigTemplate
- from ipam.filtersets import PrimaryIPFilterSet
- from ipam.models import ASN, IPAddress, VLANTranslationPolicy, VRF
- from netbox.choices import ColorChoices
- from netbox.filtersets import (
- AttributeFiltersMixin, BaseFilterSet, ChangeLoggedModelFilterSet, NestedGroupModelFilterSet,
- OrganizationalModelFilterSet, PrimaryModelFilterSet, NetBoxModelFilterSet,
- )
- from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet
- from tenancy.models import *
- from users.filterset_mixins import OwnerFilterMixin
- from users.models import User
- from utilities.filters import (
- MultiValueCharFilter, MultiValueContentTypeFilter, MultiValueMACAddressFilter, MultiValueNumberFilter,
- MultiValueWWNFilter, NumericArrayFilter, TreeNodeMultipleChoiceFilter,
- )
- from utilities.filtersets import register_filterset
- from virtualization.models import Cluster, ClusterGroup, VirtualMachine, VMInterface
- from vpn.models import L2VPN
- from wireless.choices import WirelessChannelChoices, WirelessRoleChoices
- from wireless.models import WirelessLAN, WirelessLink
- from .choices import *
- from .constants import *
- from .models import *
- __all__ = (
- 'CableFilterSet',
- 'CabledObjectFilterSet',
- 'CableTerminationFilterSet',
- 'CommonInterfaceFilterSet',
- 'ConsoleConnectionFilterSet',
- 'ConsolePortFilterSet',
- 'ConsolePortTemplateFilterSet',
- 'ConsoleServerPortFilterSet',
- 'ConsoleServerPortTemplateFilterSet',
- 'DeviceBayFilterSet',
- 'DeviceBayTemplateFilterSet',
- 'DeviceFilterSet',
- 'DeviceRoleFilterSet',
- 'DeviceTypeFilterSet',
- 'FrontPortFilterSet',
- 'FrontPortTemplateFilterSet',
- 'InterfaceConnectionFilterSet',
- 'InterfaceFilterSet',
- 'InterfaceTemplateFilterSet',
- 'InventoryItemFilterSet',
- 'InventoryItemRoleFilterSet',
- 'InventoryItemTemplateFilterSet',
- 'LocationFilterSet',
- 'MACAddressFilterSet',
- 'ManufacturerFilterSet',
- 'ModuleBayFilterSet',
- 'ModuleBayTemplateFilterSet',
- 'ModuleFilterSet',
- 'ModuleTypeFilterSet',
- 'ModuleTypeProfileFilterSet',
- 'PathEndpointFilterSet',
- 'PlatformFilterSet',
- 'PowerConnectionFilterSet',
- 'PowerFeedFilterSet',
- 'PowerOutletFilterSet',
- 'PowerOutletTemplateFilterSet',
- 'PowerPanelFilterSet',
- 'PowerPortFilterSet',
- 'PowerPortTemplateFilterSet',
- 'RackFilterSet',
- 'RackReservationFilterSet',
- 'RackRoleFilterSet',
- 'RackTypeFilterSet',
- 'RearPortFilterSet',
- 'RearPortTemplateFilterSet',
- 'RegionFilterSet',
- 'SiteFilterSet',
- 'SiteGroupFilterSet',
- 'VirtualChassisFilterSet',
- 'VirtualDeviceContextFilterSet',
- )
- @register_filterset
- class RegionFilterSet(NestedGroupModelFilterSet, ContactModelFilterSet):
- parent_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Region.objects.all(),
- label=_('Parent region (ID)'),
- )
- parent = django_filters.ModelMultipleChoiceFilter(
- field_name='parent__slug',
- queryset=Region.objects.all(),
- to_field_name='slug',
- label=_('Parent region (slug)'),
- )
- ancestor_id = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='parent',
- lookup_expr='in',
- label=_('Region (ID)'),
- )
- ancestor = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='parent',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Region (slug)'),
- )
- class Meta:
- model = Region
- fields = ('id', 'name', 'slug', 'description')
- @register_filterset
- class SiteGroupFilterSet(NestedGroupModelFilterSet, ContactModelFilterSet):
- parent_id = django_filters.ModelMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- label=_('Parent site group (ID)'),
- )
- parent = django_filters.ModelMultipleChoiceFilter(
- field_name='parent__slug',
- queryset=SiteGroup.objects.all(),
- to_field_name='slug',
- label=_('Parent site group (slug)'),
- )
- ancestor_id = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='parent',
- lookup_expr='in',
- label=_('Site group (ID)'),
- )
- ancestor = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='parent',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Site group (slug)'),
- )
- class Meta:
- model = SiteGroup
- fields = ('id', 'name', 'slug', 'description')
- @register_filterset
- class SiteFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterSet):
- status = django_filters.MultipleChoiceFilter(
- choices=SiteStatusChoices,
- null_value=None
- )
- region_id = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='region',
- lookup_expr='in',
- label=_('Region (ID)'),
- )
- region = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- lookup_expr='in',
- to_field_name='slug',
- label=_('Region (slug)'),
- )
- group_id = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='group',
- lookup_expr='in',
- label=_('Group (ID)'),
- )
- group = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- lookup_expr='in',
- to_field_name='slug',
- label=_('Group (slug)'),
- )
- asn = django_filters.ModelMultipleChoiceFilter(
- field_name='asns__asn',
- queryset=ASN.objects.all(),
- to_field_name='asn',
- label=_('AS (ID)'),
- )
- asn_id = django_filters.ModelMultipleChoiceFilter(
- field_name='asns',
- queryset=ASN.objects.all(),
- label=_('AS (ID)'),
- )
- time_zone = MultiValueCharFilter()
- class Meta:
- model = Site
- fields = ('id', 'name', 'slug', 'facility', 'latitude', 'longitude', 'description')
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- qs_filter = (
- Q(name__icontains=value) |
- Q(facility__icontains=value) |
- Q(description__icontains=value) |
- Q(physical_address__icontains=value) |
- Q(shipping_address__icontains=value) |
- Q(comments__icontains=value)
- )
- try:
- qs_filter |= Q(asns__asn=int(value.strip()))
- except ValueError:
- pass
- return queryset.filter(qs_filter).distinct()
- @register_filterset
- class LocationFilterSet(TenancyFilterSet, ContactModelFilterSet, NestedGroupModelFilterSet):
- region_id = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='site__region',
- lookup_expr='in',
- label=_('Region (ID)'),
- )
- region = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='site__region',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Region (slug)'),
- )
- site_group_id = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='site__group',
- lookup_expr='in',
- label=_('Site group (ID)'),
- )
- site_group = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='site__group',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Site group (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)'),
- )
- parent_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Location.objects.all(),
- label=_('Parent location (ID)'),
- )
- parent = django_filters.ModelMultipleChoiceFilter(
- field_name='parent__slug',
- queryset=Location.objects.all(),
- to_field_name='slug',
- label=_('Parent location (slug)'),
- )
- ancestor_id = TreeNodeMultipleChoiceFilter(
- queryset=Location.objects.all(),
- field_name='parent',
- lookup_expr='in',
- label=_('Location (ID)'),
- )
- ancestor = TreeNodeMultipleChoiceFilter(
- queryset=Location.objects.all(),
- field_name='parent',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Location (slug)'),
- )
- status = django_filters.MultipleChoiceFilter(
- choices=LocationStatusChoices,
- null_value=None
- )
- class Meta:
- model = Location
- fields = ('id', 'name', 'slug', 'facility', 'description')
- def search(self, queryset, name, value):
- # extended in order to include querying on Location.facility
- queryset = super().search(queryset, name, value)
- if value.strip():
- queryset = queryset | queryset.model.objects.filter(facility__icontains=value)
- return queryset
- @register_filterset
- class RackRoleFilterSet(OrganizationalModelFilterSet):
- class Meta:
- model = RackRole
- fields = ('id', 'name', 'slug', 'color', 'description')
- @register_filterset
- class RackTypeFilterSet(PrimaryModelFilterSet):
- manufacturer_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Manufacturer.objects.all(),
- label=_('Manufacturer (ID)'),
- )
- manufacturer = django_filters.ModelMultipleChoiceFilter(
- field_name='manufacturer__slug',
- queryset=Manufacturer.objects.all(),
- to_field_name='slug',
- label=_('Manufacturer (slug)'),
- )
- form_factor = django_filters.MultipleChoiceFilter(
- choices=RackFormFactorChoices
- )
- width = django_filters.MultipleChoiceFilter(
- choices=RackWidthChoices
- )
- class Meta:
- model = RackType
- fields = (
- 'id', 'model', 'slug', 'u_height', 'starting_unit', 'desc_units', 'outer_width', 'outer_height',
- 'outer_depth', 'outer_unit', 'mounting_depth', 'weight', 'max_weight', 'weight_unit', 'description',
- # Counters
- 'rack_count',
- )
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- return queryset.filter(
- Q(model__icontains=value) |
- Q(description__icontains=value) |
- Q(comments__icontains=value)
- )
- @register_filterset
- class RackFilterSet(PrimaryModelFilterSet, TenancyFilterSet, ContactModelFilterSet):
- region_id = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='site__region',
- lookup_expr='in',
- label=_('Region (ID)'),
- )
- region = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='site__region',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Region (slug)'),
- )
- site_group_id = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='site__group',
- lookup_expr='in',
- label=_('Site group (ID)'),
- )
- site_group = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='site__group',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Site group (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)'),
- )
- location_id = TreeNodeMultipleChoiceFilter(
- queryset=Location.objects.all(),
- field_name='location',
- lookup_expr='in',
- label=_('Location (ID)'),
- )
- location = TreeNodeMultipleChoiceFilter(
- queryset=Location.objects.all(),
- field_name='location',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Location (slug)'),
- )
- manufacturer_id = django_filters.ModelMultipleChoiceFilter(
- field_name='rack_type__manufacturer',
- queryset=Manufacturer.objects.all(),
- label=_('Manufacturer (ID)'),
- )
- manufacturer = django_filters.ModelMultipleChoiceFilter(
- field_name='rack_type__manufacturer__slug',
- queryset=Manufacturer.objects.all(),
- to_field_name='slug',
- label=_('Manufacturer (slug)'),
- )
- rack_type = django_filters.ModelMultipleChoiceFilter(
- field_name='rack_type__slug',
- queryset=RackType.objects.all(),
- to_field_name='slug',
- label=_('Rack type (slug)'),
- )
- rack_type_id = django_filters.ModelMultipleChoiceFilter(
- queryset=RackType.objects.all(),
- label=_('Rack type (ID)'),
- )
- status = django_filters.MultipleChoiceFilter(
- choices=RackStatusChoices,
- null_value=None
- )
- form_factor = django_filters.MultipleChoiceFilter(
- choices=RackFormFactorChoices
- )
- width = django_filters.MultipleChoiceFilter(
- choices=RackWidthChoices
- )
- 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 = MultiValueCharFilter(
- lookup_expr='iexact'
- )
- class Meta:
- model = Rack
- fields = (
- 'id', 'name', 'facility_id', 'asset_tag', 'u_height', 'starting_unit', 'desc_units', 'outer_width',
- 'outer_height', 'outer_depth', 'outer_unit', 'mounting_depth', 'airflow', 'weight', 'max_weight',
- 'weight_unit', 'description',
- )
- 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(description__icontains=value) |
- Q(comments__icontains=value)
- )
- @register_filterset
- class RackReservationFilterSet(PrimaryModelFilterSet, TenancyFilterSet):
- rack_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Rack.objects.all(),
- label=_('Rack (ID)'),
- )
- site_id = django_filters.ModelMultipleChoiceFilter(
- field_name='rack__site',
- queryset=Site.objects.all(),
- label=_('Site (ID)'),
- )
- site = django_filters.ModelMultipleChoiceFilter(
- field_name='rack__site__slug',
- queryset=Site.objects.all(),
- to_field_name='slug',
- label=_('Site (slug)'),
- )
- region_id = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='rack__site__region',
- lookup_expr='in',
- label=_('Region (ID)'),
- )
- region = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='rack__site__region',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Region (slug)'),
- )
- site_group_id = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='rack__site__group',
- lookup_expr='in',
- label=_('Site group (ID)'),
- )
- site_group = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='rack__site__group',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Site group (slug)'),
- )
- location_id = TreeNodeMultipleChoiceFilter(
- queryset=Location.objects.all(),
- field_name='rack__location',
- lookup_expr='in',
- label=_('Location (ID)'),
- )
- location = TreeNodeMultipleChoiceFilter(
- queryset=Location.objects.all(),
- field_name='rack__location',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Location (slug)'),
- )
- status = django_filters.MultipleChoiceFilter(
- choices=RackReservationStatusChoices,
- null_value=None
- )
- user_id = django_filters.ModelMultipleChoiceFilter(
- queryset=User.objects.all(),
- label=_('User (ID)'),
- )
- user = django_filters.ModelMultipleChoiceFilter(
- field_name='user__username',
- queryset=User.objects.all(),
- to_field_name='username',
- label=_('User (name)'),
- )
- unit = NumericArrayFilter(
- field_name='units',
- lookup_expr='contains'
- )
- class Meta:
- model = RackReservation
- fields = ('id', 'created', 'description')
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- return queryset.filter(
- Q(rack__name__icontains=value) |
- Q(rack__facility_id__icontains=value) |
- Q(user__username__icontains=value) |
- Q(description__icontains=value)
- )
- @register_filterset
- class ManufacturerFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet):
- class Meta:
- model = Manufacturer
- fields = ('id', 'name', 'slug', 'description')
- @register_filterset
- class DeviceTypeFilterSet(PrimaryModelFilterSet):
- manufacturer_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Manufacturer.objects.all(),
- label=_('Manufacturer (ID)'),
- )
- manufacturer = django_filters.ModelMultipleChoiceFilter(
- field_name='manufacturer__slug',
- queryset=Manufacturer.objects.all(),
- to_field_name='slug',
- label=_('Manufacturer (slug)'),
- )
- default_platform_id = TreeNodeMultipleChoiceFilter(
- queryset=Platform.objects.all(),
- field_name='default_platform',
- lookup_expr='in',
- label=_('Default platform (ID)'),
- )
- default_platform = TreeNodeMultipleChoiceFilter(
- queryset=Platform.objects.all(),
- field_name='default_platform',
- to_field_name='slug',
- lookup_expr='in',
- label=_('Default platform (slug)'),
- )
- has_front_image = django_filters.BooleanFilter(
- label=_('Has a front image'),
- method='_has_front_image'
- )
- has_rear_image = django_filters.BooleanFilter(
- label=_('Has a rear image'),
- method='_has_rear_image'
- )
- console_ports = django_filters.BooleanFilter(
- method='_console_ports',
- label=_('Has console ports'),
- )
- console_server_ports = django_filters.BooleanFilter(
- method='_console_server_ports',
- label=_('Has console server ports'),
- )
- power_ports = django_filters.BooleanFilter(
- method='_power_ports',
- label=_('Has power ports'),
- )
- power_outlets = django_filters.BooleanFilter(
- method='_power_outlets',
- label=_('Has power outlets'),
- )
- interfaces = django_filters.BooleanFilter(
- method='_interfaces',
- label=_('Has interfaces'),
- )
- pass_through_ports = django_filters.BooleanFilter(
- method='_pass_through_ports',
- label=_('Has pass-through ports'),
- )
- module_bays = django_filters.BooleanFilter(
- method='_module_bays',
- label=_('Has module bays'),
- )
- device_bays = django_filters.BooleanFilter(
- method='_device_bays',
- label=_('Has device bays'),
- )
- inventory_items = django_filters.BooleanFilter(
- method='_inventory_items',
- label=_('Has inventory items'),
- )
- class Meta:
- model = DeviceType
- fields = (
- 'id', 'model', 'slug', 'part_number', 'u_height', 'exclude_from_utilization', 'is_full_depth',
- 'subdevice_role', 'airflow', 'weight', 'weight_unit', 'description',
- # Counters
- 'console_port_template_count',
- 'console_server_port_template_count',
- 'power_port_template_count',
- 'power_outlet_template_count',
- 'interface_template_count',
- 'front_port_template_count',
- 'rear_port_template_count',
- 'device_bay_template_count',
- 'module_bay_template_count',
- 'inventory_item_template_count',
- 'device_count',
- )
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- return queryset.filter(
- Q(manufacturer__name__icontains=value) |
- Q(model__icontains=value) |
- Q(part_number__icontains=value) |
- Q(description__icontains=value) |
- Q(comments__icontains=value)
- )
- def _has_front_image(self, queryset, name, value):
- if value:
- return queryset.exclude(front_image='')
- else:
- return queryset.filter(front_image='')
- def _has_rear_image(self, queryset, name, value):
- if value:
- return queryset.exclude(rear_image='')
- else:
- return queryset.filter(rear_image='')
- def _console_ports(self, queryset, name, value):
- return queryset.exclude(consoleporttemplates__isnull=value)
- def _console_server_ports(self, queryset, name, value):
- return queryset.exclude(consoleserverporttemplates__isnull=value)
- def _power_ports(self, queryset, name, value):
- return queryset.exclude(powerporttemplates__isnull=value)
- def _power_outlets(self, queryset, name, value):
- return queryset.exclude(poweroutlettemplates__isnull=value)
- def _interfaces(self, queryset, name, value):
- return queryset.exclude(interfacetemplates__isnull=value)
- def _pass_through_ports(self, queryset, name, value):
- return queryset.exclude(
- frontporttemplates__isnull=value,
- rearporttemplates__isnull=value
- )
- def _module_bays(self, queryset, name, value):
- return queryset.exclude(modulebaytemplates__isnull=value)
- def _device_bays(self, queryset, name, value):
- return queryset.exclude(devicebaytemplates__isnull=value)
- def _inventory_items(self, queryset, name, value):
- return queryset.exclude(inventoryitemtemplates__isnull=value)
- @register_filterset
- class ModuleTypeProfileFilterSet(PrimaryModelFilterSet):
- class Meta:
- model = ModuleTypeProfile
- fields = ('id', 'name', 'description')
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- return queryset.filter(
- Q(name__icontains=value) |
- Q(description__icontains=value) |
- Q(comments__icontains=value)
- )
- @register_filterset
- class ModuleTypeFilterSet(AttributeFiltersMixin, PrimaryModelFilterSet):
- profile_id = django_filters.ModelMultipleChoiceFilter(
- queryset=ModuleTypeProfile.objects.all(),
- label=_('Profile (ID)'),
- )
- profile = django_filters.ModelMultipleChoiceFilter(
- field_name='profile__name',
- queryset=ModuleTypeProfile.objects.all(),
- to_field_name='name',
- label=_('Profile (name)'),
- )
- manufacturer_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Manufacturer.objects.all(),
- label=_('Manufacturer (ID)'),
- )
- manufacturer = django_filters.ModelMultipleChoiceFilter(
- field_name='manufacturer__slug',
- queryset=Manufacturer.objects.all(),
- to_field_name='slug',
- label=_('Manufacturer (slug)'),
- )
- console_ports = django_filters.BooleanFilter(
- method='_console_ports',
- label=_('Has console ports'),
- )
- console_server_ports = django_filters.BooleanFilter(
- method='_console_server_ports',
- label=_('Has console server ports'),
- )
- power_ports = django_filters.BooleanFilter(
- method='_power_ports',
- label=_('Has power ports'),
- )
- power_outlets = django_filters.BooleanFilter(
- method='_power_outlets',
- label=_('Has power outlets'),
- )
- interfaces = django_filters.BooleanFilter(
- method='_interfaces',
- label=_('Has interfaces'),
- )
- pass_through_ports = django_filters.BooleanFilter(
- method='_pass_through_ports',
- label=_('Has pass-through ports'),
- )
- class Meta:
- model = ModuleType
- fields = (
- 'id', 'model', 'part_number', 'airflow', 'weight', 'weight_unit', 'description',
- # Counters
- 'module_count',
- )
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- return queryset.filter(
- Q(manufacturer__name__icontains=value) |
- Q(model__icontains=value) |
- Q(part_number__icontains=value) |
- Q(description__icontains=value) |
- Q(comments__icontains=value)
- )
- def _console_ports(self, queryset, name, value):
- return queryset.exclude(consoleporttemplates__isnull=value)
- def _console_server_ports(self, queryset, name, value):
- return queryset.exclude(consoleserverporttemplates__isnull=value)
- def _power_ports(self, queryset, name, value):
- return queryset.exclude(powerporttemplates__isnull=value)
- def _power_outlets(self, queryset, name, value):
- return queryset.exclude(poweroutlettemplates__isnull=value)
- def _interfaces(self, queryset, name, value):
- return queryset.exclude(interfacetemplates__isnull=value)
- def _pass_through_ports(self, queryset, name, value):
- return queryset.exclude(
- frontporttemplates__isnull=value,
- rearporttemplates__isnull=value
- )
- class DeviceTypeComponentFilterSet(django_filters.FilterSet):
- q = django_filters.CharFilter(
- method='search',
- label=_('Search'),
- )
- device_type_id = django_filters.ModelMultipleChoiceFilter(
- queryset=DeviceType.objects.all(),
- field_name='device_type_id',
- label=_('Device type (ID)'),
- )
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- return queryset.filter(
- Q(name__icontains=value) |
- Q(description__icontains=value)
- )
- class ModularDeviceTypeComponentFilterSet(DeviceTypeComponentFilterSet):
- module_type_id = django_filters.ModelMultipleChoiceFilter(
- queryset=ModuleType.objects.all(),
- field_name='module_type_id',
- label=_('Module type (ID)'),
- )
- @register_filterset
- class ConsolePortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
- class Meta:
- model = ConsolePortTemplate
- fields = ('id', 'name', 'label', 'type', 'description')
- @register_filterset
- class ConsoleServerPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
- class Meta:
- model = ConsoleServerPortTemplate
- fields = ('id', 'name', 'label', 'type', 'description')
- @register_filterset
- class PowerPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
- class Meta:
- model = PowerPortTemplate
- fields = ('id', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description')
- @register_filterset
- class PowerOutletTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
- feed_leg = django_filters.MultipleChoiceFilter(
- choices=PowerOutletFeedLegChoices,
- null_value=None
- )
- power_port_id = django_filters.ModelMultipleChoiceFilter(
- queryset=PowerPortTemplate.objects.all(),
- label=_('Power port (ID)'),
- )
- class Meta:
- model = PowerOutletTemplate
- fields = ('id', 'name', 'label', 'type', 'color', 'feed_leg', 'description')
- @register_filterset
- class InterfaceTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
- type = django_filters.MultipleChoiceFilter(
- choices=InterfaceTypeChoices,
- null_value=None
- )
- bridge_id = django_filters.ModelMultipleChoiceFilter(
- field_name='bridge',
- queryset=InterfaceTemplate.objects.all()
- )
- poe_mode = django_filters.MultipleChoiceFilter(
- choices=InterfacePoEModeChoices
- )
- poe_type = django_filters.MultipleChoiceFilter(
- choices=InterfacePoETypeChoices
- )
- rf_role = django_filters.MultipleChoiceFilter(
- choices=WirelessRoleChoices
- )
- class Meta:
- model = InterfaceTemplate
- fields = ('id', 'name', 'label', 'type', 'enabled', 'mgmt_only', 'description')
- @register_filterset
- class FrontPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
- type = django_filters.MultipleChoiceFilter(
- choices=PortTypeChoices,
- null_value=None
- )
- rear_port_id = django_filters.ModelMultipleChoiceFilter(
- field_name='mappings__rear_port',
- queryset=RearPortTemplate.objects.all(),
- to_field_name='rear_port',
- label=_('Rear port (ID)'),
- )
- class Meta:
- model = FrontPortTemplate
- fields = ('id', 'name', 'label', 'type', 'color', 'positions', 'description')
- @register_filterset
- class RearPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
- type = django_filters.MultipleChoiceFilter(
- choices=PortTypeChoices,
- null_value=None
- )
- front_port_id = django_filters.ModelMultipleChoiceFilter(
- field_name='mappings__front_port',
- queryset=FrontPort.objects.all(),
- to_field_name='front_port',
- label=_('Front port (ID)'),
- )
- class Meta:
- model = RearPortTemplate
- fields = ('id', 'name', 'label', 'type', 'color', 'positions', 'description')
- @register_filterset
- class ModuleBayTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet):
- class Meta:
- model = ModuleBayTemplate
- fields = ('id', 'name', 'label', 'position', 'description')
- @register_filterset
- class DeviceBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet):
- class Meta:
- model = DeviceBayTemplate
- fields = ('id', 'name', 'label', 'description')
- @register_filterset
- class InventoryItemTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet):
- parent_id = django_filters.ModelMultipleChoiceFilter(
- queryset=InventoryItemTemplate.objects.all(),
- label=_('Parent inventory item (ID)'),
- )
- manufacturer_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Manufacturer.objects.all(),
- label=_('Manufacturer (ID)'),
- )
- manufacturer = django_filters.ModelMultipleChoiceFilter(
- field_name='manufacturer__slug',
- queryset=Manufacturer.objects.all(),
- to_field_name='slug',
- label=_('Manufacturer (slug)'),
- )
- role_id = django_filters.ModelMultipleChoiceFilter(
- queryset=InventoryItemRole.objects.all(),
- label=_('Role (ID)'),
- )
- role = django_filters.ModelMultipleChoiceFilter(
- field_name='role__slug',
- queryset=InventoryItemRole.objects.all(),
- to_field_name='slug',
- label=_('Role (slug)'),
- )
- component_type = MultiValueContentTypeFilter()
- component_id = MultiValueNumberFilter()
- class Meta:
- model = InventoryItemTemplate
- fields = ('id', 'name', 'label', 'part_id', 'description')
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- qs_filter = (
- Q(name__icontains=value) |
- Q(part_id__icontains=value) |
- Q(description__icontains=value)
- )
- return queryset.filter(qs_filter)
- @register_filterset
- class DeviceRoleFilterSet(NestedGroupModelFilterSet):
- config_template_id = django_filters.ModelMultipleChoiceFilter(
- queryset=ConfigTemplate.objects.all(),
- label=_('Config template (ID)'),
- )
- parent_id = django_filters.ModelMultipleChoiceFilter(
- queryset=DeviceRole.objects.all(),
- label=_('Parent device role (ID)'),
- )
- parent = django_filters.ModelMultipleChoiceFilter(
- field_name='parent__slug',
- queryset=DeviceRole.objects.all(),
- to_field_name='slug',
- label=_('Parent device role (slug)'),
- )
- ancestor_id = TreeNodeMultipleChoiceFilter(
- queryset=DeviceRole.objects.all(),
- field_name='parent',
- lookup_expr='in',
- label=_('Parent device role (ID)'),
- )
- ancestor = TreeNodeMultipleChoiceFilter(
- queryset=DeviceRole.objects.all(),
- field_name='parent',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Parent device role (slug)'),
- )
- class Meta:
- model = DeviceRole
- fields = ('id', 'name', 'slug', 'color', 'vm_role', 'description')
- @register_filterset
- class PlatformFilterSet(NestedGroupModelFilterSet):
- parent_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Platform.objects.all(),
- label=_('Immediate parent platform (ID)'),
- )
- parent = django_filters.ModelMultipleChoiceFilter(
- field_name='parent__slug',
- queryset=Platform.objects.all(),
- to_field_name='slug',
- label=_('Immediate parent platform (slug)'),
- )
- ancestor_id = TreeNodeMultipleChoiceFilter(
- queryset=Platform.objects.all(),
- field_name='parent',
- lookup_expr='in',
- label=_('Parent platform (ID)'),
- )
- ancestor = TreeNodeMultipleChoiceFilter(
- queryset=Platform.objects.all(),
- field_name='parent',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Parent platform (slug)'),
- )
- manufacturer_id = django_filters.ModelMultipleChoiceFilter(
- field_name='manufacturer',
- queryset=Manufacturer.objects.all(),
- label=_('Manufacturer (ID)'),
- )
- manufacturer = django_filters.ModelMultipleChoiceFilter(
- field_name='manufacturer__slug',
- queryset=Manufacturer.objects.all(),
- to_field_name='slug',
- label=_('Manufacturer (slug)'),
- )
- available_for_device_type = django_filters.ModelChoiceFilter(
- queryset=DeviceType.objects.all(),
- method='get_for_device_type'
- )
- config_template_id = django_filters.ModelMultipleChoiceFilter(
- queryset=ConfigTemplate.objects.all(),
- label=_('Config template (ID)'),
- )
- class Meta:
- model = Platform
- fields = ('id', 'name', 'slug', 'description')
- @extend_schema_field(OpenApiTypes.STR)
- def get_for_device_type(self, queryset, name, value):
- """
- Return all Platforms available for a specific manufacturer based on device type and Platforms not assigned any
- manufacturer
- """
- return queryset.filter(Q(manufacturer=None) | Q(manufacturer__device_types=value))
- @register_filterset
- class DeviceFilterSet(
- PrimaryModelFilterSet,
- TenancyFilterSet,
- ContactModelFilterSet,
- LocalConfigContextFilterSet,
- PrimaryIPFilterSet,
- ):
- manufacturer_id = django_filters.ModelMultipleChoiceFilter(
- field_name='device_type__manufacturer',
- queryset=Manufacturer.objects.all(),
- label=_('Manufacturer (ID)'),
- )
- manufacturer = django_filters.ModelMultipleChoiceFilter(
- field_name='device_type__manufacturer__slug',
- queryset=Manufacturer.objects.all(),
- to_field_name='slug',
- label=_('Manufacturer (slug)'),
- )
- device_type = django_filters.ModelMultipleChoiceFilter(
- field_name='device_type__slug',
- queryset=DeviceType.objects.all(),
- to_field_name='slug',
- label=_('Device type (slug)'),
- )
- device_type_id = django_filters.ModelMultipleChoiceFilter(
- queryset=DeviceType.objects.all(),
- label=_('Device type (ID)'),
- )
- role_id = TreeNodeMultipleChoiceFilter(
- field_name='role',
- queryset=DeviceRole.objects.all(),
- lookup_expr='in',
- label=_('Role (ID)'),
- )
- role = TreeNodeMultipleChoiceFilter(
- queryset=DeviceRole.objects.all(),
- field_name='role',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Role (slug)'),
- )
- parent_device_id = django_filters.ModelMultipleChoiceFilter(
- field_name='parent_bay__device',
- queryset=Device.objects.all(),
- label=_('Parent Device (ID)'),
- )
- platform_id = TreeNodeMultipleChoiceFilter(
- queryset=Platform.objects.all(),
- field_name='platform',
- lookup_expr='in',
- label=_('Platform (ID)'),
- )
- platform = TreeNodeMultipleChoiceFilter(
- field_name='platform',
- queryset=Platform.objects.all(),
- to_field_name='slug',
- lookup_expr='in',
- label=_('Platform (slug)'),
- )
- region_id = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='site__region',
- lookup_expr='in',
- label=_('Region (ID)'),
- )
- region = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='site__region',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Region (slug)'),
- )
- site_group_id = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='site__group',
- lookup_expr='in',
- label=_('Site group (ID)'),
- )
- site_group = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='site__group',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Site group (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 name (slug)'),
- )
- location_id = TreeNodeMultipleChoiceFilter(
- queryset=Location.objects.all(),
- field_name='location',
- lookup_expr='in',
- label=_('Location (ID)'),
- )
- location = TreeNodeMultipleChoiceFilter(
- queryset=Location.objects.all(),
- field_name='location',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Location (slug)'),
- )
- rack_id = django_filters.ModelMultipleChoiceFilter(
- field_name='rack',
- queryset=Rack.objects.all(),
- label=_('Rack (ID)'),
- )
- parent_bay_id = django_filters.ModelMultipleChoiceFilter(
- field_name='parent_bay',
- queryset=DeviceBay.objects.all(),
- label=_('Parent bay (ID)'),
- )
- cluster_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Cluster.objects.all(),
- label=_('VM cluster (ID)'),
- )
- cluster_group = django_filters.ModelMultipleChoiceFilter(
- field_name='cluster__group__slug',
- queryset=ClusterGroup.objects.all(),
- to_field_name='slug',
- label=_('Cluster group (slug)'),
- )
- cluster_group_id = django_filters.ModelMultipleChoiceFilter(
- field_name='cluster__group',
- queryset=ClusterGroup.objects.all(),
- label=_('Cluster group (ID)'),
- )
- model = django_filters.ModelMultipleChoiceFilter(
- field_name='device_type__slug',
- queryset=DeviceType.objects.all(),
- to_field_name='slug',
- label=_('Device model (slug)'),
- )
- name = MultiValueCharFilter(
- lookup_expr='iexact'
- )
- status = django_filters.MultipleChoiceFilter(
- choices=DeviceStatusChoices,
- null_value=None
- )
- is_full_depth = django_filters.BooleanFilter(
- field_name='device_type__is_full_depth',
- label=_('Is full depth'),
- )
- mac_address = MultiValueMACAddressFilter(
- field_name='interfaces__mac_addresses__mac_address',
- label=_('MAC address'),
- )
- serial = MultiValueCharFilter(
- lookup_expr='iexact'
- )
- has_primary_ip = django_filters.BooleanFilter(
- method='_has_primary_ip',
- label=_('Has a primary IP'),
- )
- has_oob_ip = django_filters.BooleanFilter(
- method='_has_oob_ip',
- label=_('Has an out-of-band IP'),
- )
- virtual_chassis_id = django_filters.ModelMultipleChoiceFilter(
- field_name='virtual_chassis',
- queryset=VirtualChassis.objects.all(),
- label=_('Virtual chassis (ID)'),
- )
- virtual_chassis_member = django_filters.BooleanFilter(
- method='_virtual_chassis_member',
- label=_('Is a virtual chassis member')
- )
- config_template_id = django_filters.ModelMultipleChoiceFilter(
- queryset=ConfigTemplate.objects.all(),
- label=_('Config template (ID)'),
- )
- console_ports = django_filters.BooleanFilter(
- method='_console_ports',
- label=_('Has console ports'),
- )
- console_server_ports = django_filters.BooleanFilter(
- method='_console_server_ports',
- label=_('Has console server ports'),
- )
- power_ports = django_filters.BooleanFilter(
- method='_power_ports',
- label=_('Has power ports'),
- )
- power_outlets = django_filters.BooleanFilter(
- method='_power_outlets',
- label=_('Has power outlets'),
- )
- interfaces = django_filters.BooleanFilter(
- method='_interfaces',
- label=_('Has interfaces'),
- )
- pass_through_ports = django_filters.BooleanFilter(
- method='_pass_through_ports',
- label=_('Has pass-through ports'),
- )
- module_bays = django_filters.BooleanFilter(
- method='_module_bays',
- label=_('Has module bays'),
- )
- device_bays = django_filters.BooleanFilter(
- method='_device_bays',
- label=_('Has device bays'),
- )
- oob_ip_id = django_filters.ModelMultipleChoiceFilter(
- field_name='oob_ip',
- queryset=IPAddress.objects.all(),
- label=_('OOB IP (ID)'),
- )
- has_virtual_device_context = django_filters.BooleanFilter(
- method='_has_virtual_device_context',
- label=_('Has virtual device context'),
- )
- class Meta:
- model = Device
- fields = (
- 'id', 'asset_tag', 'face', 'position', 'latitude', 'longitude', 'airflow', 'vc_position', 'vc_priority',
- 'description',
- # Counters
- 'console_port_count',
- 'console_server_port_count',
- 'power_port_count',
- 'power_outlet_count',
- 'interface_count',
- 'front_port_count',
- 'rear_port_count',
- 'device_bay_count',
- 'module_bay_count',
- 'inventory_item_count',
- )
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- qs_filter = (
- Q(name__icontains=value) |
- Q(virtual_chassis__name__icontains=value) |
- Q(serial__icontains=value.strip()) |
- Q(asset_tag__icontains=value.strip()) |
- Q(description__icontains=value.strip()) |
- Q(comments__icontains=value)
- )
- # If the given value looks like an IP address, look for primary IPv4/IPv6 assignments
- try:
- ipaddress = netaddr.IPNetwork(value)
- if ipaddress.version == 4:
- qs_filter |= Q(primary_ip4__address__host__inet=ipaddress.ip)
- elif ipaddress.version == 6:
- qs_filter |= Q(primary_ip6__address__host__inet=ipaddress.ip)
- except (AddrFormatError, ValueError):
- pass
- return queryset.filter(qs_filter)
- def _has_primary_ip(self, queryset, name, value):
- params = Q(primary_ip4__isnull=False) | Q(primary_ip6__isnull=False)
- if value:
- return queryset.filter(params)
- return queryset.exclude(params)
- def _has_oob_ip(self, queryset, name, value):
- params = Q(oob_ip__isnull=False)
- if value:
- return queryset.filter(params)
- return queryset.exclude(params)
- def _virtual_chassis_member(self, queryset, name, value):
- return queryset.exclude(virtual_chassis__isnull=value)
- def _console_ports(self, queryset, name, value):
- return queryset.exclude(consoleports__isnull=value)
- def _console_server_ports(self, queryset, name, value):
- return queryset.exclude(consoleserverports__isnull=value)
- def _power_ports(self, queryset, name, value):
- return queryset.exclude(powerports__isnull=value)
- def _power_outlets(self, queryset, name, value):
- return queryset.exclude(poweroutlets__isnull=value)
- def _interfaces(self, queryset, name, value):
- return queryset.exclude(interfaces__isnull=value)
- def _pass_through_ports(self, queryset, name, value):
- return queryset.exclude(
- frontports__isnull=value,
- rearports__isnull=value
- )
- def _module_bays(self, queryset, name, value):
- return queryset.exclude(modulebays__isnull=value)
- def _device_bays(self, queryset, name, value):
- return queryset.exclude(devicebays__isnull=value)
- def _has_virtual_device_context(self, queryset, name, value):
- params = Q(vdcs__isnull=False)
- if value:
- return queryset.filter(params).distinct()
- return queryset.exclude(params)
- @register_filterset
- class VirtualDeviceContextFilterSet(PrimaryModelFilterSet, TenancyFilterSet, PrimaryIPFilterSet):
- device_id = django_filters.ModelMultipleChoiceFilter(
- field_name='device',
- queryset=Device.objects.all(),
- label=_('VDC (ID)')
- )
- device = django_filters.ModelMultipleChoiceFilter(
- field_name='device',
- queryset=Device.objects.all(),
- label=_('Device model')
- )
- interface_id = django_filters.ModelMultipleChoiceFilter(
- field_name='interfaces',
- queryset=Interface.objects.all(),
- label=_('Interface (ID)')
- )
- status = django_filters.MultipleChoiceFilter(
- choices=VirtualDeviceContextStatusChoices
- )
- has_primary_ip = django_filters.BooleanFilter(
- method='_has_primary_ip',
- label=_('Has a primary IP')
- )
- class Meta:
- model = VirtualDeviceContext
- fields = ('id', 'device', 'name', 'identifier', 'description')
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- qs_filter = (
- Q(name__icontains=value) |
- Q(description__icontains=value)
- )
- try:
- qs_filter |= Q(identifier=int(value))
- except ValueError:
- pass
- return queryset.filter(qs_filter).distinct()
- def _has_primary_ip(self, queryset, name, value):
- params = Q(primary_ip4__isnull=False) | Q(primary_ip6__isnull=False)
- if value:
- return queryset.filter(params)
- return queryset.exclude(params)
- @register_filterset
- class ModuleFilterSet(PrimaryModelFilterSet):
- manufacturer_id = django_filters.ModelMultipleChoiceFilter(
- field_name='module_type__manufacturer',
- queryset=Manufacturer.objects.all(),
- label=_('Manufacturer (ID)'),
- )
- manufacturer = django_filters.ModelMultipleChoiceFilter(
- field_name='module_type__manufacturer__slug',
- queryset=Manufacturer.objects.all(),
- to_field_name='slug',
- label=_('Manufacturer (slug)'),
- )
- module_type_id = django_filters.ModelMultipleChoiceFilter(
- field_name='module_type',
- queryset=ModuleType.objects.all(),
- label=_('Module type (ID)'),
- )
- module_type = django_filters.ModelMultipleChoiceFilter(
- field_name='module_type__model',
- queryset=ModuleType.objects.all(),
- to_field_name='model',
- label=_('Module type (model)'),
- )
- module_bay_id = TreeNodeMultipleChoiceFilter(
- queryset=ModuleBay.objects.all(),
- field_name='module_bay',
- lookup_expr='in',
- label=_('Module bay (ID)'),
- )
- region_id = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='device__site__region',
- lookup_expr='in',
- label=_('Region (ID)'),
- )
- region = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='device__site__region',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Region (slug)'),
- )
- site_group_id = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='device__site__group',
- lookup_expr='in',
- label=_('Site group (ID)'),
- )
- site_group = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='device__site__group',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Site group (slug)'),
- )
- site_id = django_filters.ModelMultipleChoiceFilter(
- field_name='device__site',
- queryset=Site.objects.all(),
- label=_('Site (ID)'),
- )
- site = django_filters.ModelMultipleChoiceFilter(
- field_name='device__site__slug',
- queryset=Site.objects.all(),
- to_field_name='slug',
- label=_('Site name (slug)'),
- )
- location_id = django_filters.ModelMultipleChoiceFilter(
- field_name='device__location',
- queryset=Location.objects.all(),
- label=_('Location (ID)'),
- )
- location = django_filters.ModelMultipleChoiceFilter(
- field_name='device__location__slug',
- queryset=Location.objects.all(),
- to_field_name='slug',
- label=_('Location (slug)'),
- )
- rack_id = django_filters.ModelMultipleChoiceFilter(
- field_name='device__rack',
- queryset=Rack.objects.all(),
- label=_('Rack (ID)'),
- )
- rack = django_filters.ModelMultipleChoiceFilter(
- field_name='device__rack__name',
- queryset=Rack.objects.all(),
- to_field_name='name',
- label=_('Rack (name)'),
- )
- device_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Device.objects.all(),
- label=_('Device (ID)'),
- )
- device = django_filters.ModelMultipleChoiceFilter(
- field_name='device__name',
- queryset=Device.objects.all(),
- to_field_name='name',
- label=_('Device (name)'),
- )
- status = django_filters.MultipleChoiceFilter(
- choices=ModuleStatusChoices,
- null_value=None
- )
- serial = MultiValueCharFilter(
- lookup_expr='iexact'
- )
- class Meta:
- model = Module
- fields = ('id', 'status', 'asset_tag', 'description')
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- return queryset.filter(
- Q(device__name__icontains=value.strip()) |
- Q(serial__icontains=value.strip()) |
- Q(asset_tag__icontains=value.strip()) |
- Q(description__icontains=value) |
- Q(comments__icontains=value)
- ).distinct()
- class DeviceComponentFilterSet(OwnerFilterMixin, NetBoxModelFilterSet):
- q = django_filters.CharFilter(
- method='search',
- label=_('Search'),
- )
- region_id = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='device__site__region',
- lookup_expr='in',
- label=_('Region (ID)'),
- )
- region = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='device__site__region',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Region (slug)'),
- )
- site_group_id = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='device__site__group',
- lookup_expr='in',
- label=_('Site group (ID)'),
- )
- site_group = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='device__site__group',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Site group (slug)'),
- )
- site_id = django_filters.ModelMultipleChoiceFilter(
- field_name='_site',
- 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 name (slug)'),
- )
- location_id = django_filters.ModelMultipleChoiceFilter(
- field_name='_location',
- queryset=Location.objects.all(),
- label=_('Location (ID)'),
- )
- location = django_filters.ModelMultipleChoiceFilter(
- field_name='_location__slug',
- queryset=Location.objects.all(),
- to_field_name='slug',
- label=_('Location (slug)'),
- )
- rack_id = django_filters.ModelMultipleChoiceFilter(
- field_name='_rack',
- queryset=Rack.objects.all(),
- label=_('Rack (ID)'),
- )
- rack = django_filters.ModelMultipleChoiceFilter(
- field_name='_rack__name',
- queryset=Rack.objects.all(),
- to_field_name='name',
- label=_('Rack (name)'),
- )
- device_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Device.objects.all(),
- label=_('Device (ID)'),
- )
- device = django_filters.ModelMultipleChoiceFilter(
- field_name='device__name',
- queryset=Device.objects.all(),
- to_field_name='name',
- label=_('Device (name)'),
- )
- device_type_id = django_filters.ModelMultipleChoiceFilter(
- field_name='device__device_type',
- queryset=DeviceType.objects.all(),
- label=_('Device type (ID)'),
- )
- device_type = django_filters.ModelMultipleChoiceFilter(
- field_name='device__device_type__model',
- queryset=DeviceType.objects.all(),
- to_field_name='model',
- label=_('Device type (model)'),
- )
- device_role_id = django_filters.ModelMultipleChoiceFilter(
- field_name='device__role',
- queryset=DeviceRole.objects.all(),
- label=_('Device role (ID)'),
- )
- device_role = django_filters.ModelMultipleChoiceFilter(
- field_name='device__role__slug',
- queryset=DeviceRole.objects.all(),
- to_field_name='slug',
- label=_('Device role (slug)'),
- )
- virtual_chassis_id = django_filters.ModelMultipleChoiceFilter(
- field_name='device__virtual_chassis',
- queryset=VirtualChassis.objects.all(),
- label=_('Virtual Chassis (ID)')
- )
- virtual_chassis = django_filters.ModelMultipleChoiceFilter(
- field_name='device__virtual_chassis__name',
- queryset=VirtualChassis.objects.all(),
- to_field_name='name',
- label=_('Virtual Chassis'),
- )
- device_status = django_filters.MultipleChoiceFilter(
- choices=DeviceStatusChoices,
- field_name='device__status',
- )
- tenant_id = django_filters.ModelMultipleChoiceFilter(
- field_name='device__tenant',
- queryset=Tenant.objects.all(),
- label=_('Tenant (ID)'),
- )
- tenant = django_filters.ModelMultipleChoiceFilter(
- field_name='device__tenant__slug',
- queryset=Tenant.objects.all(),
- to_field_name='slug',
- label=_('Tenant (slug)'),
- )
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- return queryset.filter(
- Q(name__icontains=value) |
- Q(label__icontains=value) |
- Q(description__icontains=value)
- )
- class ModularDeviceComponentFilterSet(DeviceComponentFilterSet):
- """
- Extends DeviceComponentFilterSet to add a module_id filter for components
- which can be associated with a particular module within a device.
- """
- module_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Module.objects.all(),
- label=_('Module (ID)'),
- )
- class CabledObjectFilterSet(django_filters.FilterSet):
- cable_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Cable.objects.all(),
- label=_('Cable (ID)'),
- )
- cabled = django_filters.BooleanFilter(
- field_name='cable',
- lookup_expr='isnull',
- exclude=True
- )
- occupied = django_filters.BooleanFilter(
- method='filter_occupied'
- )
- def filter_occupied(self, queryset, name, value):
- if value:
- return queryset.filter(Q(cable__isnull=False) | Q(mark_connected=True))
- else:
- return queryset.filter(cable__isnull=True, mark_connected=False)
- class PathEndpointFilterSet(django_filters.FilterSet):
- connected = django_filters.BooleanFilter(
- method='filter_connected'
- )
- def filter_connected(self, queryset, name, value):
- if value:
- return queryset.filter(_path__is_active=True)
- else:
- return queryset.filter(Q(_path__isnull=True) | Q(_path__is_active=False))
- @register_filterset
- class ConsolePortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet, PathEndpointFilterSet):
- type = django_filters.MultipleChoiceFilter(
- choices=ConsolePortTypeChoices,
- null_value=None
- )
- class Meta:
- model = ConsolePort
- fields = (
- 'id', 'name', 'label', 'speed', 'description', 'mark_connected', 'cable_end', 'cable_connector',
- )
- @register_filterset
- class ConsoleServerPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet, PathEndpointFilterSet):
- type = django_filters.MultipleChoiceFilter(
- choices=ConsolePortTypeChoices,
- null_value=None
- )
- class Meta:
- model = ConsoleServerPort
- fields = (
- 'id', 'name', 'label', 'speed', 'description', 'mark_connected', 'cable_end', 'cable_connector',
- )
- @register_filterset
- class PowerPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet, PathEndpointFilterSet):
- type = django_filters.MultipleChoiceFilter(
- choices=PowerPortTypeChoices,
- null_value=None
- )
- class Meta:
- model = PowerPort
- fields = (
- 'id', 'name', 'label', 'maximum_draw', 'allocated_draw', 'description', 'mark_connected', 'cable_end',
- 'cable_connector',
- )
- @register_filterset
- class PowerOutletFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet, PathEndpointFilterSet):
- type = django_filters.MultipleChoiceFilter(
- choices=PowerOutletTypeChoices,
- null_value=None
- )
- feed_leg = django_filters.MultipleChoiceFilter(
- choices=PowerOutletFeedLegChoices,
- null_value=None
- )
- power_port_id = django_filters.ModelMultipleChoiceFilter(
- queryset=PowerPort.objects.all(),
- label=_('Power port (ID)'),
- )
- status = django_filters.MultipleChoiceFilter(
- choices=PowerOutletStatusChoices,
- null_value=None
- )
- class Meta:
- model = PowerOutlet
- fields = (
- 'id', 'name', 'status', 'label', 'feed_leg', 'description', 'color', 'mark_connected', 'cable_end',
- 'cable_connector',
- )
- @register_filterset
- class MACAddressFilterSet(PrimaryModelFilterSet):
- mac_address = MultiValueMACAddressFilter()
- assigned_object_type = MultiValueContentTypeFilter()
- device = MultiValueCharFilter(
- method='filter_device',
- field_name='name',
- label=_('Device (name)'),
- )
- device_id = MultiValueNumberFilter(
- method='filter_device',
- field_name='pk',
- label=_('Device (ID)'),
- )
- virtual_machine = MultiValueCharFilter(
- method='filter_virtual_machine',
- field_name='name',
- label=_('Virtual machine (name)'),
- )
- virtual_machine_id = MultiValueNumberFilter(
- method='filter_virtual_machine',
- field_name='pk',
- label=_('Virtual machine (ID)'),
- )
- interface = django_filters.ModelMultipleChoiceFilter(
- field_name='interface__name',
- queryset=Interface.objects.all(),
- to_field_name='name',
- label=_('Interface (name)'),
- )
- interface_id = django_filters.ModelMultipleChoiceFilter(
- field_name='interface',
- queryset=Interface.objects.all(),
- label=_('Interface (ID)'),
- )
- vminterface = django_filters.ModelMultipleChoiceFilter(
- field_name='vminterface__name',
- queryset=VMInterface.objects.all(),
- to_field_name='name',
- label=_('VM interface (name)'),
- )
- vminterface_id = django_filters.ModelMultipleChoiceFilter(
- field_name='vminterface',
- queryset=VMInterface.objects.all(),
- label=_('VM interface (ID)'),
- )
- assigned = django_filters.BooleanFilter(
- method='filter_assigned',
- label=_('Is assigned'),
- )
- primary = django_filters.BooleanFilter(
- method='filter_primary',
- label=_('Is primary'),
- )
- class Meta:
- model = MACAddress
- fields = ('id', 'description', 'assigned_object_type', 'assigned_object_id')
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- qs_filter = (
- Q(mac_address__icontains=value) |
- Q(description__icontains=value)
- )
- return queryset.filter(qs_filter)
- def filter_device(self, queryset, name, value):
- devices = Device.objects.filter(**{f'{name}__in': value})
- if not devices.exists():
- return queryset.none()
- interface_ids = []
- for device in devices:
- interface_ids.extend(device.vc_interfaces().values_list('id', flat=True))
- return queryset.filter(
- interface__in=interface_ids
- )
- def filter_virtual_machine(self, queryset, name, value):
- virtual_machines = VirtualMachine.objects.filter(**{f'{name}__in': value})
- if not virtual_machines.exists():
- return queryset.none()
- interface_ids = []
- for vm in virtual_machines:
- interface_ids.extend(vm.interfaces.values_list('id', flat=True))
- return queryset.filter(
- vminterface__in=interface_ids
- )
- def filter_assigned(self, queryset, name, value):
- params = {
- 'assigned_object_type__isnull': True,
- 'assigned_object_id__isnull': True,
- }
- if value:
- return queryset.exclude(**params)
- else:
- return queryset.filter(**params)
- def filter_primary(self, queryset, name, value):
- interface_mac_ids = Interface.objects.filter(primary_mac_address_id__isnull=False).values_list(
- 'primary_mac_address_id', flat=True
- )
- vminterface_mac_ids = VMInterface.objects.filter(primary_mac_address_id__isnull=False).values_list(
- 'primary_mac_address_id', flat=True
- )
- query = Q(pk__in=interface_mac_ids) | Q(pk__in=vminterface_mac_ids)
- if value:
- return queryset.filter(query)
- else:
- return queryset.exclude(query)
- class CommonInterfaceFilterSet(django_filters.FilterSet):
- mode = django_filters.MultipleChoiceFilter(
- choices=InterfaceModeChoices,
- label=_('802.1Q Mode')
- )
- vlan_id = django_filters.CharFilter(
- method='filter_vlan_id',
- label=_('Assigned VLAN')
- )
- vlan = django_filters.CharFilter(
- method='filter_vlan',
- label=_('Assigned VID')
- )
- vrf_id = django_filters.ModelMultipleChoiceFilter(
- field_name='vrf',
- queryset=VRF.objects.all(),
- label=_('VRF'),
- )
- vrf = django_filters.ModelMultipleChoiceFilter(
- field_name='vrf__rd',
- queryset=VRF.objects.all(),
- to_field_name='rd',
- label=_('VRF (RD)'),
- )
- l2vpn_id = django_filters.ModelMultipleChoiceFilter(
- field_name='l2vpn_terminations__l2vpn',
- queryset=L2VPN.objects.all(),
- label=_('L2VPN (ID)'),
- )
- l2vpn = django_filters.ModelMultipleChoiceFilter(
- field_name='l2vpn_terminations__l2vpn__identifier',
- queryset=L2VPN.objects.all(),
- to_field_name='identifier',
- label=_('L2VPN'),
- )
- vlan_translation_policy_id = django_filters.ModelMultipleChoiceFilter(
- field_name='vlan_translation_policy',
- queryset=VLANTranslationPolicy.objects.all(),
- label=_('VLAN Translation Policy (ID)'),
- )
- vlan_translation_policy = django_filters.ModelMultipleChoiceFilter(
- field_name='vlan_translation_policy__name',
- queryset=VLANTranslationPolicy.objects.all(),
- to_field_name='name',
- label=_('VLAN Translation Policy'),
- )
- def filter_vlan_id(self, queryset, name, value):
- value = value.strip()
- if not value:
- return queryset
- return queryset.filter(
- Q(untagged_vlan_id=value) |
- Q(tagged_vlans=value) |
- Q(qinq_svlan=value)
- )
- def filter_vlan(self, queryset, name, value):
- value = value.strip()
- if not value:
- return queryset
- return queryset.filter(
- Q(untagged_vlan_id__vid=value) |
- Q(tagged_vlans__vid=value) |
- Q(qinq_svlan__vid=value)
- )
- @register_filterset
- class InterfaceFilterSet(
- ModularDeviceComponentFilterSet,
- CabledObjectFilterSet,
- PathEndpointFilterSet,
- CommonInterfaceFilterSet
- ):
- virtual_chassis_member_or_master = MultiValueCharFilter(
- method='filter_virtual_chassis_member_or_master',
- field_name='name',
- label=_('Virtual Chassis Interfaces for Device when device is master')
- )
- virtual_chassis_member_or_master_id = MultiValueNumberFilter(
- method='filter_virtual_chassis_member_or_master',
- field_name='pk',
- label=_('Virtual Chassis Interfaces for Device when device is master (ID)')
- )
- virtual_chassis_member = MultiValueCharFilter(
- method='filter_virtual_chassis_member',
- field_name='name',
- label=_('Virtual Chassis Interfaces for Device')
- )
- virtual_chassis_member_id = MultiValueNumberFilter(
- method='filter_virtual_chassis_member',
- field_name='pk',
- label=_('Virtual Chassis Interfaces for Device (ID)')
- )
- kind = django_filters.CharFilter(
- method='filter_kind',
- label=_('Kind of interface'),
- )
- parent_id = django_filters.ModelMultipleChoiceFilter(
- field_name='parent',
- queryset=Interface.objects.all(),
- label=_('Parent interface (ID)'),
- )
- bridge_id = django_filters.ModelMultipleChoiceFilter(
- field_name='bridge',
- queryset=Interface.objects.all(),
- label=_('Bridged interface (ID)'),
- )
- lag_id = django_filters.ModelMultipleChoiceFilter(
- field_name='lag',
- queryset=Interface.objects.all(),
- label=_('LAG interface (ID)'),
- )
- speed = MultiValueNumberFilter()
- duplex = django_filters.MultipleChoiceFilter(
- choices=InterfaceDuplexChoices
- )
- mac_address = MultiValueMACAddressFilter(
- field_name='mac_addresses__mac_address',
- label=_('MAC Address')
- )
- primary_mac_address_id = django_filters.ModelMultipleChoiceFilter(
- field_name='primary_mac_address',
- queryset=MACAddress.objects.all(),
- label=_('Primary MAC address (ID)'),
- )
- primary_mac_address = django_filters.ModelMultipleChoiceFilter(
- field_name='primary_mac_address__mac_address',
- queryset=MACAddress.objects.all(),
- to_field_name='mac_address',
- label=_('Primary MAC address'),
- )
- wwn = MultiValueWWNFilter()
- poe_mode = django_filters.MultipleChoiceFilter(
- choices=InterfacePoEModeChoices
- )
- poe_type = django_filters.MultipleChoiceFilter(
- choices=InterfacePoETypeChoices
- )
- type = django_filters.MultipleChoiceFilter(
- choices=InterfaceTypeChoices,
- null_value=None
- )
- rf_role = django_filters.MultipleChoiceFilter(
- choices=WirelessRoleChoices
- )
- rf_channel = django_filters.MultipleChoiceFilter(
- choices=WirelessChannelChoices
- )
- vdc_id = django_filters.ModelMultipleChoiceFilter(
- field_name='vdcs',
- queryset=VirtualDeviceContext.objects.all(),
- label=_('Virtual Device Context')
- )
- vdc_identifier = django_filters.ModelMultipleChoiceFilter(
- field_name='vdcs__identifier',
- queryset=VirtualDeviceContext.objects.all(),
- to_field_name='identifier',
- label=_('Virtual Device Context (Identifier)')
- )
- vdc = django_filters.ModelMultipleChoiceFilter(
- field_name='vdcs__name',
- queryset=VirtualDeviceContext.objects.all(),
- to_field_name='name',
- label=_('Virtual Device Context')
- )
- wireless_lan_id = django_filters.ModelMultipleChoiceFilter(
- field_name='wireless_lans',
- queryset=WirelessLAN.objects.all(),
- label=_('Wireless LAN')
- )
- wireless_link_id = django_filters.ModelMultipleChoiceFilter(
- queryset=WirelessLink.objects.all(),
- label=_('Wireless link')
- )
- virtual_circuit_id = django_filters.ModelMultipleChoiceFilter(
- field_name='virtual_circuit_termination__virtual_circuit',
- queryset=VirtualCircuit.objects.all(),
- label=_('Virtual circuit (ID)'),
- )
- virtual_circuit_termination_id = django_filters.ModelMultipleChoiceFilter(
- field_name='virtual_circuit_termination',
- queryset=VirtualCircuitTermination.objects.all(),
- label=_('Virtual circuit termination (ID)'),
- )
- class Meta:
- model = Interface
- fields = (
- 'id', 'name', 'label', 'type', 'enabled', 'mtu', 'mgmt_only', 'poe_mode', 'poe_type', 'mode', 'rf_role',
- 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected',
- 'cable_id', 'cable_end', 'cable_connector',
- )
- def filter_virtual_chassis_member_or_master(self, queryset, name, value):
- return self.filter_virtual_chassis_member(queryset, name, value, if_master=True)
- def filter_virtual_chassis_member(self, queryset, name, value, if_master=False):
- try:
- vc_interface_ids = []
- for device in Device.objects.filter(**{f'{name}__in': value}):
- vc_interface_ids.extend(device.vc_interfaces(if_master=if_master).values_list('id', flat=True))
- return queryset.filter(pk__in=vc_interface_ids)
- except Device.DoesNotExist:
- return queryset.none()
- def filter_kind(self, queryset, name, value):
- value = value.strip().lower()
- return {
- 'physical': queryset.exclude(type__in=NONCONNECTABLE_IFACE_TYPES),
- 'virtual': queryset.filter(type__in=VIRTUAL_IFACE_TYPES),
- 'wireless': queryset.filter(type__in=WIRELESS_IFACE_TYPES),
- }.get(value, queryset.none())
- # Override the method on CabledObjectFilterSet to also check for wireless links
- def filter_occupied(self, queryset, name, value):
- if value:
- return queryset.filter(
- Q(cable__isnull=False) |
- Q(wireless_link__isnull=False) |
- Q(mark_connected=True)
- )
- else:
- return queryset.filter(
- cable__isnull=True,
- wireless_link__isnull=True,
- mark_connected=False
- )
- @register_filterset
- class FrontPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet):
- type = django_filters.MultipleChoiceFilter(
- choices=PortTypeChoices,
- null_value=None
- )
- rear_port_id = django_filters.ModelMultipleChoiceFilter(
- field_name='mappings__rear_port',
- queryset=RearPort.objects.all(),
- to_field_name='rear_port',
- label=_('Rear port (ID)'),
- )
- class Meta:
- model = FrontPort
- fields = (
- 'id', 'name', 'label', 'type', 'color', 'positions', 'description', 'mark_connected', 'cable_end',
- 'cable_connector',
- )
- @register_filterset
- class RearPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet):
- type = django_filters.MultipleChoiceFilter(
- choices=PortTypeChoices,
- null_value=None
- )
- front_port_id = django_filters.ModelMultipleChoiceFilter(
- field_name='mappings__front_port',
- queryset=FrontPort.objects.all(),
- to_field_name='front_port',
- label=_('Front port (ID)'),
- )
- class Meta:
- model = RearPort
- fields = (
- 'id', 'name', 'label', 'type', 'color', 'positions', 'description', 'mark_connected', 'cable_end',
- 'cable_connector',
- )
- @register_filterset
- class ModuleBayFilterSet(ModularDeviceComponentFilterSet):
- parent_id = django_filters.ModelMultipleChoiceFilter(
- queryset=ModuleBay.objects.all(),
- label=_('Parent module bay (ID)'),
- )
- installed_module_id = django_filters.ModelMultipleChoiceFilter(
- field_name='installed_module',
- queryset=ModuleBay.objects.all(),
- label=_('Installed module (ID)'),
- )
- class Meta:
- model = ModuleBay
- fields = ('id', 'name', 'label', 'position', 'description')
- @register_filterset
- class DeviceBayFilterSet(DeviceComponentFilterSet):
- installed_device_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Device.objects.all(),
- label=_('Installed device (ID)'),
- )
- installed_device = django_filters.ModelMultipleChoiceFilter(
- field_name='installed_device__name',
- queryset=Device.objects.all(),
- to_field_name='name',
- label=_('Installed device (name)'),
- )
- class Meta:
- model = DeviceBay
- fields = ('id', 'name', 'label', 'description')
- @register_filterset
- class InventoryItemFilterSet(DeviceComponentFilterSet):
- parent_id = django_filters.ModelMultipleChoiceFilter(
- queryset=InventoryItem.objects.all(),
- label=_('Parent inventory item (ID)'),
- )
- manufacturer_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Manufacturer.objects.all(),
- label=_('Manufacturer (ID)'),
- )
- manufacturer = django_filters.ModelMultipleChoiceFilter(
- field_name='manufacturer__slug',
- queryset=Manufacturer.objects.all(),
- to_field_name='slug',
- label=_('Manufacturer (slug)'),
- )
- role_id = django_filters.ModelMultipleChoiceFilter(
- queryset=InventoryItemRole.objects.all(),
- label=_('Role (ID)'),
- )
- role = django_filters.ModelMultipleChoiceFilter(
- field_name='role__slug',
- queryset=InventoryItemRole.objects.all(),
- to_field_name='slug',
- label=_('Role (slug)'),
- )
- component_type = MultiValueContentTypeFilter()
- component_id = MultiValueNumberFilter()
- serial = MultiValueCharFilter(
- lookup_expr='iexact'
- )
- status = django_filters.MultipleChoiceFilter(
- choices=InventoryItemStatusChoices,
- null_value=None
- )
- class Meta:
- model = InventoryItem
- fields = ('id', 'name', 'label', 'part_id', 'asset_tag', 'status', 'description', 'discovered')
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- qs_filter = (
- Q(name__icontains=value) |
- Q(part_id__icontains=value) |
- Q(serial__icontains=value) |
- Q(asset_tag__icontains=value) |
- Q(description__icontains=value)
- )
- return queryset.filter(qs_filter)
- @register_filterset
- class InventoryItemRoleFilterSet(OrganizationalModelFilterSet):
- class Meta:
- model = InventoryItemRole
- fields = ('id', 'name', 'slug', 'color', 'description')
- @register_filterset
- class VirtualChassisFilterSet(PrimaryModelFilterSet):
- master_id = django_filters.ModelMultipleChoiceFilter(
- queryset=Device.objects.all(),
- label=_('Master (ID)'),
- )
- master = django_filters.ModelMultipleChoiceFilter(
- field_name='master__name',
- queryset=Device.objects.all(),
- to_field_name='name',
- label=_('Master (name)'),
- )
- region_id = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='master__site__region',
- lookup_expr='in',
- label=_('Region (ID)'),
- )
- region = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='master__site__region',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Region (slug)'),
- )
- site_group_id = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='master__site__group',
- lookup_expr='in',
- label=_('Site group (ID)'),
- )
- site_group = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='master__site__group',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Site group (slug)'),
- )
- site_id = django_filters.ModelMultipleChoiceFilter(
- field_name='master__site',
- queryset=Site.objects.all(),
- label=_('Site (ID)'),
- )
- site = django_filters.ModelMultipleChoiceFilter(
- field_name='master__site__slug',
- queryset=Site.objects.all(),
- to_field_name='slug',
- label=_('Site name (slug)'),
- )
- tenant_id = django_filters.ModelMultipleChoiceFilter(
- field_name='master__tenant',
- queryset=Tenant.objects.all(),
- label=_('Tenant (ID)'),
- )
- tenant = django_filters.ModelMultipleChoiceFilter(
- field_name='master__tenant__slug',
- queryset=Tenant.objects.all(),
- to_field_name='slug',
- label=_('Tenant (slug)'),
- )
- class Meta:
- model = VirtualChassis
- fields = ('id', 'domain', 'name', 'description', 'member_count')
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- qs_filter = (
- Q(name__icontains=value) |
- Q(description__icontains=value) |
- Q(members__name__icontains=value) |
- Q(domain__icontains=value)
- )
- return queryset.filter(qs_filter).distinct()
- @register_filterset
- class CableFilterSet(TenancyFilterSet, PrimaryModelFilterSet):
- termination_a_type = MultiValueContentTypeFilter(
- field_name='terminations__termination_type'
- )
- termination_a_id = MultiValueNumberFilter(
- method='filter_by_cable_end_a',
- field_name='terminations__termination_id'
- )
- termination_b_type = MultiValueContentTypeFilter(
- field_name='terminations__termination_type'
- )
- termination_b_id = MultiValueNumberFilter(
- method='filter_by_cable_end_b',
- field_name='terminations__termination_id'
- )
- unterminated = django_filters.BooleanFilter(
- method='_unterminated',
- label=_('Unterminated'),
- )
- type = django_filters.MultipleChoiceFilter(
- choices=CableTypeChoices
- )
- status = django_filters.MultipleChoiceFilter(
- choices=LinkStatusChoices
- )
- profile = django_filters.MultipleChoiceFilter(
- choices=CableProfileChoices
- )
- color = django_filters.MultipleChoiceFilter(
- choices=ColorChoices
- )
- device_id = MultiValueNumberFilter(
- method='filter_by_termination'
- )
- device = MultiValueCharFilter(
- method='filter_by_termination',
- field_name='device__name'
- )
- rack_id = MultiValueNumberFilter(
- method='filter_by_termination',
- field_name='rack_id'
- )
- rack = MultiValueCharFilter(
- method='filter_by_termination',
- field_name='rack__name'
- )
- location_id = MultiValueNumberFilter(
- method='filter_by_termination',
- field_name='location_id'
- )
- location = MultiValueCharFilter(
- method='filter_by_termination',
- field_name='location__name'
- )
- site_id = MultiValueNumberFilter(
- method='filter_by_termination',
- field_name='site_id'
- )
- site = MultiValueCharFilter(
- method='filter_by_termination',
- field_name='site__slug'
- )
- # Termination object filters
- consoleport_id = MultiValueNumberFilter(
- method='filter_by_consoleport'
- )
- consoleserverport_id = MultiValueNumberFilter(
- method='filter_by_consoleserverport'
- )
- powerport_id = MultiValueNumberFilter(
- method='filter_by_powerport'
- )
- poweroutlet_id = MultiValueNumberFilter(
- method='filter_by_poweroutlet'
- )
- interface_id = MultiValueNumberFilter(
- method='filter_by_interface'
- )
- frontport_id = MultiValueNumberFilter(
- method='filter_by_frontport'
- )
- rearport_id = MultiValueNumberFilter(
- method='filter_by_rearport'
- )
- powerfeed_id = MultiValueNumberFilter(
- method='filter_by_powerfeed'
- )
- circuittermination_id = MultiValueNumberFilter(
- method='filter_by_circuittermination'
- )
- class Meta:
- model = Cable
- fields = ('id', 'label', 'length', 'length_unit', 'description')
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- qs_filter = (
- Q(label__icontains=value) |
- Q(description__icontains=value)
- )
- return queryset.filter(qs_filter)
- def filter_by_termination(self, queryset, name, value):
- # Filter by a related object cached on CableTermination. Note the underscore preceding the field name.
- # Supported objects: device, rack, location, site
- return queryset.filter(**{f'terminations___{name}__in': value}).distinct()
- def filter_by_cable_end(self, queryset, name, value, side):
- # Filter by termination id and cable_end type
- return queryset.filter(**{f'{name}__in': value, 'terminations__cable_end': side}).distinct()
- def filter_by_cable_end_a(self, queryset, name, value):
- # Filter by termination id and cable_end type
- return self.filter_by_cable_end(queryset, name, value, CableEndChoices.SIDE_A)
- def filter_by_cable_end_b(self, queryset, name, value):
- # Filter by termination id and cable_end type
- return self.filter_by_cable_end(queryset, name, value, CableEndChoices.SIDE_B)
- def _unterminated(self, queryset, name, value):
- if value:
- terminated_ids = (
- queryset.filter(terminations__cable_end=CableEndChoices.SIDE_A)
- .filter(terminations__cable_end=CableEndChoices.SIDE_B)
- .values("id")
- )
- return queryset.exclude(id__in=terminated_ids)
- else:
- return queryset.filter(terminations__cable_end=CableEndChoices.SIDE_A).filter(
- terminations__cable_end=CableEndChoices.SIDE_B
- )
- def filter_by_termination_object(self, queryset, model, value):
- # Filter by specific termination object(s)
- content_type = ContentType.objects.get_for_model(model)
- cable_ids = CableTermination.objects.filter(
- termination_type=content_type,
- termination_id__in=value
- ).values_list('cable', flat=True)
- return queryset.filter(pk__in=cable_ids)
- def filter_by_consoleport(self, queryset, name, value):
- return self.filter_by_termination_object(queryset, ConsolePort, value)
- def filter_by_consoleserverport(self, queryset, name, value):
- return self.filter_by_termination_object(queryset, ConsoleServerPort, value)
- def filter_by_powerport(self, queryset, name, value):
- return self.filter_by_termination_object(queryset, PowerPort, value)
- def filter_by_poweroutlet(self, queryset, name, value):
- return self.filter_by_termination_object(queryset, PowerOutlet, value)
- def filter_by_interface(self, queryset, name, value):
- return self.filter_by_termination_object(queryset, Interface, value)
- def filter_by_frontport(self, queryset, name, value):
- return self.filter_by_termination_object(queryset, FrontPort, value)
- def filter_by_rearport(self, queryset, name, value):
- return self.filter_by_termination_object(queryset, RearPort, value)
- def filter_by_powerfeed(self, queryset, name, value):
- return self.filter_by_termination_object(queryset, PowerFeed, value)
- def filter_by_circuittermination(self, queryset, name, value):
- return self.filter_by_termination_object(queryset, CircuitTermination, value)
- @register_filterset
- class CableTerminationFilterSet(ChangeLoggedModelFilterSet):
- termination_type = MultiValueContentTypeFilter()
- class Meta:
- model = CableTermination
- fields = ('id', 'cable', 'cable_end', 'termination_type', 'termination_id')
- @register_filterset
- class PowerPanelFilterSet(PrimaryModelFilterSet, ContactModelFilterSet):
- region_id = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='site__region',
- lookup_expr='in',
- label=_('Region (ID)'),
- )
- region = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='site__region',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Region (slug)'),
- )
- site_group_id = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='site__group',
- lookup_expr='in',
- label=_('Site group (ID)'),
- )
- site_group = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='site__group',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Site group (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 name (slug)'),
- )
- location_id = TreeNodeMultipleChoiceFilter(
- queryset=Location.objects.all(),
- field_name='location',
- lookup_expr='in',
- label=_('Location (ID)'),
- )
- class Meta:
- model = PowerPanel
- fields = ('id', 'name', 'description')
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- qs_filter = (
- Q(name__icontains=value) |
- Q(description__icontains=value)
- )
- return queryset.filter(qs_filter)
- @register_filterset
- class PowerFeedFilterSet(PrimaryModelFilterSet, CabledObjectFilterSet, PathEndpointFilterSet, TenancyFilterSet):
- region_id = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='power_panel__site__region',
- lookup_expr='in',
- label=_('Region (ID)'),
- )
- region = TreeNodeMultipleChoiceFilter(
- queryset=Region.objects.all(),
- field_name='power_panel__site__region',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Region (slug)'),
- )
- site_group_id = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='power_panel__site__group',
- lookup_expr='in',
- label=_('Site group (ID)'),
- )
- site_group = TreeNodeMultipleChoiceFilter(
- queryset=SiteGroup.objects.all(),
- field_name='power_panel__site__group',
- lookup_expr='in',
- to_field_name='slug',
- label=_('Site group (slug)'),
- )
- site_id = django_filters.ModelMultipleChoiceFilter(
- field_name='power_panel__site',
- queryset=Site.objects.all(),
- label=_('Site (ID)'),
- )
- site = django_filters.ModelMultipleChoiceFilter(
- field_name='power_panel__site__slug',
- queryset=Site.objects.all(),
- to_field_name='slug',
- label=_('Site name (slug)'),
- )
- power_panel_id = django_filters.ModelMultipleChoiceFilter(
- queryset=PowerPanel.objects.all(),
- label=_('Power panel (ID)'),
- )
- rack_id = django_filters.ModelMultipleChoiceFilter(
- field_name='rack',
- queryset=Rack.objects.all(),
- label=_('Rack (ID)'),
- )
- status = django_filters.MultipleChoiceFilter(
- choices=PowerFeedStatusChoices,
- null_value=None
- )
- class Meta:
- model = PowerFeed
- fields = (
- 'id', 'name', 'status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization',
- 'available_power', 'mark_connected', 'cable_end', 'cable_connector', 'description',
- )
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- qs_filter = (
- Q(name__icontains=value) |
- Q(description__icontains=value) |
- Q(power_panel__name__icontains=value) |
- Q(comments__icontains=value)
- )
- return queryset.filter(qs_filter)
- #
- # Connection filter sets
- #
- class ConnectionFilterSet(BaseFilterSet):
- q = django_filters.CharFilter(
- method='search',
- label=_('Search'),
- )
- site_id = MultiValueNumberFilter(
- method='filter_connections',
- field_name='device__site_id'
- )
- site = MultiValueCharFilter(
- method='filter_connections',
- field_name='device__site__slug'
- )
- device_id = MultiValueNumberFilter(
- method='filter_connections',
- field_name='device_id'
- )
- device = MultiValueCharFilter(
- method='filter_connections',
- field_name='device__name'
- )
- def filter_connections(self, queryset, name, value):
- if not value:
- return queryset
- return queryset.filter(**{f'{name}__in': value})
- def search(self, queryset, name, value):
- if not value.strip():
- return queryset
- qs_filter = (
- Q(device__name__icontains=value) |
- Q(cable__label__icontains=value)
- )
- return queryset.filter(qs_filter)
- class ConsoleConnectionFilterSet(ConnectionFilterSet):
- class Meta:
- model = ConsolePort
- fields = ('name',)
- class PowerConnectionFilterSet(ConnectionFilterSet):
- class Meta:
- model = PowerPort
- fields = ('name',)
- class InterfaceConnectionFilterSet(ConnectionFilterSet):
- class Meta:
- model = Interface
- fields = tuple()
|