Coverage for core/forms/filtersets.py: 100%
53 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1from django import forms
2from django.utils.translation import gettext_lazy as _
4from core.choices import *
5from core.models import *
6from netbox.forms import NetBoxModelFilterSetForm, PrimaryModelFilterSetForm
7from netbox.forms.mixins import SavedFiltersMixin
8from netbox.utils import get_data_backend_choices
9from users.models import User
10from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice
11from utilities.forms.fields import (
12 ContentTypeChoiceField,
13 ContentTypeMultipleChoiceField,
14 DynamicModelMultipleChoiceField,
15 TagFilterField,
16)
17from utilities.forms.rendering import FieldSet
18from utilities.forms.widgets import DateTimePicker
20__all__ = (
21 'ConfigRevisionFilterForm',
22 'DataFileFilterForm',
23 'DataSourceFilterForm',
24 'JobFilterForm',
25 'ObjectChangeFilterForm',
26)
29class DataSourceFilterForm(PrimaryModelFilterSetForm):
30 model = DataSource
31 fieldsets = (
32 FieldSet('q', 'filter_id', 'tag'),
33 FieldSet('type', 'status', 'enabled', 'sync_interval', name=_('Data Source')),
34 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')),
35 )
36 type = forms.MultipleChoiceField(
37 label=_('Type'),
38 choices=get_data_backend_choices,
39 required=False
40 )
41 status = forms.MultipleChoiceField(
42 label=_('Status'),
43 choices=DataSourceStatusChoices,
44 required=False
45 )
46 enabled = forms.NullBooleanField(
47 label=_('Enabled'),
48 required=False,
49 widget=forms.Select(
50 choices=BOOLEAN_WITH_BLANK_CHOICES
51 )
52 )
53 sync_interval = forms.ChoiceField(
54 label=_('Sync interval'),
55 choices=JobIntervalChoices,
56 required=False
57 )
58 tag = TagFilterField(model)
61class DataFileFilterForm(NetBoxModelFilterSetForm):
62 model = DataFile
63 fieldsets = (
64 FieldSet('q', 'filter_id'),
65 FieldSet('source_id', name=_('File')),
66 )
67 source_id = DynamicModelMultipleChoiceField(
68 queryset=DataSource.objects.all(),
69 required=False,
70 label=_('Data source')
71 )
74class JobFilterForm(SavedFiltersMixin, FilterForm):
75 model = Job
76 fieldsets = (
77 FieldSet('q', 'filter_id'),
78 FieldSet('object_type_id', 'status', 'queue_name', 'user_id', name=_('Attributes')),
79 FieldSet(
80 'created__before', 'created__after', 'scheduled__before', 'scheduled__after', 'started__before',
81 'started__after', 'completed__before', 'completed__after', name=_('Scheduling')
82 ),
83 FieldSet('execution_time__gte', 'execution_time__lte', name=_('Execution')),
84 )
85 object_type_id = ContentTypeChoiceField(
86 label=_('Object Type'),
87 queryset=ObjectType.objects.with_feature('jobs'),
88 required=False,
89 )
90 status = forms.MultipleChoiceField(
91 label=_('Status'),
92 choices=JobStatusChoices,
93 required=False
94 )
95 queue_name = forms.CharField(
96 label=_('Queue'),
97 required=False
98 )
99 created__after = forms.DateTimeField(
100 label=_('Created after'),
101 required=False,
102 widget=DateTimePicker()
103 )
104 created__before = forms.DateTimeField(
105 label=_('Created before'),
106 required=False,
107 widget=DateTimePicker()
108 )
109 scheduled__after = forms.DateTimeField(
110 label=_('Scheduled after'),
111 required=False,
112 widget=DateTimePicker()
113 )
114 scheduled__before = forms.DateTimeField(
115 label=_('Scheduled before'),
116 required=False,
117 widget=DateTimePicker()
118 )
119 started__after = forms.DateTimeField(
120 label=_('Started after'),
121 required=False,
122 widget=DateTimePicker()
123 )
124 started__before = forms.DateTimeField(
125 label=_('Started before'),
126 required=False,
127 widget=DateTimePicker()
128 )
129 completed__after = forms.DateTimeField(
130 label=_('Completed after'),
131 required=False,
132 widget=DateTimePicker()
133 )
134 completed__before = forms.DateTimeField(
135 label=_('Completed before'),
136 required=False,
137 widget=DateTimePicker()
138 )
139 user_id = DynamicModelMultipleChoiceField(
140 queryset=User.objects.all(),
141 required=False,
142 label=_('User')
143 )
144 execution_time__gte = forms.DurationField(
145 label=_('Execution time (minimum)'),
146 required=False,
147 help_text=_('Seconds, or HH:MM:SS')
148 )
149 execution_time__lte = forms.DurationField(
150 label=_('Execution time (maximum)'),
151 required=False,
152 help_text=_('Seconds, or HH:MM:SS')
153 )
156class ObjectChangeFilterForm(SavedFiltersMixin, FilterForm):
157 model = ObjectChange
158 fieldsets = (
159 FieldSet('q', 'filter_id'),
160 FieldSet('time_before', 'time_after', name=_('Time')),
161 FieldSet('action', 'user_id', 'changed_object_type_id', name=_('Attributes')),
162 )
163 time_after = forms.DateTimeField(
164 required=False,
165 label=_('After'),
166 widget=DateTimePicker()
167 )
168 time_before = forms.DateTimeField(
169 required=False,
170 label=_('Before'),
171 widget=DateTimePicker()
172 )
173 action = forms.ChoiceField(
174 label=_('Action'),
175 choices=add_blank_choice(ObjectChangeActionChoices),
176 required=False
177 )
178 user_id = DynamicModelMultipleChoiceField(
179 queryset=User.objects.all(),
180 required=False,
181 label=_('User')
182 )
183 changed_object_type_id = ContentTypeMultipleChoiceField(
184 queryset=ObjectType.objects.with_feature('change_logging'),
185 required=False,
186 label=_('Object Type'),
187 )
190class ConfigRevisionFilterForm(SavedFiltersMixin, FilterForm):
191 model = ConfigRevision
192 fieldsets = (
193 FieldSet('q', 'filter_id'),
194 )