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

Commit 7436b4d

Browse files
committed
feat: add statistics list view
1 parent fe6688e commit 7436b4d

File tree

3 files changed

+49
-8
lines changed

3 files changed

+49
-8
lines changed

ncovapi/serializers.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class RumorSerializer(serializers.Serializer):
6363
score = serializers.IntegerField()
6464
rumorType = serializers.IntegerField()
6565

66-
class StatisticsSerializer(serializers.Serializer):
66+
class LatestStatisticsSerializer(serializers.Serializer):
6767

6868
globalStatistics = StatisticsGroupSerializer()
6969
domesticStatistics = StatisticsGroupSerializer()
@@ -85,6 +85,15 @@ class StatisticsSerializer(serializers.Serializer):
8585
createTime = serializers.DateTimeField()
8686

8787

88+
class StatisticsSerializer(serializers.Serializer):
89+
90+
globalStatistics = StatisticsGroupSerializer()
91+
domesticStatistics = StatisticsGroupSerializer()
92+
internationalStatistics = StatisticsGroupSerializer()
93+
modifyTime = serializers.DateTimeField()
94+
createTime = serializers.DateTimeField()
95+
96+
8897
class ProvinceSerializer(serializers.HyperlinkedModelSerializer):
8998

9099
provinceName = serializers.CharField(read_only=True)

ncovapi/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@
88
app_name = 'ncovapi'
99

1010
urlpatterns = [
11-
path('statistics/', views.StatisticsView.as_view(), name='statistics'),
11+
path('statistics/', views.StatisticsListView.as_view(), name='statistics-list'),
12+
path('statistics/latest', views.LatestStatisticsView.as_view(), name='latest_statistics'),
1213
path('cities/', views.CityListView.as_view(), name='city-list'),
1314
path('cities/<int:pk>/', views.CityRetrieveView.as_view(), name='city-detail'),
1415
path('cities/<str:cityName>/', views.CityRetrieveByNameView.as_view(), name='city-detail-by-name'),

ncovapi/views.py

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,21 @@
1212
from rest_framework.views import APIView
1313
from rest_framework_extensions.cache.decorators import cache_response
1414

15-
from .serializers import StatisticsSerializer, CitySerializer, \
16-
ProvinceSerializer, CountrySerializer, \
17-
RecommendSerializer, TimelineSerializer
15+
from .serializers import LatestStatisticsSerializer, StatisticsSerializer, \
16+
CitySerializer, ProvinceSerializer, \
17+
CountrySerializer, RecommendSerializer, \
18+
TimelineSerializer
1819
from .models import Crawler, Statistics, WHOArticle, Recommend, \
1920
City, Province, Country
2021
from .filters import CityFilter, ProvinceFilter, CountryFilter
2122

23+
from collections import OrderedDict
2224

2325
TIMEOUT = 60 * 60
2426

25-
class StatisticsView(APIView):
26-
"""统计信息"""
27+
class LatestStatisticsView(APIView):
28+
29+
"""最新统计信息"""
2730

2831
def get_object(self):
2932
try:
@@ -77,9 +80,37 @@ def get_object(self):
7780
@method_decorator(cache_page(TIMEOUT))
7881
def get(self, request):
7982
data = self.get_object()
80-
serializer = StatisticsSerializer(data)
83+
serializer = LatestStatisticsSerializer(data)
8184
return Response(serializer.data)
8285

86+
class StatisticsListView(ListAPIView):
87+
88+
"""统计信息列表"""
89+
90+
serializer_class = StatisticsSerializer
91+
92+
def get_queryset(self):
93+
result = OrderedDict()
94+
for inst in Statistics.objects.all():
95+
crawler_id = inst.crawler_id
96+
country_type = inst.countryType
97+
if country_type == Statistics.GLOBAL:
98+
statistics = result.setdefault(crawler_id, {})
99+
statistics['globalStatistics'] = inst
100+
elif country_type == Statistics.DOMESTIC:
101+
statistics = result.setdefault(crawler_id, {})
102+
statistics['domesticStatistics'] = inst
103+
elif country_type == Statistics.INTERNATIONAL:
104+
statistics = result.setdefault(crawler_id, {})
105+
statistics['internationalStatistics'] = inst
106+
statistics = result.setdefault(crawler_id, {})
107+
statistics['modifyTime'] = inst.crawler.modifyTime
108+
statistics['createTime'] = inst.crawler.createTime
109+
return reversed(result.values())
110+
111+
@method_decorator(cache_page(TIMEOUT))
112+
def dispatch(self, *args, **kwargs):
113+
return super(StatisticsListView, self).dispatch(*args, **kwargs)
83114

84115
class ProvinceListView(ListAPIView):
85116

0 commit comments

Comments
 (0)