|
23 | 23 | """ |
24 | 24 |
|
25 | 25 | from django_filters import rest_framework as filters |
| 26 | +from django_filters.constants import EMPTY_VALUES |
26 | 27 |
|
27 | 28 | from ESSArch_Core.api.filters import CharSuffixRangeFilter, ListFilter |
28 | 29 | from ESSArch_Core.configuration.models import StoragePolicy |
|
36 | 37 | ) |
37 | 38 |
|
38 | 39 |
|
| 40 | +class StorageMediumOrderingFilter(filters.OrderingFilter): |
| 41 | + def filter(self, qs, value): |
| 42 | + if value in EMPTY_VALUES or 'medium_id' in value: |
| 43 | + return qs.natural_sort() |
| 44 | + elif '-medium_id' in value: |
| 45 | + return qs.natural_sort().reverse() |
| 46 | + |
| 47 | + return super().filter(qs, value) |
| 48 | + |
| 49 | + |
39 | 50 | class StorageMediumFilter(filters.FilterSet): |
40 | 51 | status = ListFilter(field_name='status', distinct='true') |
41 | 52 | medium_type = filters.ChoiceFilter(field_name='storage_target__type', choices=medium_type_CHOICES) |
@@ -68,11 +79,12 @@ def filter_migratable(self, queryset, name, value): |
68 | 79 | else: |
69 | 80 | return queryset.non_migratable() |
70 | 81 |
|
71 | | - ordering = filters.OrderingFilter( |
| 82 | + ordering = StorageMediumOrderingFilter( |
72 | 83 | fields=( |
73 | 84 | ('id', 'id'), |
74 | 85 | ('medium_id', 'medium_id'), |
75 | 86 | ('storage_target__name', 'storage_target'), |
| 87 | + ('storage_target__max_capacity', 'max_capacity'), |
76 | 88 | ('status', 'status'), |
77 | 89 | ('location', 'location'), |
78 | 90 | ('location_status', 'location_status'), |
|
0 commit comments