mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-25 08:46:10 -06:00
Clean up filtering of usable SavedFilters
This commit is contained in:
parent
ac587432f9
commit
39bb6d3282
@ -109,21 +109,6 @@ class SavedFilterViewSet(NetBoxModelViewSet):
|
|||||||
serializer_class = serializers.SavedFilterSerializer
|
serializer_class = serializers.SavedFilterSerializer
|
||||||
filterset_class = filtersets.SavedFilterFilterSet
|
filterset_class = filtersets.SavedFilterFilterSet
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
"""
|
|
||||||
Return only shared SavedFilters, or those owned by the current user, unless
|
|
||||||
this is a superuser.
|
|
||||||
"""
|
|
||||||
queryset = super().get_queryset()
|
|
||||||
user = self.request.user
|
|
||||||
if user.is_superuser:
|
|
||||||
return queryset
|
|
||||||
if user.is_anonymous:
|
|
||||||
return queryset.filter(shared=True)
|
|
||||||
return queryset.filter(
|
|
||||||
Q(shared=True) | Q(user=user)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Tags
|
# Tags
|
||||||
|
@ -158,6 +158,9 @@ class SavedFilterFilterSet(BaseFilterSet):
|
|||||||
to_field_name='username',
|
to_field_name='username',
|
||||||
label='User (name)',
|
label='User (name)',
|
||||||
)
|
)
|
||||||
|
usable = django_filters.BooleanFilter(
|
||||||
|
method='_usable'
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = SavedFilter
|
model = SavedFilter
|
||||||
@ -171,6 +174,19 @@ class SavedFilterFilterSet(BaseFilterSet):
|
|||||||
Q(description__icontains=value)
|
Q(description__icontains=value)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _usable(self, queryset, name, value):
|
||||||
|
"""
|
||||||
|
Return only SavedFilters that are both enabled and are shared (or belong to the current user).
|
||||||
|
"""
|
||||||
|
user = self.request.user if self.request else None
|
||||||
|
if not user or user.is_anonymous:
|
||||||
|
if value:
|
||||||
|
return queryset.filter(enabled=True, shared=True)
|
||||||
|
return queryset.filter(Q(enabled=False) | Q(shared=False))
|
||||||
|
if value:
|
||||||
|
return queryset.filter(enabled=True).filter(Q(shared=True) | Q(user=user))
|
||||||
|
return queryset.filter(Q(enabled=False) | Q(Q(shared=False) & ~Q(user=user)))
|
||||||
|
|
||||||
|
|
||||||
class ImageAttachmentFilterSet(BaseFilterSet):
|
class ImageAttachmentFilterSet(BaseFilterSet):
|
||||||
q = django_filters.CharFilter(
|
q = django_filters.CharFilter(
|
||||||
|
@ -66,7 +66,8 @@ class SavedFiltersMixin(forms.Form):
|
|||||||
filter = DynamicModelMultipleChoiceField(
|
filter = DynamicModelMultipleChoiceField(
|
||||||
queryset=SavedFilter.objects.all(),
|
queryset=SavedFilter.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
|
label='Saved Filter',
|
||||||
query_params={
|
query_params={
|
||||||
'enabled': True,
|
'usable': True,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@ -300,6 +300,13 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests):
|
|||||||
params = {'enabled': False}
|
params = {'enabled': False}
|
||||||
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
|
||||||
|
|
||||||
|
def test_usable(self):
|
||||||
|
# Filtering for an anonymous user
|
||||||
|
params = {'usable': True}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
||||||
|
params = {'usable': False}
|
||||||
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1)
|
||||||
|
|
||||||
|
|
||||||
class ExportTemplateTestCase(TestCase, BaseFilterSetTests):
|
class ExportTemplateTestCase(TestCase, BaseFilterSetTests):
|
||||||
queryset = ExportTemplate.objects.all()
|
queryset = ExportTemplate.objects.all()
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row">Shared</th>
|
<th scope="row">Shared</th>
|
||||||
<td>{% checkmark object.enabled %}</td>
|
<td>{% checkmark object.shared %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row">Weight</th>
|
<th scope="row">Weight</th>
|
||||||
|
Loading…
Reference in New Issue
Block a user