Skip to content

Commit d9637c3

Browse files
committed
CDD-3342: Refactor downloads serializer
1 parent 8782ea3 commit d9637c3

13 files changed

Lines changed: 164 additions & 63 deletions

File tree

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,21 @@
11
from .charts import ChartsSerializer
22
from .headlines import HeadlinesQuerySerializer, CoreHeadlineSerializer
33
from .trends import TrendsQuerySerializer, TrendsResponseSerializer
4-
from .downloads import (
5-
DownloadsSerializer,
6-
BulkDownloadsSerializer,
7-
)
4+
from .downloads.single_category import SingleCategoryDownloadsSerializer
5+
from .downloads.dual_category import DualCategoryDownloadSerializer
86
from .timeseries import CoreTimeSeriesSerializer
97
from .geographies_alerts import GeographiesForAlertsSerializer
8+
from .downloads.common import BulkDownloadsSerializer
9+
10+
__all__ = [
11+
"ChartsSerializer",
12+
"HeadlinesQuerySerializer",
13+
"CoreHeadlineSerializer",
14+
"TrendsQuerySerializer",
15+
"TrendsResponseSerializer",
16+
"SingleCategoryDownloadsSerializer",
17+
"DualCategoryDownloadSerializer",
18+
"CoreTimeSeriesSerializer",
19+
"GeographiesForAlertsSerializer",
20+
"BulkDownloadsSerializer",
21+
]

metrics/api/serializers/downloads/__init__.py

Whitespace-only changes.
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from rest_framework import serializers
2+
3+
from metrics.api.serializers import help_texts
4+
from metrics.domain.common.utils import (
5+
ChartAxisFields,
6+
)
7+
8+
FILE_FORMAT_CHOICES: list[str] = ["json", "csv"]
9+
10+
11+
class BaseDownloadsSerializer(serializers.Serializer):
12+
file_format = serializers.ChoiceField(
13+
choices=FILE_FORMAT_CHOICES,
14+
required=True,
15+
help_text=help_texts.FILE_DOWNLOAD_FORMAT,
16+
)
17+
x_axis = serializers.ChoiceField(
18+
choices=ChartAxisFields.choices(),
19+
required=False,
20+
allow_blank=True,
21+
allow_null=True,
22+
help_text=help_texts.CHART_X_AXIS,
23+
)
24+
y_axis = serializers.ChoiceField(
25+
choices=ChartAxisFields.choices(),
26+
required=False,
27+
allow_blank=True,
28+
allow_null=True,
29+
help_text=help_texts.CHART_Y_AXIS,
30+
)
31+
confidence_intervals = serializers.BooleanField(
32+
required=False,
33+
default=False,
34+
allow_null=True,
35+
help_text=help_texts.CONFIDENCE_INTERVALS,
36+
)
37+
38+
39+
class BulkDownloadsSerializer(serializers.Serializer):
40+
file_format = serializers.ChoiceField(
41+
choices=FILE_FORMAT_CHOICES,
42+
required=True,
43+
help_text=help_texts.FILE_DOWNLOAD_FORMAT,
44+
)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from metrics.api.serializers.downloads.single_category import (
2+
DownloadListSerializer,
3+
SingleCategoryDownloadsSerializer,
4+
)
5+
6+
7+
class DualCategoryDownloadSerializer(SingleCategoryDownloadsSerializer):
8+
plots = DownloadListSerializer()

metrics/api/serializers/downloads.py renamed to metrics/api/serializers/downloads/single_category.py

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,15 @@
22
from rest_framework.request import Request
33

44
from metrics.api.serializers import help_texts, plots
5+
from metrics.api.serializers.downloads.common import BaseDownloadsSerializer
56
from metrics.domain.common.utils import (
67
DEFAULT_CHART_HEIGHT,
78
DEFAULT_CHART_WIDTH,
8-
ChartAxisFields,
99
DataSourceFileType,
1010
extract_metric_group_from_metric,
1111
)
1212
from metrics.domain.models import ChartRequestParams
1313

14-
FILE_FORMAT_CHOICES: list[str] = ["json", "csv"]
15-
1614

1715
class DownloadPlotSerializer(plots.PlotSerializer):
1816
# Override these two fields as they are merely optional for this serializer
@@ -34,33 +32,7 @@ class DownloadListSerializer(serializers.ListSerializer):
3432
child = DownloadPlotSerializer()
3533

3634

