Skip to content
This repository was archived by the owner on May 5, 2023. It is now read-only.

Commit f3175c5

Browse files
committed
improvement: add states daily list api
1 parent 893ab3f commit f3175c5

File tree

3 files changed

+88
-30
lines changed

3 files changed

+88
-30
lines changed

django_covid19/serializers.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,13 @@ class Meta:
167167
exclude = ('id', 'dailyData')
168168

169169

170+
class StateDailyListSerializer(serializers.ModelSerializer):
171+
172+
class Meta:
173+
model = models.State
174+
fields = ['stateName', 'dailyData']
175+
176+
170177
class StateDailySerializer(serializers.Serializer):
171178

172179
state = serializers.CharField()

django_covid19/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
path('countries/<str:countryName>/daily/', views.CountryDailyListView.as_view(), name='country-daily-list'),
2828

2929
url(r'states/(?:(?P<raw>raw)/)?(?P<countryShortCode>[^/]+)/$', views.StateListView.as_view(), name='state-list'),
30+
url(r'states/(?:(?P<raw>raw)/)?(?P<countryShortCode>[^/]+)/daily/$', views.StateListDailyListView.as_view(), name='state-list-daily-list'),
3031
url(r'states/(?:(?P<raw>raw)/)?(?P<countryShortCode>[^/]+)/(?P<state>[A-Z]+)/$', views.StateRetrieveView.as_view(), name='state-detail'),
3132
url(r'states/(?:(?P<raw>raw)/)?(?P<countryShortCode>[^/]+)/(?P<state>[A-Z]+)/daily/$', views.StateDailyListView.as_view(), name='state-daily-list'),
3233
url(r'states/(?:(?P<raw>raw)/)?(?P<countryShortCode>[^/]+)/(?P<stateName>[^/]+)/$', views.StateRetrieveByNameView.as_view(), name='state-detail-by-name'),

django_covid19/views.py

Lines changed: 80 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -320,37 +320,14 @@ def get(self, request, countryShortCode, state, raw=None):
320320
return Response(serializer.data)
321321

322322

323-
class StateDailyListView(APIView):
323+
class BaseDailyView(object):
324324

325-
"""州按天返回列表"""
326-
327-
def get_object(self, countryShortCode, state):
328-
state = models.State.objects.filter(
329-
countryShortCode=countryShortCode, state=state).first()
330-
if state is None:
331-
raise Http404
332-
return state
333-
334-
@method_decorator(cache_page(
335-
CACHE_PAGE_TIMEOUT, key_prefix='state-daily-list'))
336-
def get(self, request, countryShortCode, state, raw=None):
337-
inst = self.get_object(countryShortCode, state)
338-
result = inst.dailyData
339-
result = json.loads(result)
340-
if raw == 'raw':
341-
return Response(result)
342-
data = []
343-
for r in result:
344-
data.append(self.format(inst, r))
345-
serializer = serializers.StateDailySerializer(data, many=True)
346-
return Response(serializer.data)
347-
348-
def format(self, inst, data):
325+
def format(self, countryShortCode, stateName, data):
349326
item = {}
350327
item['date'] = data['date']
351328
item['state'] = data['state']
352-
item['stateName'] = inst.stateName
353-
item['countryShortCode'] = inst.countryShortCode
329+
item['stateName'] = stateName
330+
item['countryShortCode'] = countryShortCode
354331

355332
item['confirmedCount'] = data.get('positive')
356333
item['currentConfirmedCount'] = self.get_current_confirmed(data)
@@ -376,7 +353,34 @@ def get_current_confirmed_incr(self, data):
376353
death = data['deathIncrease'] if data.get('deathIncrease') else 0
377354
return positive - death
378355

379-
class StateDailyListByNameView(StateDailyListView):
356+
357+
class StateDailyListView(APIView, BaseDailyView):
358+
359+
"""州按天返回列表"""
360+
361+
def get_object(self, countryShortCode, state):
362+
state = models.State.objects.filter(
363+
countryShortCode=countryShortCode, state=state).first()
364+
if state is None:
365+
raise Http404
366+
return state
367+
368+
@method_decorator(cache_page(
369+
CACHE_PAGE_TIMEOUT, key_prefix='state-daily-list'))
370+
def get(self, request, countryShortCode, state, raw=None):
371+
inst = self.get_object(countryShortCode, state)
372+
result = inst.dailyData
373+
result = json.loads(result)
374+
if raw == 'raw':
375+
return Response(result)
376+
stateName = inst.stateName
377+
data = []
378+
for r in result:
379+
data.append(self.format(countryShortCode, stateName, r))
380+
serializer = serializers.StateDailySerializer(data, many=True)
381+
return Response(serializer.data)
382+
383+
class StateDailyListByNameView(APIView, BaseDailyView):
380384

381385
def get_object(self, countryShortCode, stateName):
382386
state = models.State.objects.filter(
@@ -393,8 +397,54 @@ def get(self, request, countryShortCode, stateName, raw=None):
393397
result = json.loads(result)
394398
if raw == 'raw':
395399
return Response(result)
400+
stateName = inst.stateName
396401
data = []
397402
for r in result:
398-
data.append(self.format(inst, r))
403+
data.append(self.format(countryShortCode, stateName, r))
399404
serializer = serializers.StateDailySerializer(data, many=True)
400-
return Response(serializer.data)
405+
return Response(serializer.data)
406+
407+
408+
class StateListDailyListView(ListAPIView, BaseDailyView):
409+
410+
serializer_class = serializers.StateDailyListSerializer
411+
filter_class = filters.StateFilter
412+
413+
def get_queryset(self):
414+
countryShortCode = self.kwargs['countryShortCode']
415+
return models.State.objects.filter(
416+
countryShortCode=countryShortCode).order_by('state')
417+
418+
def list(self, request, *args, **kwargs):
419+
countryShortCode = kwargs['countryShortCode']
420+
queryset = self.filter_queryset(self.get_queryset())
421+
422+
if kwargs.get('raw') == 'raw':
423+
self.serializer_class = serializers.StateRawSerializer
424+
425+
result = []
426+
page = self.paginate_queryset(queryset)
427+
if page is not None:
428+
serializer = self.get_serializer(page, many=True)
429+
for item in serializer.data:
430+
stateName = item['stateName']
431+
dailyData = json.loads(item['dailyData'])
432+
for daily in dailyData:
433+
result.append(
434+
self.format(countryShortCode, stateName, daily))
435+
return self.get_paginated_response(result)
436+
437+
serializer = self.get_serializer(queryset, many=True)
438+
for item in serializer.data:
439+
stateName = item['stateName']
440+
dailyData = json.loads(item['dailyData'])
441+
for daily in dailyData:
442+
result.append(
443+
self.format(countryShortCode, stateName, daily))
444+
return Response(result)
445+
446+
@method_decorator(cache_page(
447+
CACHE_PAGE_TIMEOUT, key_prefix='state-list-daily-list'))
448+
def dispatch(self, *args, **kwargs):
449+
return super(StateListDailyListView, self).dispatch(*args, **kwargs)
450+

0 commit comments

Comments
 (0)