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

View File

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

View File

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

View File

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

View File

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