37-
class DownloadsSerializer(serializers.Serializer):
38-
file_format = serializers.ChoiceField(
39-
choices=FILE_FORMAT_CHOICES,
40-
required=True,
41-
help_text=help_texts.FILE_DOWNLOAD_FORMAT,
42-
)
43-
x_axis = serializers.ChoiceField(
44-
choices=ChartAxisFields.choices(),
45-
required=False,
46-
allow_blank=True,
47-
allow_null=True,
48-
help_text=help_texts.CHART_X_AXIS,
49-
)
50-
y_axis = serializers.ChoiceField(
51-
choices=ChartAxisFields.choices(),
52-
required=False,
53-
allow_blank=True,
54-
allow_null=True,
55-
help_text=help_texts.CHART_Y_AXIS,
56-
)
57-
confidence_intervals = serializers.BooleanField(
58-
required=False,
59-
default=False,
60-
allow_null=True,
61-
help_text=help_texts.CONFIDENCE_INTERVALS,
62-
)
63-
35+
class SingleCategoryDownloadsSerializer(BaseDownloadsSerializer):
6436
plots = DownloadListSerializer()
6537

6638
def to_models(self, request: Request) -> ChartRequestParams:
@@ -103,11 +75,3 @@ def to_models(self, request: Request) -> ChartRequestParams:
10375
plot.override_y_axis_choice_to_none = True
10476

10577
return plots_collection
106-
107-
108-
class BulkDownloadsSerializer(serializers.Serializer):
109-
file_format = serializers.ChoiceField(
110-
choices=FILE_FORMAT_CHOICES,
111-
required=True,
112-
help_text=help_texts.FILE_DOWNLOAD_FORMAT,
113-
)

