mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-25 00:36:11 -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
|
||||
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
|
||||
|
@ -158,6 +158,9 @@ class SavedFilterFilterSet(BaseFilterSet):
|
||||
to_field_name='username',
|
||||
label='User (name)',
|
||||
)
|
||||
usable = django_filters.BooleanFilter(
|
||||
method='_usable'
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = SavedFilter
|
||||
@ -171,6 +174,19 @@ class SavedFilterFilterSet(BaseFilterSet):
|
||||
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):
|
||||
q = django_filters.CharFilter(
|
||||
|
@ -66,7 +66,8 @@ class SavedFiltersMixin(forms.Form):
|
||||
filter = DynamicModelMultipleChoiceField(
|
||||
queryset=SavedFilter.objects.all(),
|
||||
required=False,
|
||||
label='Saved Filter',
|
||||
query_params={
|
||||
'enabled': True,
|
||||
'usable': True,
|
||||
}
|
||||
)
|
||||
|
@ -300,6 +300,13 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests):
|
||||
params = {'enabled': False}
|
||||
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):
|
||||
queryset = ExportTemplate.objects.all()
|
||||
|
@ -27,7 +27,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Shared</th>
|
||||
<td>{% checkmark object.enabled %}</td>
|
||||
<td>{% checkmark object.shared %}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">Weight</th>
|
||||
|
Loading…
Reference in New Issue
Block a user