From 1f67b13bffa874da8e1c88156fa33f97ac0a475a Mon Sep 17 00:00:00 2001 From: Kennedy Kori Date: Mon, 19 Sep 2022 14:05:56 +0300 Subject: [PATCH] feat(api): add missing API filters Add important API filters that enable the following: 1. Ability to list extract metadata applicable only to a given data source and/or data source version. 2. Ability to list upload metadata from a given facility and/or on a given date. --- apps/core/filters.py | 18 +++++++++++ apps/sql_data/apiviews.py | 21 +++++++------ apps/sql_data/filters.py | 64 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 9 deletions(-) create mode 100644 apps/core/filters.py create mode 100644 apps/sql_data/filters.py diff --git a/apps/core/filters.py b/apps/core/filters.py new file mode 100644 index 0000000..f64ab19 --- /dev/null +++ b/apps/core/filters.py @@ -0,0 +1,18 @@ +from django_filters.rest_framework import FilterSet + + +class BaseFilterSet(FilterSet): + """ + The base `FilterSet` from which all other filter sets are derived from. + """ + + ... + + +class AuditBaseFilterSet(BaseFilterSet): + """ + The base `FilterSet` from which all other `AuditBase` model filter sets are + derived from. + """ + + ... diff --git a/apps/sql_data/apiviews.py b/apps/sql_data/apiviews.py index f0892f8..b001443 100644 --- a/apps/sql_data/apiviews.py +++ b/apps/sql_data/apiviews.py @@ -5,6 +5,13 @@ from apps.core.apiviews import AuditBaseViewSet +from .filters import ( + DataSourceVersionFilter, + SQLDatabaseSourceFilter, + SQLExtractMetadataFilter, + SQLUploadChunkFilter, + SQLUploadMetadataFilter, +) from .models import ( DataSourceVersion, SQLDatabaseSource, @@ -28,7 +35,7 @@ class DataSourceVersionViewSet(AuditBaseViewSet): queryset = DataSourceVersion.objects.all() serializer_class = DataSourceVersionSerializer - filterset_fields = ["id", "data_source", "data_source_version"] + filterset_class = DataSourceVersionFilter class SQLDatabaseViewSet(AuditBaseViewSet): @@ -36,7 +43,7 @@ class SQLDatabaseViewSet(AuditBaseViewSet): queryset = SQLDatabaseSource.objects.all() serializer_class = SQLDatabaseSerializer - filterset_fields = ["id", "name", "database_name", "database_vendor"] + filterset_class = SQLDatabaseSourceFilter class SQLExtractMetadataViewSet(AuditBaseViewSet): @@ -46,13 +53,7 @@ class SQLExtractMetadataViewSet(AuditBaseViewSet): "applicable_source_versions", "data_source" ).all() serializer_class = SQLExtractMetadataSerializer - filterset_fields = [ - "id", - "name", - "data_source__database_name", - "version", - "preferred_uploads_name", - ] + filterset_class = SQLExtractMetadataFilter class SQLUploadChunkViewSet( @@ -65,6 +66,7 @@ class SQLUploadChunkViewSet( queryset = SQLUploadChunk.objects.all() serializer_class = SQLUploadChunkSerializer + filterset_class = SQLUploadChunkFilter class SQLUploadMetadataViewSet(AuditBaseViewSet): @@ -74,6 +76,7 @@ class SQLUploadMetadataViewSet(AuditBaseViewSet): "upload_chunks" ).all() serializer_class = SQLUploadMetadataSerializer + filterset_class = SQLUploadMetadataFilter @action( detail=True, diff --git a/apps/sql_data/filters.py b/apps/sql_data/filters.py new file mode 100644 index 0000000..b591c98 --- /dev/null +++ b/apps/sql_data/filters.py @@ -0,0 +1,64 @@ +from apps.core.filters import AuditBaseFilterSet + +from .models import ( + DataSourceVersion, + SQLDatabaseSource, + SQLExtractMetadata, + SQLUploadChunk, + SQLUploadMetadata, +) + + +class DataSourceVersionFilter(AuditBaseFilterSet): + """Filter for the `DataSourceVersion` model.""" + + class Meta: + model = DataSourceVersion + fields = ("id", "data_source", "data_source_version") + + +class SQLDatabaseSourceFilter(AuditBaseFilterSet): + """Filter for the `SQLDatabaseSource` model.""" + + class Meta: + model = SQLDatabaseSource + fields = ("id", "name", "database_name", "database_vendor") + + +class SQLExtractMetadataFilter(AuditBaseFilterSet): + """Filter for the `SQLExtractMetadata` model.""" + + class Meta: + model = SQLExtractMetadata + fields = ( + "id", + "name", + "data_source", + "applicable_source_versions", + "version", + "preferred_uploads_name", + ) + + +class SQLUploadChunkFilter(AuditBaseFilterSet): + """Filter for the `SQLUploadChunk` model.""" + + class Meta: + model = SQLUploadChunk + fields = ("id", "upload_metadata") + + +class SQLUploadMetadataFilter(AuditBaseFilterSet): + """Filter for the `SQLUploadMetadata` model.""" + + class Meta: + model = SQLUploadMetadata + fields = { + "id": ["exact"], + "extract_metadata": ["exact"], + "org_unit_code": ["exact"], + "org_unit_name": ["exact", "icontains"], + "start_time": ["exact", "lt", "gt"], + "finish_time": ["exact", "lt", "gt"], + "is_consumed": ["exact"], + }