Clean up filtering of usable SavedFilters

This commit is contained in:
jeremystretch 2022-11-02 11:41:10 -04:00
parent ac587432f9
commit 39bb6d3282
5 changed files with 26 additions and 17 deletions

View File

@ -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

View File

@ -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(

View File

@ -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,
}
)

View File

@ -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()

View File

@ -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>