Skip to content

Commit 4f16953

Browse files
author
Matt Daily
committed
Add serializer and filter for last_changed endpoint
Add ability to override list view if the view itself doesn't return a list.
1 parent a5a44d2 commit 4f16953

File tree

5 files changed

+33
-6
lines changed

5 files changed

+33
-6
lines changed
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
11
from rest_framework.schemas.openapi import AutoSchema
22

33
class ObservationPortalSchema(AutoSchema):
4-
def __init__(self, tags, operation_id_base=None, component_name=None, empty_request=False):
4+
def __init__(self, tags, operation_id_base=None, component_name=None, empty_request=False, is_list_view=True):
55
super().__init__(tags=tags, operation_id_base=operation_id_base, component_name=component_name)
66
self.empty_request = empty_request
7+
self.is_list_view = is_list_view
78

89
def get_operation(self, path, method):
910
operations = super().get_operation(path, method)
1011
if self.empty_request:
1112
operations['requestBody'] = {}
1213

1314
return operations
15+
16+
def get_responses(self, path, method):
17+
responses = super().get_responses(path, method)
18+
if not self.is_list_view:
19+
list_items = responses['200']['content']['application/json']['schema'].pop('items')
20+
del responses['200']['content']['application/json']['schema']['type']
21+
responses['200']['content']['application/json']['schema'] = list_items
22+
23+
return responses

observation_portal/requestgroups/filters.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import django_filters
22
from observation_portal.requestgroups.models import RequestGroup, Request
3-
3+
from observation_portal.common.configdb import configdb
44

55
class RequestGroupFilter(django_filters.FilterSet):
66
created_after = django_filters.DateTimeFilter(field_name='created', lookup_expr='gte', label='Submitted after')
@@ -67,3 +67,7 @@ class TelescopeAvailabilityFilter(django_filters.FilterSet):
6767

6868
class Meta:
6969
fields = ('start', 'end', 'site', 'telescope', 'combine')
70+
71+
72+
class LastChangedFilter(django_filters.FilterSet):
73+
telescope_class = django_filters.MultipleChoiceFilter(choices=configdb.get_telescope_class_tuples())

observation_portal/requestgroups/serializers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -977,3 +977,6 @@ def to_internal_value(self, data):
977977
new_data = {'request': data}
978978
# do validation on the new request dict, then return it without the extra request key
979979
return super().to_internal_value(new_data)['request']
980+
981+
class LastChangedSerializer(serializers.Serializer):
982+
last_change_time = serializers.DateTimeField()

observation_portal/requestgroups/views.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from django.core.exceptions import ValidationError
2+
from observation_portal.common.schema import ObservationPortalSchema
13
from django.core.cache import cache
24
from django_filters.rest_framework.backends import DjangoFilterBackend
35
from rest_framework.response import Response
@@ -17,7 +19,7 @@
1719
from observation_portal.common.telescope_states import ElasticSearchException, TelescopeStates
1820
from observation_portal.requestgroups.request_utils import get_airmasses_for_request_at_sites
1921
from observation_portal.requestgroups.contention import Contention, Pressure
20-
from observation_portal.requestgroups.filters import TelescopeAvailabilityFilter, TelescopeStatesFilter
22+
from observation_portal.requestgroups.filters import LastChangedFilter, TelescopeAvailabilityFilter, TelescopeStatesFilter
2123
from observation_portal.common.mixins import GetSerializerMixin
2224

2325
logger = logging.getLogger(__name__)
@@ -176,17 +178,24 @@ def get(self, request):
176178
return Response(pressure.data())
177179

178180

179-
class ObservationPortalLastChangedView(APIView):
181+
class ObservationPortalLastChangedView(APIView, GetSerializerMixin):
180182
'''
181183
Returns the datetime of the last status of requests change or new requests addition
182184
'''
183185
permission_classes = (IsAdminUser,)
184-
schema=AutoSchema(tags=['RequestGroups'])
186+
schema=ObservationPortalSchema(tags=['RequestGroups'], is_list_view=False)
187+
filter_class = LastChangedFilter
188+
filter_backends = (DjangoFilterBackend,)
189+
serializer_class = import_string(settings.SERIALIZERS['requestgroups']['LastChanged'])
185190

186191
def get(self, request):
187192
telescope_classes = request.GET.getlist('telescope_class', ['all'])
188193
most_recent_change_time = timezone.now() - timedelta(days=7)
189194
for telescope_class in telescope_classes:
190195
most_recent_change_time = max(most_recent_change_time, cache.get(f"observation_portal_last_change_time_{telescope_class}", timezone.now() - timedelta(days=7)))
191196

192-
return Response({'last_change_time': most_recent_change_time})
197+
serializer = import_string(settings.SERIALIZERS['requestgroups']['LastChanged'])(data={'last_change_time': most_recent_change_time})
198+
if serializer.is_valid():
199+
return Response(serializer.validated_data)
200+
else:
201+
raise ValidationError(serializer.errors)

observation_portal/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,7 @@ def get_list_from_env(variable, default=None):
333333
'Mosaic': os.getenv('REQUESTGROUPS_MOSAIC_SERIALIZER', 'observation_portal.requestgroups.serializers.MosaicSerializer'),
334334
'Dither': os.getenv('REQUESTGROUPS_DITHER_SERIALIZER', 'observation_portal.requestgroups.serializers.DitherSerializer'),
335335
'Airmass': os.getenv('REQUESTGROUPS_AIRMASS_SERIALIZER', 'observation_portal.requestgroups.serializers.AirmassSerializer'),
336+
'LastChanged': os.getenv('REQUESTGROUPS_LAST_CHANGED_SERIALIZER', 'observation_portal.requestgroups.serializers.LastChangedSerializer'),
336337
},
337338
'proposals': {
338339
'Proposal': os.getenv('PROPOSALS_PROPOSAL_SERIALIZER', 'observation_portal.proposals.serializers.ProposalSerializer'),

0 commit comments

Comments
 (0)