metrics/api/urls_construction.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,21 @@
2424
BulkDownloadsView,
2525
ChartsView,
2626
ColdAlertViewSet,
27-
DownloadsView,
2827
EncodedChartsView,
2928
HeadlinesView,
3029
HealthView,
3130
HeatAlertViewSet,
31+
SingleCategoryDownloadsView,
3232
SubplotDownloadsView,
3333
TablesSubplotView,
3434
TablesView,
3535
TrendsView,
3636
)
3737
from metrics.api.views.charts import DualCategoryChartsView
3838
from metrics.api.views.charts.subplot_charts import SubplotChartsView
39+
# from metrics.api.views.downloads.dual_category_downloads import (
40+
# DualCategoryDownloadsView,
41+
# )
3942
from metrics.api.views.geographies import (
4043
GeographiesByGeographyTypeView,
4144
GeographiesView,
@@ -194,9 +197,12 @@ def construct_public_api_urlpatterns(
194197
# Metrics/private content endpoints
195198
re_path(f"^{API_PREFIX}charts/v3", EncodedChartsView.as_view()),
196199
re_path(f"^{API_PREFIX}charts/subplot/v1", SubplotChartsView.as_view()),
197-
re_path(f"^{API_PREFIX}downloads/v2", DownloadsView.as_view()),
200+
re_path(f"^{API_PREFIX}downloads/v2", SingleCategoryDownloadsView.as_view()),
198201
re_path(f"^{API_PREFIX}bulkdownloads/v1", BulkDownloadsView.as_view()),
199202
re_path(f"^{API_PREFIX}downloads/subplot/v1", SubplotDownloadsView.as_view()),
203+
# re_path(
204+
# f"^{API_PREFIX}downloads/dual-category/v1", DualCategoryDownloadsView.as_view()
205+
# ),
200206
re_path(
201207
f"^{API_PREFIX}geographies/v2/(?P<topic>[^/]+)",
202208
GeographiesViewDeprecated.as_view(),

metrics/api/views/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
from .alerts import HeatAlertViewSet, ColdAlertViewSet
22
from .charts import ChartsView, EncodedChartsView, DualCategoryChartsView
33
from .headlines import HeadlinesView
4-
from .downloads import DownloadsView, BulkDownloadsView, SubplotDownloadsView
4+
from .downloads import (
5+
SingleCategoryDownloadsView,
6+
BulkDownloadsView,
7+
SubplotDownloadsView,
8+
)
59
from .health import HealthView
610
from .tables import TablesView, TablesSubplotView
711
from .trends import TrendsView
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
from .single_category_downloads import DownloadsView
1+
from .single_category_downloads import SingleCategoryDownloadsView
22
from .bulk_downloads import BulkDownloadsView
33
from .subplot_downloads.api_view import SubplotDownloadsView
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# from http import HTTPStatus
2+
3+
# from drf_spectacular.utils import OpenApiExample, extend_schema
4+
# from rest_framework.response import Response
5+
6+
# from caching.private_api.decorators import cache_response
7+
# from metrics.api.decorators.auth import require_authorisation
8+
# from metrics.api.serializers import (
9+
# DualCategoryDownloadSerializer,
10+
# )
11+
# from metrics.api.views.charts.dual_category_charts import (
12+
# EXAMPLE_DUAL_CATEGORY_CHART_REQUEST_PAYLOAD,
13+
# )
14+
# from metrics.api.views.downloads.common import DOWNLOADS_API_TAG
15+
# from metrics.data.managers.core_models.time_series import CoreTimeSeriesQuerySet
16+
# from metrics.interfaces.downloads import access
17+
# from metrics.interfaces.plots.access import DataNotFoundForAnyPlotError
18+
19+
# DEFAULT_VALUE_ERROR_MESSAGE = "Invalid metric_group provided"
20+
21+
22+
# class DualCategoryDownloadsView(SingleCategoryDownloadsView):
23+
24+
# @extend_schema(
25+
# request=DualCategoryDownloadSerializer,
26+
# tags=[DOWNLOADS_API_TAG],
27+
# examples=[
28+
# OpenApiExample(
29+
# name="COVID-19 age-sex example",
30+
# value=EXAMPLE_DUAL_CATEGORY_CHART_REQUEST_PAYLOAD,
31+
# request_only=True,
32+
# )
33+
# ],
34+
# )
35+
# @cache_response()
36+
# @require_authorisation
37+
# def post(self, request, *args, **kwargs):
38+
# request_serializer = DualCategoryDownloadSerializer(data=request.data)
39+
# request_serializer.is_valid(raise_exception=True)
40+
41+
# file_format: str = request_serializer.data["file_format"]
42+
# chart_plot_models = request_serializer.to_models(request=request)
43+
44+
# try:
45+
# queryset: CoreTimeSeriesQuerySet = access.get_downloads_data(
46+
# chart_plots=chart_plot_models
47+
# )
48+
# except DataNotFoundForAnyPlotError as error:
49+
# return Response(
50+
# status=HTTPStatus.BAD_REQUEST, data={"error_message": str(error)}
51+
# )
52+
53+
# match file_format:
54+
# case "json":
55+
# return self._handle_json(
56+
# queryset=queryset, metric_group=chart_plot_models.metric_group
57+
# )
58+
# case "csv":
59+
# return self._handle_csv(
60+
# queryset=queryset, metric_group=chart_plot_models.metric_group
61+
# )

metrics/api/views/downloads/single_category_downloads.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from metrics.api.serializers import (
1313
CoreHeadlineSerializer,
1414
CoreTimeSeriesSerializer,
15-
DownloadsSerializer,
15+
SingleCategoryDownloadsSerializer,
1616
)
1717
from metrics.api.views.downloads.common import DOWNLOADS_API_TAG
1818
from metrics.data.managers.core_models.headline import CoreHeadlineQuerySet
@@ -28,7 +28,7 @@
2828
DEFAULT_VALUE_ERROR_MESSAGE = "Invalid metric_group provided"
2929

3030

31-
class DownloadsView(APIView):
31+
class SingleCategoryDownloadsView(APIView):
3232
timeseries_serializer_class = CoreTimeSeriesSerializer
3333
headline_serializer_class = CoreHeadlineSerializer
3434
permission_classes = []
@@ -99,7 +99,7 @@ def _handle_csv(
9999

100100
return write_data_to_csv(file=response, core_time_series_queryset=queryset)
101101

102-
@extend_schema(request=DownloadsSerializer, tags=[DOWNLOADS_API_TAG])
102+
@extend_schema(request=SingleCategoryDownloadsSerializer, tags=[DOWNLOADS_API_TAG])
103103
@cache_response()
104104
@require_authorisation
105105
def post(self, request, *args, **kwargs):
@@ -129,7 +129,7 @@ def post(self, request, *args, **kwargs):
129129
| `date_to` | The date to pull the data up until | `2023-01-20` |
130130
131131
"""
132-
request_serializer = DownloadsSerializer(data=request.data)
132+
request_serializer = SingleCategoryDownloadsSerializer(data=request.data)
133133
request_serializer.is_valid(raise_exception=True)
134134

135135
file_format: str = request_serializer.data["file_format"]

0 commit comments

Comments
 (0)