diff --git a/.gitmodules b/.gitmodules index dd112777..e69de29b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "src/hapi-schema"] -path = src/hapi-schema -url = https://github.com/OCHA-DAP/hapi-sqlalchemy-schema.git \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json index 2834055d..673e6170 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,6 +12,15 @@ "console": "integratedTerminal", "justMyCode": true, "env":{"HAPI_USE_VAT": "false"} + }, + { + "name": "generate-views", + "type": "debugpy", + "request": "launch", + "program": "/srv/hapi/src/hapi-schema/src/hapi_schema/utils/hapi_views_code_generator.py", + "console": "integratedTerminal", + "justMyCode": true, + "env":{"HAPI_USE_VAT": "false"} } ], diff --git a/hdx_hapi/db/dao/availability_view_dao.py b/hdx_hapi/db/dao/availability_view_dao.py index 219b4adc..7e6e1194 100644 --- a/hdx_hapi/db/dao/availability_view_dao.py +++ b/hdx_hapi/db/dao/availability_view_dao.py @@ -6,26 +6,21 @@ from sqlalchemy.orm import Mapped from hdx_hapi.db.models.views.vat_or_view import AvailabilityView -from hdx_hapi.db.dao.util.util import apply_pagination, case_insensitive_filter -from hdx_hapi.endpoints.util.util import AdminLevel, PaginationParams +from hdx_hapi.db.dao.util.util import apply_location_admin_filter, apply_pagination, case_insensitive_filter +from hdx_hapi.endpoints.util.util import CommonLocationParameters, PaginationParams logger = logging.getLogger(__name__) _UNSPECIFIED = 'UNSPECIFIED' + async def availability_view_list( pagination_parameters: PaginationParams, + common_location_params: CommonLocationParameters, db: AsyncSession, category: Optional[str] = None, subcategory: Optional[str] = None, - location_name: Optional[str] = None, - location_code: Optional[str] = None, - admin1_name: Optional[str] = None, - admin1_code: Optional[str] = None, - admin2_name: Optional[str] = None, - admin2_code: Optional[str] = None, hapi_updated_date_min: Optional[datetime.datetime | datetime.date] = None, hapi_updated_date_max: Optional[datetime.datetime | datetime.date] = None, - admin_level: Optional[AdminLevel] = None, ): logger.info(f'availability_view_list called with params: {locals()}') @@ -35,18 +30,12 @@ async def availability_view_list( if subcategory: query = case_insensitive_filter(query, AvailabilityView.subcategory, subcategory) - if location_code: - query = case_insensitive_filter(query, AvailabilityView.location_code, location_code) - if location_name: - query = query.where(AvailabilityView.location_name.icontains(location_name)) - if admin1_code: - query = case_insensitive_filter(query, AvailabilityView.admin1_code, admin1_code) - if admin1_name: - query = query.where(AvailabilityView.admin1_name.icontains(admin1_name)) - if admin2_code: - query = case_insensitive_filter(query, AvailabilityView.admin2_code, admin2_code) - if admin2_name: - query = query.where(AvailabilityView.admin2_name.icontains(admin2_name)) + query = apply_location_admin_filter( + query, + AvailabilityView, + common_location_params, + ) + if hapi_updated_date_min: query = query.where(AvailabilityView.hapi_updated_date >= hapi_updated_date_min) if hapi_updated_date_max: @@ -54,15 +43,15 @@ async def availability_view_list( # Admin level filtering. Filtering by admin level is handled differently for the data availability table # beause we don't have the adminX_is_unspecified fields. - if admin_level == AdminLevel.ZERO: - query = filter_is_unspecified(query, AvailabilityView.admin1_name) - query = filter_is_unspecified(query, AvailabilityView.admin2_name) - elif admin_level == AdminLevel.ONE: - query = filter_is_unspecified(query, AvailabilityView.admin1_name, negate=True) - query = filter_is_unspecified(query, AvailabilityView.admin2_name) - elif admin_level == AdminLevel.TWO: - query = filter_is_unspecified(query, AvailabilityView.admin1_name, negate=True) - query = filter_is_unspecified(query, AvailabilityView.admin2_name, negate=True) + # if admin_level == AdminLevel.ZERO: + # query = filter_is_unspecified(query, AvailabilityView.admin1_name) + # query = filter_is_unspecified(query, AvailabilityView.admin2_name) + # elif admin_level == AdminLevel.ONE: + # query = filter_is_unspecified(query, AvailabilityView.admin1_name, negate=True) + # query = filter_is_unspecified(query, AvailabilityView.admin2_name) + # elif admin_level == AdminLevel.TWO: + # query = filter_is_unspecified(query, AvailabilityView.admin1_name, negate=True) + # query = filter_is_unspecified(query, AvailabilityView.admin2_name, negate=True) query = apply_pagination(query, pagination_parameters) query = query.order_by( @@ -85,10 +74,10 @@ async def availability_view_list( return availabilities + def filter_is_unspecified(query: Select, column: Mapped[str], negate=False) -> Select: or_clause = or_(column == '', column.is_(None), column.ilike(_UNSPECIFIED)) if negate: return query.where(~or_clause) else: return query.where(or_clause) - \ No newline at end of file diff --git a/hdx_hapi/db/dao/poverty_rate_dao.py b/hdx_hapi/db/dao/poverty_rate_dao.py index bd1b7f70..32cbe29e 100644 --- a/hdx_hapi/db/dao/poverty_rate_dao.py +++ b/hdx_hapi/db/dao/poverty_rate_dao.py @@ -1,4 +1,5 @@ -from typing import Optional +import logging +from typing import Optional, Sequence from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select @@ -6,27 +7,36 @@ from hdx_hapi.db.models.views.vat_or_view import PovertyRateView from hdx_hapi.db.dao.util.util import ( apply_date_range_filter, + apply_location_admin_1_filter, apply_pagination, apply_reference_period_filter, - case_insensitive_filter, ) -from hdx_hapi.endpoints.util.util import CommonDateRangeParams, PaginationParams, ReferencePeriodParameters +from hdx_hapi.endpoints.util.util import ( + CommonDateRangeParams, + CommonLocationAdm1Parameters, + PaginationParams, + ReferencePeriodParameters, +) + +logger = logging.getLogger(__name__) async def poverty_rates_view_list( pagination_parameters: PaginationParams, common_date_range_params: CommonDateRangeParams, ref_period_parameters: Optional[ReferencePeriodParameters], + common_location_params: CommonLocationAdm1Parameters, db: AsyncSession, mpi_min: Optional[float] = None, mpi_max: Optional[float] = None, - location_ref: Optional[int] = None, - location_code: Optional[str] = None, - location_name: Optional[str] = None, has_hrp: Optional[bool] = None, in_gho: Optional[bool] = None, - provider_admin1_name: Optional[str] = None, -): +) -> Sequence[PovertyRateView]: + logger.info( + f'location_name={common_location_params.location_name}, ' + f'admin1_code={common_location_params.admin1_code}, admin1_name={common_location_params.admin1_name}, ' + f'ref_period_parameters={ref_period_parameters}, admin_level={common_location_params.admin_level}, ' + ) query = select(PovertyRateView) if mpi_min: @@ -39,21 +49,20 @@ async def poverty_rates_view_list( if in_gho is not None: query = query.where(PovertyRateView.in_gho == in_gho) - if location_ref: - query = query.where(PovertyRateView.location_ref == location_ref) - if location_code: - query = case_insensitive_filter(query, PovertyRateView.location_code, location_code) - if location_name: - query = query.where(PovertyRateView.location_name.icontains(location_name)) - if provider_admin1_name: - query = query.where(PovertyRateView.provider_admin1_name.icontains(provider_admin1_name)) - query = apply_date_range_filter( query, PovertyRateView, common_date_range_params, ) + query = apply_location_admin_1_filter( + query, + PovertyRateView, + common_location_params, + has_hrp, + in_gho, + ) + query = apply_reference_period_filter(query, ref_period_parameters, PovertyRateView) query = apply_pagination(query, pagination_parameters) diff --git a/hdx_hapi/db/dao/util/util.py b/hdx_hapi/db/dao/util/util.py index ef0263eb..bc6e8524 100644 --- a/hdx_hapi/db/dao/util/util.py +++ b/hdx_hapi/db/dao/util/util.py @@ -1,12 +1,13 @@ import datetime from typing import Optional, Protocol, Type -from sqlalchemy import Select, or_, and_ +from sqlalchemy import Select, or_ from sqlalchemy.orm import Mapped from hdx_hapi.config.config import get_config from hdx_hapi.endpoints.util.util import ( AdminLevel, CommonDateRangeParams, + CommonLocationAdm1Parameters, CommonLocationParameters, PaginationParams, ReferencePeriodParameters, @@ -89,74 +90,103 @@ class EntityWithLocationAdmin(Protocol): admin2_name: Mapped[str] provider_admin2_name: Mapped[str] admin2_is_unspecified: Mapped[bool] + admin_level: Mapped[int] -def apply_location_admin_filter( +def _apply_location_admin_filter( query: Select, db_class: Type[EntityWithLocationAdmin], - common_location_parameters: CommonLocationParameters, has_hrp: Optional[bool] = None, in_gho: Optional[bool] = None, + location_code: Optional[str] = None, + location_name: Optional[str] = None, + admin1_code: Optional[str] = None, + admin1_name: Optional[str] = None, + admin2_code: Optional[str] = None, + admin2_name: Optional[str] = None, + admin_level: Optional[AdminLevel] = None, ) -> Select: - location_ref = common_location_parameters.location_ref - location_code = common_location_parameters.location_code - location_name = common_location_parameters.location_name - admin1_ref = common_location_parameters.admin1_ref - admin1_code = common_location_parameters.admin1_code - admin1_name = common_location_parameters.admin1_name - provider_admin1_name = common_location_parameters.provider_admin1_name - admin2_ref = common_location_parameters.admin2_ref - admin2_code = common_location_parameters.admin2_code - admin2_name = common_location_parameters.admin2_name - provider_admin2_name = common_location_parameters.provider_admin2_name - admin_level = common_location_parameters.admin_level - - if location_ref: - query = query.where(db_class.location_ref == location_ref) if location_code: query = case_insensitive_filter(query, db_class.location_code, location_code) if location_name: query = query.where(db_class.location_name.icontains(location_name)) - if admin1_ref: - query = query.where(db_class.admin1_ref == admin1_ref) if admin1_code: query = case_insensitive_filter(query, db_class.admin1_code, admin1_code) if admin1_name: query = query.where(db_class.admin1_name.icontains(admin1_name)) - # if provider_admin1_name_is_unspecified: - # query = query.where(or_(db_class.provider_admin1_name == '', db_class.provider_admin1_name.is_(None))) - if provider_admin1_name: - query = query.where(db_class.provider_admin1_name.icontains(provider_admin1_name)) - if admin2_ref: - query = query.where(db_class.admin2_ref == admin2_ref) if admin2_code: query = case_insensitive_filter(query, db_class.admin2_code, admin2_code) if admin2_name: query = query.where(db_class.admin2_name.icontains(admin2_name)) - # if provider_admin2_name_is_unspecified: - # query = query.where(or_(db_class.provider_admin2_name == '', db_class.provider_admin2_name.is_(None))) - if provider_admin2_name: - query = query.where(db_class.provider_admin2_name.icontains(provider_admin2_name)) - # if admin1_is_unspecified is not None: - # query = query.where(db_class.admin1_is_unspecified == admin1_is_unspecified) - # if admin2_is_unspecified is not None: - # query = query.where(db_class.admin2_is_unspecified == admin2_is_unspecified) if has_hrp is not None: query = query.where(db_class.has_hrp == has_hrp) if in_gho is not None: query = query.where(db_class.in_gho == in_gho) - if AdminLevel.TWO == admin_level: - query = query.where(or_(db_class.admin2_is_unspecified == False, db_class.provider_admin2_name != '')) - elif AdminLevel.ONE == admin_level: - query = query.where(and_(db_class.admin2_is_unspecified == True, db_class.provider_admin2_name == '')) - query = query.where(or_(db_class.admin1_is_unspecified == False, db_class.provider_admin1_name != '')) - elif AdminLevel.ZERO == admin_level: - query = query.where(and_(db_class.admin1_is_unspecified == True, db_class.provider_admin1_name == '')) + if admin_level is not None: + query = query.where(db_class.admin_level == int(admin_level.value)) return query +def apply_location_admin_filter( + query: Select, + db_class: Type[EntityWithLocationAdmin], + common_location_parameters: CommonLocationParameters, + has_hrp: Optional[bool] = None, + in_gho: Optional[bool] = None, +) -> Select: + location_code = common_location_parameters.location_code + location_name = common_location_parameters.location_name + admin1_code = common_location_parameters.admin1_code + admin1_name = common_location_parameters.admin1_name + admin2_code = common_location_parameters.admin2_code + admin2_name = common_location_parameters.admin2_name + admin_level = common_location_parameters.admin_level + + return _apply_location_admin_filter( + query=query, + db_class=db_class, + has_hrp=has_hrp, + in_gho=in_gho, + location_code=location_code, + location_name=location_name, + admin1_code=admin1_code, + admin1_name=admin1_name, + admin2_code=admin2_code, + admin2_name=admin2_name, + admin_level=admin_level, + ) + + +def apply_location_admin_1_filter( + query: Select, + db_class: Type[EntityWithLocationAdmin], + common_location_parameters: CommonLocationAdm1Parameters, + has_hrp: Optional[bool] = None, + in_gho: Optional[bool] = None, +) -> Select: + location_code = common_location_parameters.location_code + location_name = common_location_parameters.location_name + admin1_code = common_location_parameters.admin1_code + admin1_name = common_location_parameters.admin1_name + admin_level = common_location_parameters.admin_level + + return _apply_location_admin_filter( + query=query, + db_class=db_class, + has_hrp=has_hrp, + in_gho=in_gho, + location_code=location_code, + location_name=location_name, + admin1_code=admin1_code, + admin1_name=admin1_name, + admin2_code=None, + admin2_name=None, + admin_level=admin_level, + ) + + def case_insensitive_filter(query: Select, column: Mapped[str], value: str) -> Select: query = query.where(column.ilike(value)) return query diff --git a/hdx_hapi/db/models/views/util/util.py b/hdx_hapi/db/models/views/util/util.py index 9bfb2fd8..3003bdae 100644 --- a/hdx_hapi/db/models/views/util/util.py +++ b/hdx_hapi/db/models/views/util/util.py @@ -5,6 +5,7 @@ # This is based on https://github.com/sqlalchemy/sqlalchemy/wiki/Views + class CreateView(DDLElement): def __init__(self, name, selectable): self.name = name @@ -41,7 +42,7 @@ def view(name, metadata, selectable): t = table(name) t._columns._populate_separate_keys( - col._make_proxy(t) for col in selectable.selected_columns + col._make_proxy(t, primary_key=set(), foreign_keys=set()) for col in selectable.selected_columns ) sa.event.listen( @@ -49,7 +50,5 @@ def view(name, metadata, selectable): 'after_create', CreateView(name, selectable).execute_if(callable_=view_doesnt_exist), ) - sa.event.listen( - metadata, 'before_drop', DropView(name).execute_if(callable_=view_exists) - ) - return t \ No newline at end of file + sa.event.listen(metadata, 'before_drop', DropView(name).execute_if(callable_=view_exists)) + return t diff --git a/hdx_hapi/endpoints/get_data_availability.py b/hdx_hapi/endpoints/get_data_availability.py index aeaf09e9..b46fe922 100644 --- a/hdx_hapi/endpoints/get_data_availability.py +++ b/hdx_hapi/endpoints/get_data_availability.py @@ -5,16 +5,6 @@ from sqlalchemy.ext.asyncio import AsyncSession from hdx_hapi.config.doc_snippets import ( - DOC_ADMIN_LEVEL_FILTER, - DOC_LOCATION_NAME, - DOC_LOCATION_CODE, - DOC_SEE_LOC, - DOC_ADMIN1_NAME, - DOC_ADMIN1_CODE, - DOC_SEE_ADMIN1, - DOC_ADMIN2_NAME, - DOC_ADMIN2_CODE, - DOC_SEE_ADMIN2, DOC_UPDATE_DATE_MIN, DOC_UPDATE_DATE_MAX, ) @@ -23,9 +13,10 @@ from hdx_hapi.endpoints.models.availability import AvailabilityResponse from hdx_hapi.endpoints.models.error import ERROR_RESPONSES from hdx_hapi.endpoints.util.util import ( - AdminLevel, CommonEndpointParams, + CommonLocationParameters, common_endpoint_parameters, + common_location_parameters, ) from hdx_hapi.services.csv_transform_logic import transform_result_to_csv_stream_if_requested @@ -51,6 +42,7 @@ @router.get('/api/v2/metadata/data-availability', **ROUTER_DICT) async def get_data_availability( common_parameters: Annotated[CommonEndpointParams, Depends(common_endpoint_parameters)], + common_location_params: Annotated[CommonLocationParameters, Depends(common_location_parameters)], db: AsyncSession = Depends(get_db), category: Annotated[ Optional[str], Query(max_length=128, description='Filter the response by a data category') @@ -58,24 +50,24 @@ async def get_data_availability( subcategory: Annotated[ Optional[str], Query(max_length=128, description='Filter the response by a data subcategory') ] = None, - location_code: Annotated[ - Optional[str], Query(max_length=128, description=f'{DOC_LOCATION_CODE} {DOC_SEE_LOC}') - ] = None, - location_name: Annotated[ - Optional[str], Query(max_length=512, description=f'{DOC_LOCATION_NAME} {DOC_SEE_LOC}') - ] = None, - admin1_code: Annotated[ - Optional[str], Query(max_length=128, description=f'{DOC_ADMIN1_CODE} {DOC_SEE_ADMIN1}') - ] = None, - admin1_name: Annotated[ - Optional[str], Query(max_length=512, description=f'{DOC_ADMIN1_NAME} {DOC_SEE_ADMIN1}') - ] = None, - admin2_code: Annotated[ - Optional[str], Query(max_length=128, description=f'{DOC_ADMIN2_CODE} {DOC_SEE_ADMIN2}') - ] = None, - admin2_name: Annotated[ - Optional[str], Query(max_length=512, description=f'{DOC_ADMIN2_NAME} {DOC_SEE_ADMIN2}') - ] = None, + # location_code: Annotated[ + # Optional[str], Query(max_length=128, description=f'{DOC_LOCATION_CODE} {DOC_SEE_LOC}') + # ] = None, + # location_name: Annotated[ + # Optional[str], Query(max_length=512, description=f'{DOC_LOCATION_NAME} {DOC_SEE_LOC}') + # ] = None, + # admin1_code: Annotated[ + # Optional[str], Query(max_length=128, description=f'{DOC_ADMIN1_CODE} {DOC_SEE_ADMIN1}') + # ] = None, + # admin1_name: Annotated[ + # Optional[str], Query(max_length=512, description=f'{DOC_ADMIN1_NAME} {DOC_SEE_ADMIN1}') + # ] = None, + # admin2_code: Annotated[ + # Optional[str], Query(max_length=128, description=f'{DOC_ADMIN2_CODE} {DOC_SEE_ADMIN2}') + # ] = None, + # admin2_name: Annotated[ + # Optional[str], Query(max_length=512, description=f'{DOC_ADMIN2_NAME} {DOC_SEE_ADMIN2}') + # ] = None, hapi_updated_date_min: Annotated[ Optional[datetime.datetime | datetime.date], Query(description=f'{DOC_UPDATE_DATE_MIN}'), @@ -84,24 +76,18 @@ async def get_data_availability( Optional[datetime.datetime | datetime.date], Query(description=f'{DOC_UPDATE_DATE_MAX}'), ] = None, - admin_level: Annotated[Optional[AdminLevel], Query(description=f'{DOC_ADMIN_LEVEL_FILTER}')] = None, + # admin_level: Annotated[Optional[AdminLevel], Query(description=f'{DOC_ADMIN_LEVEL_FILTER}')] = None, ): """ Provide currency information to use in conjunction with the food-prices endpoint """ result = await get_availability_srv( pagination_parameters=common_parameters, + common_location_params=common_location_params, db=db, category=category, subcategory=subcategory, - location_name=location_name, - location_code=location_code, - admin1_name=admin1_name, - admin1_code=admin1_code, - admin2_name=admin2_name, - admin2_code=admin2_code, hapi_updated_date_min=hapi_updated_date_min, hapi_updated_date_max=hapi_updated_date_max, - admin_level=admin_level, ) return transform_result_to_csv_stream_if_requested(result, common_parameters.output_format, AvailabilityResponse) diff --git a/hdx_hapi/endpoints/get_poverty_rate.py b/hdx_hapi/endpoints/get_poverty_rate.py index 826ba71f..edea9dd8 100644 --- a/hdx_hapi/endpoints/get_poverty_rate.py +++ b/hdx_hapi/endpoints/get_poverty_rate.py @@ -9,11 +9,6 @@ from hdx_hapi.config.doc_snippets import ( DOC_LOCATION_HAS_HRP, DOC_LOCATION_IN_GHO, - DOC_LOCATION_REF, - DOC_LOCATION_CODE, - DOC_LOCATION_NAME, - DOC_SEE_LOC, - DOC_PROVIDER_ADMIN1_NAME, ) from hdx_hapi.endpoints.models.base import HapiGenericResponse @@ -22,8 +17,10 @@ from hdx_hapi.endpoints.util.util import ( CommonDateRangeParams, CommonEndpointParams, + CommonLocationAdm1Parameters, common_date_range_params, common_endpoint_parameters, + common_location_adm1_parameters, ) from hdx_hapi.services.csv_transform_logic import transform_result_to_csv_stream_if_requested from hdx_hapi.services.poverty_rate_logic import get_poverty_rates_srv @@ -49,38 +46,36 @@ @router.get('/api/v2/food-security-nutrition-poverty/poverty-rate', **ROUTER_DICT) async def get_poverty_rate( common_date_range_params: Annotated[CommonDateRangeParams, Depends(common_date_range_params)], + common_location_params: Annotated[CommonLocationAdm1Parameters, Depends(common_location_adm1_parameters)], common_parameters: Annotated[CommonEndpointParams, Depends(common_endpoint_parameters)], # ref_period_parameters: Annotated[ReferencePeriodParameters, Depends(reference_period_parameters)], db: AsyncSession = Depends(get_db), mpi_min: Annotated[Optional[float], Query(description='Multidimensional Poverty Index (MPI), lower bound.')] = None, mpi_max: Annotated[Optional[float], Query(description='Multidimensional Poverty Index (MPI), upper bound.')] = None, - location_ref: Annotated[Optional[int], Query(description=f'{DOC_LOCATION_REF}')] = None, - location_code: Annotated[ - Optional[str], Query(max_length=128, description=f'{DOC_LOCATION_CODE} {DOC_SEE_LOC}') - ] = None, - location_name: Annotated[ - Optional[str], Query(max_length=512, description=f'{DOC_LOCATION_NAME} {DOC_SEE_LOC}') - ] = None, + # location_ref: Annotated[Optional[int], Query(description=f'{DOC_LOCATION_REF}')] = None, + # location_code: Annotated[ + # Optional[str], Query(max_length=128, description=f'{DOC_LOCATION_CODE} {DOC_SEE_LOC}') + # ] = None, + # location_name: Annotated[ + # Optional[str], Query(max_length=512, description=f'{DOC_LOCATION_NAME} {DOC_SEE_LOC}') + # ] = None, has_hrp: Annotated[Optional[bool], Query(description=f'{DOC_LOCATION_HAS_HRP}')] = None, in_gho: Annotated[Optional[bool], Query(description=f'{DOC_LOCATION_IN_GHO}')] = None, - provider_admin1_name: Annotated[ - Optional[str], Query(max_length=512, description=f'{DOC_PROVIDER_ADMIN1_NAME}') - ] = None, + # provider_admin1_name: Annotated[ + # Optional[str], Query(max_length=512, description=f'{DOC_PROVIDER_ADMIN1_NAME}') + # ] = None, ): ref_period_parameters = None result = await get_poverty_rates_srv( common_date_range_params=common_date_range_params, pagination_parameters=common_parameters, ref_period_parameters=ref_period_parameters, + common_location_params=common_location_params, db=db, mpi_min=mpi_min, mpi_max=mpi_max, - location_ref=location_ref, - location_code=location_code, - location_name=location_name, has_hrp=has_hrp, in_gho=in_gho, - provider_admin1_name=provider_admin1_name, ) return transform_result_to_csv_stream_if_requested(result, common_parameters.output_format, PovertyRateResponse) diff --git a/hdx_hapi/endpoints/models/availability.py b/hdx_hapi/endpoints/models/availability.py index b34b25ee..ca482c1a 100644 --- a/hdx_hapi/endpoints/models/availability.py +++ b/hdx_hapi/endpoints/models/availability.py @@ -1,42 +1,14 @@ import datetime -from typing import Optional, Self -from pydantic import ConfigDict, Field, model_validator -from hdx_hapi.endpoints.models.base import HapiBaseModel -from hdx_hapi.config.doc_snippets import ( - truncate_query_description, - DOC_LOCATION_CODE, - DOC_LOCATION_NAME, - DOC_ADMIN1_CODE, - DOC_ADMIN1_NAME, - DOC_ADMIN2_CODE, - DOC_ADMIN2_NAME, -) +from typing import Optional +from pydantic import ConfigDict, Field +from hdx_hapi.endpoints.models.base import HapiBaseModel, HapiModelWithAdmins -class AvailabilityResponse(HapiBaseModel): +class AvailabilityResponse(HapiBaseModel, HapiModelWithAdmins): category: str = Field(max_length=32, description='HAPI category') subcategory: str = Field(max_length=512, description='HAPI subcategory') - location_code: str = Field(max_length=128, description=truncate_query_description(DOC_LOCATION_CODE)) - location_name: str = Field(max_length=512, description=truncate_query_description(DOC_LOCATION_NAME)) - admin1_code: Optional[str] = Field(max_length=128, description=truncate_query_description(DOC_ADMIN1_CODE)) - admin1_name: Optional[str] = Field(max_length=512, description=truncate_query_description(DOC_ADMIN1_NAME)) - admin2_code: Optional[str] = Field(max_length=128, description=truncate_query_description(DOC_ADMIN2_CODE)) - admin2_name: Optional[str] = Field(max_length=512, description=truncate_query_description(DOC_ADMIN2_NAME)) hapi_updated_date: Optional[datetime.datetime] = Field( description='Date that dataset was last updated, e.g. 2020-01-01 or 2020-01-01T00:00:00' ) model_config = ConfigDict(from_attributes=True) - - @model_validator(mode='after') - def set_admin1_admin2_null(self) -> Self: - - if not self.admin1_name or self.admin1_name.upper() == 'UNSPECIFIED': - self.admin1_code = None - self.admin1_name = None - - if not self.admin2_name or self.admin2_name.upper() == 'UNSPECIFIED': - self.admin2_code = None - self.admin2_name = None - - return self diff --git a/hdx_hapi/endpoints/models/base.py b/hdx_hapi/endpoints/models/base.py index 462bacc8..3fdf5a65 100644 --- a/hdx_hapi/endpoints/models/base.py +++ b/hdx_hapi/endpoints/models/base.py @@ -4,18 +4,20 @@ from hdx_hapi.config.doc_snippets import ( DOC_LOCATION_CODE, - DOC_LOCATION_REF, + # DOC_LOCATION_REF, DOC_LOCATION_NAME, - DOC_ADMIN1_REF, + # DOC_ADMIN1_REF, DOC_ADMIN1_NAME, DOC_ADMIN1_CODE, - DOC_PROVIDER_ADMIN1_NAME, - DOC_ADMIN2_REF, + # DOC_PROVIDER_ADMIN1_NAME, + # DOC_ADMIN2_REF, DOC_ADMIN2_NAME, DOC_ADMIN2_CODE, - DOC_PROVIDER_ADMIN2_NAME, + # DOC_PROVIDER_ADMIN2_NAME, + DOC_ADMIN_LEVEL_FILTER, truncate_query_description, ) +from hdx_hapi.endpoints.models.util.constants import AdminLevelInt class HapiBaseModel(BaseModel): @@ -23,38 +25,70 @@ def list_of_fields(self) -> List[str]: return list(self.model_fields.keys()) -class HapiModelWithAdmins(BaseModel): - location_ref: int = Field(description=truncate_query_description(DOC_LOCATION_REF)) +class HapiModelWithAdmin1(BaseModel): location_code: str = Field(max_length=128, description=truncate_query_description(DOC_LOCATION_CODE)) location_name: str = Field(max_length=512, description=truncate_query_description(DOC_LOCATION_NAME)) - admin1_is_unspecified: bool = Field(exclude=True) - admin2_is_unspecified: bool = Field(exclude=True) + admin1_code: Optional[str] = Field(max_length=128, description=truncate_query_description(DOC_ADMIN1_CODE)) + admin1_name: Optional[str] = Field(max_length=512, description=truncate_query_description(DOC_ADMIN1_NAME)) + + provider_admin1_name: Optional[str] = Field(exclude=True, max_length=512) + + admin_level: int = Field(description=truncate_query_description(DOC_ADMIN_LEVEL_FILTER)) + + @model_validator(mode='after') # type: ignore + def set_admin1_name(self) -> Self: + # If 'admin1_name' is None, set 'admin1_name' is set to _provider_admin1_name + if (not self.admin1_name or self.admin1_name.lower() == 'unspecified') and self.provider_admin1_name: + self.admin1_name = self.provider_admin1_name + + return self - admin1_ref: int = Field(description=truncate_query_description(DOC_ADMIN1_REF)) + @model_validator(mode='after') # type: ignore + def set_admin1_admin2_null(self) -> Self: + if self.admin_level is not None: + if self.admin_level == AdminLevelInt.ZERO: + self.admin1_code = None + self.admin1_name = None + return self + + +class HapiModelWithAdmins(BaseModel): + location_code: str = Field(max_length=128, description=truncate_query_description(DOC_LOCATION_CODE)) + location_name: str = Field(max_length=512, description=truncate_query_description(DOC_LOCATION_NAME)) admin1_code: Optional[str] = Field(max_length=128, description=truncate_query_description(DOC_ADMIN1_CODE)) admin1_name: Optional[str] = Field(max_length=512, description=truncate_query_description(DOC_ADMIN1_NAME)) - provider_admin1_name: str = Field(max_length=512, description=truncate_query_description(DOC_PROVIDER_ADMIN1_NAME)) - admin2_ref: int = Field(description=truncate_query_description(DOC_ADMIN2_REF)) admin2_code: Optional[str] = Field(max_length=128, description=truncate_query_description(DOC_ADMIN2_CODE)) admin2_name: Optional[str] = Field(max_length=512, description=truncate_query_description(DOC_ADMIN2_NAME)) - provider_admin2_name: str = Field(max_length=512, description=truncate_query_description(DOC_PROVIDER_ADMIN2_NAME)) + + provider_admin1_name: Optional[str] = Field(exclude=True, default=None, max_length=512) + provider_admin2_name: Optional[str] = Field(exclude=True, default=None, max_length=512) + + admin_level: int = Field(description=truncate_query_description(DOC_ADMIN_LEVEL_FILTER)) @model_validator(mode='after') # type: ignore - def set_admin1_admin2_null(self) -> Self: - admin1_is_unspecified = self.admin1_is_unspecified - admin2_is_unspecified = self.admin2_is_unspecified + def set_admin1_admin2_name(self) -> Self: + # If 'admin1_name' is None, set 'admin1_name' is set to _provider_admin1_name + if (not self.admin1_name or self.admin1_name.lower() == 'unspecified') and self.provider_admin1_name: + self.admin1_name = self.provider_admin1_name - # If 'admin1_is_unspecified' is True, set 'admin1_code' and 'admin1_name' to None - if admin1_is_unspecified: - self.admin1_code = None - self.admin1_name = None + # If 'admin2_name' is None, set 'admin2_name' is set to _provider_admin2_name + if (not self.admin2_name or self.admin2_name.lower() == 'unspecified') and self.provider_admin2_name: + self.admin2_name = self.provider_admin2_name - # If 'admin2_is_unspecified' is True, set 'admin2_code' and 'admin2_name' to None - if admin2_is_unspecified: - self.admin2_code = None - self.admin2_name = None + return self + @model_validator(mode='after') # type: ignore + def set_admin1_admin2_null(self) -> Self: + if self.admin_level is not None: + if self.admin_level == AdminLevelInt.ZERO: + self.admin1_code = None + self.admin1_name = None + self.admin2_code = None + self.admin2_name = None + if self.admin_level == AdminLevelInt.ONE: + self.admin2_code = None + self.admin2_name = None return self diff --git a/hdx_hapi/endpoints/models/funding.py b/hdx_hapi/endpoints/models/funding.py index d37d6f34..27ec1105 100644 --- a/hdx_hapi/endpoints/models/funding.py +++ b/hdx_hapi/endpoints/models/funding.py @@ -7,7 +7,6 @@ DOC_HDX_RESOURCE_ID, DOC_LOCATION_CODE, DOC_LOCATION_NAME, - DOC_LOCATION_REF, DOC_REFERENCE_PERIOD_END, DOC_REFERENCE_PERIOD_START, truncate_query_description, @@ -29,7 +28,6 @@ class FundingResponse(HapiBaseModel): description='The percentage of required funding received by the appeal' ) - location_ref: int = Field(description=truncate_query_description(DOC_LOCATION_REF)) location_code: str = Field(max_length=128, description=truncate_query_description(DOC_LOCATION_CODE)) location_name: str = Field(max_length=512, description=truncate_query_description(DOC_LOCATION_NAME)) diff --git a/hdx_hapi/endpoints/models/national_risk.py b/hdx_hapi/endpoints/models/national_risk.py index 19d55f78..3be29250 100644 --- a/hdx_hapi/endpoints/models/national_risk.py +++ b/hdx_hapi/endpoints/models/national_risk.py @@ -11,7 +11,6 @@ DOC_REFERENCE_PERIOD_END, DOC_REFERENCE_PERIOD_START, DOC_RISK_CLASS, - DOC_LOCATION_REF, truncate_query_description, ) from hdx_hapi.endpoints.models.base import HapiBaseModel @@ -72,14 +71,7 @@ class NationalRiskResponse(HapiBaseModel): reference_period_start: Optional[datetime.datetime] = Field(description=DOC_REFERENCE_PERIOD_START) reference_period_end: Optional[datetime.datetime] = Field(description=DOC_REFERENCE_PERIOD_END) - # dataset_hdx_stub: str = Field(max_length=128) - # dataset_hdx_provider_stub: str = Field(max_length=128) resource_hdx_id: str = Field(max_length=36, description=truncate_query_description(DOC_HDX_RESOURCE_ID)) - # hapi_updated_date: datetime - # hapi_replaced_date: Optional[datetime] - - # sector_name: str = Field(max_length=512) - location_ref: int = Field(description=truncate_query_description(DOC_LOCATION_REF)) location_code: str = Field(max_length=128, description=truncate_query_description(DOC_LOCATION_CODE)) location_name: str = Field(max_length=512, description=truncate_query_description(DOC_LOCATION_NAME)) diff --git a/hdx_hapi/endpoints/models/operational_presence.py b/hdx_hapi/endpoints/models/operational_presence.py index 8156e61d..1dac99fa 100644 --- a/hdx_hapi/endpoints/models/operational_presence.py +++ b/hdx_hapi/endpoints/models/operational_presence.py @@ -13,7 +13,6 @@ class OperationalPresenceResponse(HapiBaseModel, HapiModelWithAdmins): - # dataset_hdx_stub: str = Field(max_length=128) resource_hdx_id: str = Field(max_length=36, description=truncate_query_description(DOC_HDX_RESOURCE_ID)) org_acronym: str = Field(max_length=32, description='The organization acronym') org_name: str = Field(max_length=512, description='The organization name') diff --git a/hdx_hapi/endpoints/models/population.py b/hdx_hapi/endpoints/models/population.py index cc6d2c2b..6571e22f 100644 --- a/hdx_hapi/endpoints/models/population.py +++ b/hdx_hapi/endpoints/models/population.py @@ -3,7 +3,6 @@ from typing import Optional from hdx_hapi.config.doc_snippets import ( - DOC_ADMIN2_REF, DOC_GENDER, DOC_AGE_RANGE, DOC_HDX_RESOURCE_ID, @@ -17,16 +16,13 @@ class PopulationResponse(HapiBaseModel, HapiModelWithAdmins): resource_hdx_id: str = Field(max_length=36, description=truncate_query_description(DOC_HDX_RESOURCE_ID)) - admin2_ref: int = Field(description=truncate_query_description(DOC_ADMIN2_REF)) - gender: Gender = Field(description=truncate_query_description(DOC_GENDER)) age_range: str = Field(max_length=32, description=truncate_query_description(DOC_AGE_RANGE)) min_age: Optional[int] = Field( ge=0, description=( - 'The minimum age from `age_range`, set to `null` if `age_range` is "all" and ' - 'there is no age disaggregation' + 'The minimum age from `age_range`, set to `null` if `age_range` is "all" and there is no age disaggregation' ), ) max_age: Optional[int] = Field( diff --git a/hdx_hapi/endpoints/models/poverty_rate.py b/hdx_hapi/endpoints/models/poverty_rate.py index 0f3914ef..d41b6ee4 100644 --- a/hdx_hapi/endpoints/models/poverty_rate.py +++ b/hdx_hapi/endpoints/models/poverty_rate.py @@ -3,19 +3,15 @@ from typing import Optional from hdx_hapi.config.doc_snippets import ( - DOC_ADMIN1_NAME, DOC_HDX_RESOURCE_ID, - DOC_LOCATION_CODE, - DOC_LOCATION_NAME, DOC_REFERENCE_PERIOD_END, DOC_REFERENCE_PERIOD_START, - DOC_LOCATION_REF, truncate_query_description, ) -from hdx_hapi.endpoints.models.base import HapiBaseModel +from hdx_hapi.endpoints.models.base import HapiBaseModel, HapiModelWithAdmin1 -class PovertyRateResponse(HapiBaseModel): +class PovertyRateResponse(HapiBaseModel, HapiModelWithAdmin1): resource_hdx_id: str = Field(max_length=36, description=truncate_query_description(DOC_HDX_RESOURCE_ID)) mpi: float = Field( @@ -35,9 +31,4 @@ class PovertyRateResponse(HapiBaseModel): reference_period_start: Optional[datetime.datetime] = Field(description=DOC_REFERENCE_PERIOD_START) reference_period_end: Optional[datetime.datetime] = Field(description=DOC_REFERENCE_PERIOD_END) - location_ref: int = Field(description=truncate_query_description(DOC_LOCATION_REF)) - location_code: str = Field(max_length=128, description=truncate_query_description(DOC_LOCATION_CODE)) - location_name: str = Field(max_length=512, description=truncate_query_description(DOC_LOCATION_NAME)) - provider_admin1_name: Optional[str] = Field(max_length=512, description=truncate_query_description(DOC_ADMIN1_NAME)) - model_config = ConfigDict(from_attributes=True) diff --git a/hdx_hapi/endpoints/models/refugees.py b/hdx_hapi/endpoints/models/refugees.py index b4915455..5a68c359 100644 --- a/hdx_hapi/endpoints/models/refugees.py +++ b/hdx_hapi/endpoints/models/refugees.py @@ -17,20 +17,19 @@ class RefugeesResponse(HapiBaseModel): resource_hdx_id: str = Field(max_length=36, description=truncate_query_description(DOC_HDX_RESOURCE_ID)) - origin_location_ref: int = Field( - description='An internal, stable identifier that references the location of origin' - ) - asylum_location_ref: int = Field( - description='An internal, stable identifier that references the location of asylum' - ) + # origin_location_ref: int = Field( + # description='An internal, stable identifier that references the location of origin' + # ) + # asylum_location_ref: int = Field( + # description='An internal, stable identifier that references the location of asylum' + # ) population_group: PopulationGroup = Field(description=truncate_query_description(DOC_POPULATION_GROUP)) gender: Gender = Field(description=truncate_query_description(DOC_GENDER)) age_range: str = Field(max_length=32, description=truncate_query_description(DOC_AGE_RANGE)) min_age: Optional[int] = Field( ge=0, description=( - 'The minimum age from `age_range`, set to `null` if `age_range` is "all" and ' - 'there is no age disaggregation' + 'The minimum age from `age_range`, set to `null` if `age_range` is "all" and there is no age disaggregation' ), ) max_age: Optional[int] = Field( diff --git a/hdx_hapi/endpoints/models/returnees.py b/hdx_hapi/endpoints/models/returnees.py index 1ae03ef4..b81bb832 100644 --- a/hdx_hapi/endpoints/models/returnees.py +++ b/hdx_hapi/endpoints/models/returnees.py @@ -9,7 +9,6 @@ DOC_HDX_RESOURCE_ID, DOC_REFERENCE_PERIOD_START, DOC_REFERENCE_PERIOD_END, - DOC_LOCATION_REF, DOC_AGE_RANGE, DOC_LOCATION_NAME, DOC_LOCATION_CODE, @@ -20,16 +19,15 @@ class ReturneesResponse(HapiBaseModel): resource_hdx_id: str = Field(max_length=36, description=truncate_query_description(DOC_HDX_RESOURCE_ID)) - origin_location_ref: int = Field(description=truncate_query_description(DOC_LOCATION_REF)) - asylum_location_ref: int = Field(description=truncate_query_description(DOC_LOCATION_REF)) + # origin_location_ref: int = Field(description=truncate_query_description(DOC_LOCATION_REF)) + # asylum_location_ref: int = Field(description=truncate_query_description(DOC_LOCATION_REF)) population_group: PopulationGroup = Field(description=truncate_query_description(DOC_POPULATION_GROUP)) gender: Gender = Field(description=truncate_query_description(DOC_GENDER)) age_range: str = Field(max_length=32, description=truncate_query_description(DOC_AGE_RANGE)) min_age: Optional[int] = Field( ge=0, description=( - 'The minimum age from `age_range`, set to `null` if `age_range` is "all" and ' - 'there is no age disaggregation' + 'The minimum age from `age_range`, set to `null` if `age_range` is "all" and there is no age disaggregation' ), ) max_age: Optional[int] = Field( diff --git a/hdx_hapi/endpoints/models/util/constants.py b/hdx_hapi/endpoints/models/util/constants.py index 2e1df41c..72fcd039 100644 --- a/hdx_hapi/endpoints/models/util/constants.py +++ b/hdx_hapi/endpoints/models/util/constants.py @@ -2,6 +2,7 @@ from typing import Annotated from fastapi import Query from pydantic import Field, PlainSerializer +from enum import Enum PERCENTAGE_TYPE = Field(ge=0, le=100) @@ -9,3 +10,9 @@ NON_NEGATIVE_DECIMAL_TYPE = Annotated[ Decimal, PlainSerializer(lambda x: float(x), return_type=Annotated[float, Query(ge=0)]) ] + + +class AdminLevelInt(int, Enum): + ZERO = 0 + ONE = 1 + TWO = 2 diff --git a/hdx_hapi/endpoints/util/util.py b/hdx_hapi/endpoints/util/util.py index 12f53a81..5cd7957f 100644 --- a/hdx_hapi/endpoints/util/util.py +++ b/hdx_hapi/endpoints/util/util.py @@ -7,20 +7,15 @@ from hdx_hapi.config.doc_snippets import ( DOC_ADMIN_LEVEL_FILTER, - DOC_ADMIN1_REF, DOC_ADMIN1_CODE, DOC_ADMIN1_NAME, - DOC_ADMIN2_REF, DOC_ADMIN2_NAME, DOC_ADMIN2_CODE, - DOC_LOCATION_REF, DOC_LOCATION_CODE, DOC_LOCATION_NAME, DOC_SEE_ADMIN1, DOC_SEE_LOC, DOC_SEE_ADMIN2, - DOC_PROVIDER_ADMIN1_NAME, - DOC_PROVIDER_ADMIN2_NAME, ) from hdx_hapi.endpoints.util.exceptions import RequestParamsValidationError @@ -119,6 +114,16 @@ async def reference_period_parameters( ) +class CommonLocationAdm1Parameters(BaseModel): + location_code: Optional[str] = None + location_name: Optional[str] = None + admin1_code: Optional[str] = None + admin1_name: Optional[str] = None + admin_level: Optional[AdminLevel] = None + + model_config = ConfigDict(frozen=True) + + class CommonLocationParameters(BaseModel): location_code: Optional[str] = None location_name: Optional[str] = None @@ -153,41 +158,65 @@ async def common_location_parameters( location_name: Annotated[ Optional[str], Query(max_length=512, description=f'{DOC_LOCATION_NAME} {DOC_SEE_LOC}') ] = None, - location_ref: Annotated[Optional[int], Query(description=f'{DOC_LOCATION_REF}')] = None, + # location_ref: Annotated[Optional[int], Query(description=f'{DOC_LOCATION_REF}')] = None, admin1_code: Annotated[ Optional[str], Query(max_length=128, description=f'{DOC_ADMIN1_CODE} {DOC_SEE_ADMIN1}') ] = None, admin1_name: Annotated[ Optional[str], Query(max_length=512, description=f'{DOC_ADMIN1_NAME} {DOC_SEE_ADMIN1}') ] = None, - admin1_ref: Annotated[Optional[int], Query(description=f'{DOC_ADMIN1_REF}')] = None, - provider_admin1_name: Annotated[ - Optional[str], Query(max_length=512, description=f'{DOC_PROVIDER_ADMIN1_NAME}') - ] = None, + # admin1_ref: Annotated[Optional[int], Query(description=f'{DOC_ADMIN1_REF}')] = None, + # provider_admin1_name: Annotated[ + # Optional[str], Query(max_length=512, description=f'{DOC_PROVIDER_ADMIN1_NAME}') + # ] = None, admin2_code: Annotated[ Optional[str], Query(max_length=128, description=f'{DOC_ADMIN2_CODE} {DOC_SEE_ADMIN2}') ] = None, admin2_name: Annotated[ Optional[str], Query(max_length=512, description=f'{DOC_ADMIN2_NAME} {DOC_SEE_ADMIN2}') ] = None, - admin2_ref: Annotated[Optional[int], Query(description=f'{DOC_ADMIN2_REF}')] = None, - provider_admin2_name: Annotated[ - Optional[str], Query(max_length=512, description=f'{DOC_PROVIDER_ADMIN2_NAME}') - ] = None, + # admin2_ref: Annotated[Optional[int], Query(description=f'{DOC_ADMIN2_REF}')] = None, + # provider_admin2_name: Annotated[ + # Optional[str], Query(max_length=512, description=f'{DOC_PROVIDER_ADMIN2_NAME}') + # ] = None, admin_level: Annotated[Optional[AdminLevel], Query(description=DOC_ADMIN_LEVEL_FILTER)] = None, ) -> CommonLocationParameters: return CommonLocationParameters( location_code=location_code, location_name=location_name, - location_ref=location_ref, + # location_ref=location_ref, admin1_code=admin1_code, admin1_name=admin1_name, - admin1_ref=admin1_ref, - provider_admin1_name=provider_admin1_name, + # admin1_ref=admin1_ref, + # provider_admin1_name=provider_admin1_name, admin2_code=admin2_code, admin2_name=admin2_name, - admin2_ref=admin2_ref, - provider_admin2_name=provider_admin2_name, + # admin2_ref=admin2_ref, + # provider_admin2_name=provider_admin2_name, + admin_level=admin_level, + ) + + +async def common_location_adm1_parameters( + location_code: Annotated[ + Optional[str], Query(max_length=128, description=f'{DOC_LOCATION_CODE} {DOC_SEE_LOC}') + ] = None, + location_name: Annotated[ + Optional[str], Query(max_length=512, description=f'{DOC_LOCATION_NAME} {DOC_SEE_LOC}') + ] = None, + admin1_code: Annotated[ + Optional[str], Query(max_length=128, description=f'{DOC_ADMIN1_CODE} {DOC_SEE_ADMIN1}') + ] = None, + admin1_name: Annotated[ + Optional[str], Query(max_length=512, description=f'{DOC_ADMIN1_NAME} {DOC_SEE_ADMIN1}') + ] = None, + admin_level: Annotated[Optional[AdminLevel], Query(description=DOC_ADMIN_LEVEL_FILTER)] = None, +) -> CommonLocationAdm1Parameters: + return CommonLocationAdm1Parameters( + location_code=location_code, + location_name=location_name, + admin1_code=admin1_code, + admin1_name=admin1_name, admin_level=admin_level, ) diff --git a/hdx_hapi/services/availability_logic.py b/hdx_hapi/services/availability_logic.py index 953e96b5..0c453932 100644 --- a/hdx_hapi/services/availability_logic.py +++ b/hdx_hapi/services/availability_logic.py @@ -7,37 +7,24 @@ from hdx_hapi.db.dao.availability_view_dao import availability_view_list from hdx_hapi.db.models.views.all_views import AvailabilityView -from hdx_hapi.endpoints.util.util import AdminLevel, PaginationParams +from hdx_hapi.endpoints.util.util import CommonLocationParameters, PaginationParams async def get_availability_srv( pagination_parameters: PaginationParams, + common_location_params: CommonLocationParameters, db: AsyncSession, category: Optional[str] = None, subcategory: Optional[str] = None, - location_name: Optional[str] = None, - location_code: Optional[str] = None, - admin1_name: Optional[str] = None, - admin1_code: Optional[str] = None, - admin2_name: Optional[str] = None, - admin2_code: Optional[str] = None, hapi_updated_date_min: Optional[datetime.datetime | datetime.date] = None, hapi_updated_date_max: Optional[datetime.datetime | datetime.date] = None, - admin_level: Optional[AdminLevel] = None, ) -> Union[Sequence[AvailabilityView], Sequence[DBAvailabilityVAT]]: - return await availability_view_list( pagination_parameters=pagination_parameters, db=db, category=category, subcategory=subcategory, - location_name=location_name, - location_code=location_code, - admin1_name=admin1_name, - admin1_code=admin1_code, - admin2_name=admin2_name, - admin2_code=admin2_code, + common_location_params=common_location_params, hapi_updated_date_min=hapi_updated_date_min, hapi_updated_date_max=hapi_updated_date_max, - admin_level=admin_level, ) diff --git a/hdx_hapi/services/poverty_rate_logic.py b/hdx_hapi/services/poverty_rate_logic.py index 0d3a9151..56f0fa3f 100644 --- a/hdx_hapi/services/poverty_rate_logic.py +++ b/hdx_hapi/services/poverty_rate_logic.py @@ -3,34 +3,33 @@ from hdx_hapi.db.models.views.all_views import PovertyRateView from hdx_hapi.db.dao.poverty_rate_dao import poverty_rates_view_list -from hdx_hapi.endpoints.util.util import CommonDateRangeParams, PaginationParams, ReferencePeriodParameters +from hdx_hapi.endpoints.util.util import ( + CommonDateRangeParams, + CommonLocationAdm1Parameters, + PaginationParams, + ReferencePeriodParameters, +) async def get_poverty_rates_srv( common_date_range_params: CommonDateRangeParams, pagination_parameters: PaginationParams, + common_location_params: CommonLocationAdm1Parameters, ref_period_parameters: Optional[ReferencePeriodParameters], db: AsyncSession, mpi_min: Optional[float] = None, mpi_max: Optional[float] = None, - location_ref: Optional[int] = None, - location_code: Optional[str] = None, - location_name: Optional[str] = None, has_hrp: Optional[bool] = None, in_gho: Optional[bool] = None, - provider_admin1_name: Optional[str] = None, ) -> Sequence[PovertyRateView]: return await poverty_rates_view_list( common_date_range_params=common_date_range_params, pagination_parameters=pagination_parameters, ref_period_parameters=ref_period_parameters, + common_location_params=common_location_params, db=db, mpi_min=mpi_min, mpi_max=mpi_max, - location_ref=location_ref, - location_code=location_code, - location_name=location_name, has_hrp=has_hrp, in_gho=in_gho, - provider_admin1_name=provider_admin1_name, ) diff --git a/requirements.txt b/requirements.txt index 1f43ac35..6419a5b7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,4 @@ ua-parser==1.0.1 # alembic~=1.12.00 psycopg2~=2.9.10 --e git+https://github.com/OCHA-DAP/hapi-sqlalchemy-schema@v0.9.8#egg=hapi-schema +-e git+https://github.com/OCHA-DAP/hapi-sqlalchemy-schema@v0.9.9#egg=hapi-schema diff --git a/tests/sample_data/poverty_rate.sql b/tests/sample_data/poverty_rate.sql index 14c2ad15..3bfae2a9 100644 --- a/tests/sample_data/poverty_rate.sql +++ b/tests/sample_data/poverty_rate.sql @@ -2,9 +2,9 @@ INSERT INTO poverty_rate( resource_hdx_id, admin1_ref, provider_admin1_name, mpi, headcount_ratio, intensity_of_deprivation, vulnerable_to_poverty, in_severe_poverty, reference_period_start, reference_period_end) VALUES -('17acb541-9431-409a-80a8-50eda7e8ebab',2,'Province 01',0.617442,85.4,72.3,10.5,52.1,'2022-01-01 00:00:00', '2023-01-01 00:00:00'), -('17acb541-9431-409a-80a8-50eda7e8ebab',2,'Province 01',0.617442,85.4,72.3,10.5,52.1,'2022-01-02 00:00:00', '2023-01-01 00:00:00'), -('17acb541-9431-409a-80a8-50eda7e8ebab',2,'Province 01',0.617442,85.4,72.3,10.5,52.1,'2022-01-03 00:00:00', '2023-01-01 00:00:00'), -('17acb541-9431-409a-80a8-50eda7e8ebab',3,'Province 02',0.617442,85.4,72.3,10.5,52.1,'2022-01-04 00:00:00', '2023-01-01 00:00:00'), -('17acb541-9431-409a-80a8-50eda7e8ebab',3,'Province 02',0.617442,85.4,72.3,10.5,52.1,'2022-01-05 00:00:00', '2023-01-01 00:00:00'), -('17acb541-9431-409a-80a8-50eda7e8ebab',3,'Province 02',0.617442,85.4,72.3,10.5,52.1,'2022-01-06 00:00:00', '2023-01-01 00:00:00'); +('17acb541-9431-409a-80a8-50eda7e8ebab',1,'Province 01',0.617442,85.4,72.3,10.5,52.1,'2022-01-01 00:00:00', '2023-01-01 00:00:00'), +('17acb541-9431-409a-80a8-50eda7e8ebab',1,'Province 01',0.617442,85.4,72.3,10.5,52.1,'2022-01-02 00:00:00', '2023-01-01 00:00:00'), +('17acb541-9431-409a-80a8-50eda7e8ebab',1,'Province 01',0.617442,85.4,72.3,10.5,52.1,'2022-01-03 00:00:00', '2023-01-01 00:00:00'), +('17acb541-9431-409a-80a8-50eda7e8ebab',1,'Province 02',0.617442,85.4,72.3,10.5,52.1,'2022-01-04 00:00:00', '2023-01-01 00:00:00'), +('17acb541-9431-409a-80a8-50eda7e8ebab',1,'Province 02',0.617442,85.4,72.3,10.5,52.1,'2022-01-05 00:00:00', '2023-01-01 00:00:00'), +('17acb541-9431-409a-80a8-50eda7e8ebab',1,'Province 02',0.617442,85.4,72.3,10.5,52.1,'2022-01-06 00:00:00', '2023-01-01 00:00:00'); diff --git a/tests/test_endpoints/endpoint_data.py b/tests/test_endpoints/endpoint_data.py index 9c24719e..2b3f3760 100644 --- a/tests/test_endpoints/endpoint_data.py +++ b/tests/test_endpoints/endpoint_data.py @@ -24,6 +24,8 @@ 'name': 'Province 01', 'location_code': 'FoO', 'location_name': 'Foolandia', + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2024-01-01T00:00:00', # 'reference_period_start_min': '2020-01-01T00:00:00', # 'reference_period_start_max': '2024-01-01T00:00:00', }, @@ -50,6 +52,8 @@ 'admin1_name': 'Province 01', 'location_code': 'FOo', 'location_name': 'Foolandia', + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2024-01-01T00:00:00', # 'reference_period_start_min': '2020-01-01T00:00:00', # 'reference_period_start_max': '2024-01-01T00:00:00', }, @@ -80,6 +84,7 @@ 'admin2_name': 'District A', 'update_date_min': date(2022, 6, 1), 'update_date_max': date(2023, 6, 3), + 'admin_level': AdminLevel.TWO.value, }, 'expected_fields': [ 'category', @@ -91,6 +96,7 @@ 'admin2_code', 'admin2_name', 'hapi_updated_date', + 'admin_level', ], }, '/api/v2/metadata/dataset': { @@ -119,6 +125,8 @@ 'name': 'Foolandia', 'has_hrp': True, 'in_gho': True, + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2024-01-01T00:00:00', # 'reference_period_start_min': '2020-01-01T00:00:00', # 'reference_period_start_max': '2024-01-01T00:00:00', }, @@ -136,50 +144,48 @@ '/api/v2/coordination-context/conflict-events': { 'query_parameters': { 'event_type': EventType.POLITICAL_VIOLENCE.value, - 'location_ref': 1, + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2026-01-01T00:00:00', + # 'reference_period_start_min': '2020-01-01T00:00:00', + # 'reference_period_start_max': '2024-01-01T00:00:00', 'location_code': 'foo', 'location_name': 'Foolandia', 'has_hrp': True, 'in_gho': True, - 'admin1_ref': 2, 'admin1_code': 'foo-001', 'admin1_name': 'province', - 'provider_admin1_name': 'Provider admin1 name 4', - 'admin2_ref': 4, 'admin2_code': 'foo-001-a', 'admin2_name': 'district', - 'provider_admin2_name': 'Provider admin2 name 4', + 'admin_level': AdminLevel.TWO.value, }, 'expected_fields': [ + 'resource_hdx_id', 'event_type', 'events', 'fatalities', - 'resource_hdx_id', - 'location_ref', + 'reference_period_start', + 'reference_period_end', 'location_code', 'location_name', - 'admin1_ref', 'admin1_code', 'admin1_name', - 'provider_admin1_name', - 'admin2_ref', 'admin2_code', 'admin2_name', - 'provider_admin2_name', - 'reference_period_start', - 'reference_period_end', + 'admin_level', ], }, '/api/v2/coordination-context/funding': { 'query_parameters': { 'appeal_code': 'hfoo24', 'appeal_type': 'hRp', + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2024-01-01T00:00:00', + # 'reference_period_start_min': '2020-01-01T00:00:00', + # 'reference_period_start_max': '2024-01-01T00:00:00', 'location_code': 'foo', 'location_name': 'Foolandia', 'has_hrp': True, 'in_gho': True, - # 'reference_period_start_min': '2020-01-01T00:00:00', - # 'reference_period_start_max': '2024-01-01T00:00:00', }, 'expected_fields': [ 'resource_hdx_id', @@ -189,11 +195,10 @@ 'requirements_usd', 'funding_usd', 'funding_pct', - 'location_ref', - 'location_code', - 'location_name', 'reference_period_start', 'reference_period_end', + 'location_code', + 'location_name', ], }, '/api/v2/coordination-context/operational-presence': { @@ -201,46 +206,38 @@ 'org_acronym': 'oRG01', 'org_name': 'Organisation 1', 'sector_code': 'Shl', + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2024-01-01T00:00:00', + # 'reference_period_start_min': '2020-01-01T00:00:00', + # 'reference_period_start_max': '2024-01-01T00:00:00', 'sector_name': 'Emergency Shelter and NFI', - 'location_ref': 1, 'location_code': 'foo', 'location_name': 'Foolandia', 'has_hrp': True, 'in_gho': True, - 'admin1_ref': 2, 'admin1_code': 'foo-001', 'admin1_name': 'province', - 'provider_admin1_name': 'Provider admin1 name 2', - 'admin1_is_unspecified': False, - 'admin2_ref': 2, 'admin2_code': 'foo-001-xxx', 'admin2_name': 'Unspecified', - 'provider_admin2_name': 'Provider admin2 name 2', - 'admin2_is_unspecified': True, - # 'reference_period_start_min': '2020-01-01T00:00:00', - # 'reference_period_start_max': '2024-01-01T00:00:00', + 'admin_level': AdminLevel.TWO.value, }, 'expected_fields': [ - 'sector_code', 'resource_hdx_id', 'org_acronym', 'org_name', + 'sector_code', + 'reference_period_start', + 'reference_period_end', 'org_type_code', 'org_type_description', 'sector_name', - 'location_ref', 'location_code', 'location_name', - 'reference_period_start', - 'reference_period_end', - 'admin1_ref', 'admin1_code', 'admin1_name', - 'provider_admin1_name', - 'admin2_ref', 'admin2_code', 'admin2_name', - 'provider_admin2_name', + 'admin_level', ], }, '/api/v2/metadata/org': { @@ -261,32 +258,26 @@ }, '/api/v2/geography-infrastructure/baseline-population': { 'query_parameters': { - 'admin2_ref': 1, 'gender': Gender.NONBINARY.value, 'age_range': '10-14', - 'min_age': 10, - 'max_age': 14, + # 'min_age': 10, + # 'max_age': 14, 'population_min': 0, 'population_max': 10000000, - #'reference_period_start_min': '2020-01-01T00:00:00', - #'reference_period_end_max': '2024-01-01T00:00:00', + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2024-01-01T00:00:00', 'location_code': 'fOO', 'location_name': 'Foolandia', - 'location_ref': 1, 'has_hrp': True, 'in_gho': True, 'admin1_code': 'FOO-xxx', 'admin1_name': 'Unspecified', - 'provider_admin1_name': 'Provider admin1 name 1', - 'admin1_is_unspecified': False, 'admin2_code': 'FOO-xxx-XXX', 'admin2_name': 'Unspecified', - 'provider_admin2_name': 'Provider admin2 name 1', - 'admin2_is_unspecified': True, + 'admin_level': AdminLevel.TWO.value, }, 'expected_fields': [ 'resource_hdx_id', - 'admin2_ref', 'gender', 'age_range', 'min_age', @@ -294,33 +285,33 @@ 'population', 'reference_period_start', 'reference_period_end', - 'location_ref', 'location_code', 'location_name', - 'admin1_ref', 'admin1_code', 'admin1_name', - 'provider_admin1_name', 'admin2_code', 'admin2_name', - 'provider_admin2_name', + 'admin_level', ], }, '/api/v2/food-security-nutrition-poverty/poverty-rate': { 'query_parameters': { - 'provider_admin1_name': 'Province 01', 'mpi_min': 0.01, 'mpi_max': 0.9, - # 'reference_period_start_min': '2020-01-01T00:00:00', - # 'reference_period_end_max': '2024-01-01T00:00:00', + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2024-01-01T00:00:00', 'location_code': 'fOO', 'location_name': 'Foolandia', 'has_hrp': True, 'in_gho': True, + 'admin1_code': 'FOO-xxx', + 'admin1_name': 'Unspecified', + # 'admin2_code': 'FOO-xxx-XXX', + # 'admin2_name': 'Unspecified', + 'admin_level': AdminLevel.ONE.value, }, 'expected_fields': [ 'resource_hdx_id', - 'provider_admin1_name', 'mpi', 'headcount_ratio', 'intensity_of_deprivation', @@ -330,34 +321,33 @@ 'reference_period_end', 'location_code', 'location_name', - 'location_ref', + 'admin1_code', + 'admin1_name', + # 'admin2_code', + # 'admin2_name', + 'admin_level', ], }, '/api/v2/food-security-nutrition-poverty/food-security': { 'query_parameters': { - 'admin2_ref': 1, 'ipc_phase': IPCPhase.PHASE_1.value, 'ipc_type': IPCType.CURRENT.value, - 'location_ref': 1, + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2024-01-01T00:00:00', + # 'reference_period_start_min': '2020-01-01T00:00:00', + # 'reference_period_end_max': '2024-01-01T00:00:00', 'location_code': 'fOO', 'location_name': 'Foolandia', 'has_hrp': True, 'in_gho': True, 'admin1_code': 'FOO-xxx', 'admin1_name': 'Unspecified', - # 'provider_admin1_name': 'Provider admin1 name 1', - # 'admin1_is_unspecified': True, 'admin2_code': 'FOO-xxx-XXX', 'admin2_name': 'Unspecified', - # 'provider_admin2_name': 'Provider admin2 name 1', - # 'admin2_is_unspecified': True, 'admin_level': AdminLevel.ZERO.value, - # 'reference_period_start': date(2023, 6, 1), - # 'reference_period_end': date(2023, 6, 2), }, 'expected_fields': [ 'resource_hdx_id', - 'admin2_ref', 'ipc_phase', 'ipc_type', 'population_in_phase', @@ -368,38 +358,32 @@ 'location_name', 'admin1_code', 'admin1_name', - 'provider_admin1_name', - 'location_ref', 'admin2_code', 'admin2_name', - 'provider_admin2_name', - 'admin1_ref', + 'admin_level', ], }, '/api/v2/food-security-nutrition-poverty/food-prices-market-monitor': { 'query_parameters': { + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2026-01-01T00:00:00', 'market_code': '001', - 'market_name': 'market', 'commodity_code': '001', - 'commodity_name': 'commodity', - 'commodity_category': CommodityCategory.VEGETABLES_FRUITS.value, 'price_flag': PriceFlag.ACTUAL.value, 'price_type': PriceType.RETAIL.value, 'price_min': '100.1', 'price_max': '100.3', - 'location_ref': 1, + 'market_name': 'market', + 'commodity_category': CommodityCategory.VEGETABLES_FRUITS.value, + 'commodity_name': 'commodity', 'location_code': 'fOO', 'location_name': 'Foolandia', 'has_hrp': True, 'in_gho': True, - 'admin1_ref': 2, 'admin1_code': 'FOO-001', 'admin1_name': 'Province 01', - 'provider_admin1_name': 'Provider admin1 name 4', - 'admin2_ref': 4, 'admin2_code': 'FOO-001-A', 'admin2_name': 'District A', - 'provider_admin2_name': 'Provider admin2 name 4', 'admin_level': AdminLevel.TWO.value, }, 'expected_fields': [ @@ -418,17 +402,13 @@ 'lon', 'reference_period_start', 'reference_period_end', - 'location_ref', 'location_code', 'location_name', - 'admin1_ref', 'admin1_code', 'admin1_name', - 'provider_admin1_name', - 'admin2_ref', 'admin2_code', 'admin2_name', - 'provider_admin2_name', + 'admin_level', ], }, '/api/v2/coordination-context/national-risk': { @@ -444,6 +424,8 @@ 'vulnerability_risk_max': 10, 'coping_capacity_risk_min': 6.1, 'coping_capacity_risk_max': 10.1, + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2026-01-01T00:00:00', # 'reference_period_start_min': '2020-01-01T00:00:00', # 'reference_period_start_max': '2024-01-11T00:00:00', # 'reference_period_end_min': '2023-01-01T00:00:00', @@ -454,6 +436,7 @@ 'in_gho': True, }, 'expected_fields': [ + 'resource_hdx_id', 'risk_class', 'global_rank', 'overall_risk', @@ -464,37 +447,32 @@ 'meta_avg_recentness_years', 'reference_period_start', 'reference_period_end', - 'resource_hdx_id', 'location_code', 'location_name', - 'location_ref', ], }, '/api/v2/affected-people/humanitarian-needs': { 'query_parameters': { - 'admin2_ref': 2, - 'sector_code': 'EDU', 'category': 'All - Disabled - all - AFF', + 'sector_code': 'EDU', 'population_status': PopulationStatus.AFFECTED.value, + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2024-01-01T00:00:00', # 'reference_period_start_min': '2020-01-01T00:00:00', # 'reference_period_start_max': '2026-01-01T00:00:00', 'sector_name': 'Education', 'location_code': 'foo', 'location_name': 'Foolandia', - 'location_ref': 1, 'has_hrp': True, 'in_gho': True, 'admin1_code': 'FOO-001', 'admin1_name': 'Province 01', - 'provider_admin1_name': 'Provider admin1 name 2', 'admin2_code': 'foo-001-XXX', 'admin2_name': 'Unspecified', - 'provider_admin2_name': 'Provider admin2 name 2', - 'admin1_ref': 2, + 'admin_level': AdminLevel.TWO.value, }, 'expected_fields': [ 'resource_hdx_id', - 'admin2_ref', 'category', 'sector_code', 'population_status', @@ -504,14 +482,11 @@ 'sector_name', 'location_code', 'location_name', - 'location_ref', 'admin1_code', 'admin1_name', - 'provider_admin1_name', 'admin2_code', 'admin2_name', - 'provider_admin2_name', - 'admin1_ref', + 'admin_level', ], }, '/api/v2/affected-people/refugees-persons-of-concern': { @@ -519,6 +494,8 @@ 'population_group': PopulationGroup.REFUGEES.value, 'gender': Gender.ALL.value, 'age_range': 'ALL', + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2024-01-01T00:00:00', # 'reference_period_start_min': '2020-01-01T00:00:00', # 'reference_period_start_max': '2026-01-01T00:00:00', 'origin_location_code': 'foo', @@ -532,8 +509,6 @@ }, 'expected_fields': [ 'resource_hdx_id', - 'origin_location_ref', - 'asylum_location_ref', 'population_group', 'gender', 'age_range', @@ -553,6 +528,8 @@ 'population_group': PopulationGroup.REFUGEES.value, 'gender': Gender.ALL.value, 'age_range': 'ALL', + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2024-01-01T00:00:00', # 'reference_period_start_min': '2020-01-01T00:00:00', # 'reference_period_start_max': '2026-01-01T00:00:00', 'origin_location_code': 'foo', @@ -566,8 +543,6 @@ }, 'expected_fields': [ 'resource_hdx_id', - 'origin_location_ref', - 'asylum_location_ref', 'population_group', 'gender', 'age_range', @@ -585,15 +560,12 @@ # ('17acb541-9431-409a-80a8-50eda7e8ebab', 1, 'BA', 1, 50, '2023-01-01 00:00:00', NULL) '/api/v2/affected-people/idps': { 'query_parameters': { - 'admin2_ref': 1, - 'provider_admin1_name': 'Provider admin1 name 1', - # 'provider_admin2_name': 'Provider admin2 name 2', - 'location_ref': 1, + 'start_date': '2020-01-01T00:00:00', + 'end_date': '2024-01-01T00:00:00', 'location_code': 'fOO', 'location_name': 'Foolandia', 'has_hrp': True, 'in_gho': True, - 'admin1_ref': 1, 'admin1_code': 'FOO-xxx', 'admin1_name': 'Unspecified', 'admin2_code': 'FOO-xxx-XXX', @@ -602,23 +574,19 @@ }, 'expected_fields': [ 'resource_hdx_id', - 'admin2_ref', - 'provider_admin1_name', - 'provider_admin2_name', 'reporting_round', - 'assessment_type', 'operation', + 'assessment_type', 'population', 'reference_period_start', 'reference_period_end', 'location_code', 'location_name', - 'location_ref', 'admin1_code', 'admin1_name', 'admin2_code', 'admin2_name', - 'admin1_ref', + 'admin_level', ], }, '/api/v2/metadata/resource': { @@ -681,36 +649,28 @@ 'query_parameters': { 'code': '001', 'name': 'Market #1', - 'location_ref': 1, 'location_code': 'foo', 'location_name': 'Foolandia', 'has_hrp': True, 'in_gho': True, - 'admin1_ref': 2, 'admin1_code': 'foo-001', 'admin1_name': 'province', - 'provider_admin1_name': 'Provider admin1 name 4', - 'admin2_ref': 4, 'admin2_code': 'foo-001-a', 'admin2_name': 'district', - 'provider_admin2_name': 'Provider admin2 name 4', + 'admin_level': AdminLevel.TWO.value, }, 'expected_fields': [ 'code', 'name', 'lat', 'lon', - 'location_ref', 'location_code', 'location_name', - 'admin1_ref', 'admin1_code', 'admin1_name', - 'provider_admin1_name', - 'admin2_ref', 'admin2_code', 'admin2_name', - 'provider_admin2_name', + 'admin_level', ], }, '/api/v2/encode_app_identifier': { diff --git a/tests/test_endpoints/test_conflict_event_endpoint.py b/tests/test_endpoints/test_conflict_event_endpoint.py index 0c48bb0b..2c6ed26f 100644 --- a/tests/test_endpoints/test_conflict_event_endpoint.py +++ b/tests/test_endpoints/test_conflict_event_endpoint.py @@ -73,75 +73,77 @@ async def test_get_conflict_event_result(event_loop, refresh_db): async def test_get_conflict_event_adm_fields(event_loop, refresh_db): log.info('started test_get_conflict_event_adm_fields') - conflict_event_view_adm_specified = ConflictEventResponse( + adm_x = ConflictEventResponse( resource_hdx_id='test-resource1', event_type=EventType.CIVILIAN_TARGETING, events=10, fatalities=2, - location_ref=1, + reference_period_start=datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + reference_period_end=datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), location_code='Foolandia', location_name='FOO-XXX', - admin1_ref=1, - admin1_is_unspecified=False, admin1_code='FOO-XXX', - admin1_name='Province 01', - provider_admin1_name='Province 01', - admin2_ref=1, - admin2_is_unspecified=False, + admin1_name='Unspecified', admin2_code='FOO-XXX-XXX', - admin2_name='District A', - provider_admin2_name='District A', - reference_period_start=datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), - reference_period_end=datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=0, ) - assert conflict_event_view_adm_specified.admin1_code == 'FOO-XXX', ( - 'admin1_code should keep its value when admin1_is_unspecified is False' - ) - assert conflict_event_view_adm_specified.admin1_name == 'Province 01', ( - 'admin1_name should keep its value when admin1_is_unspecified is False' - ) - assert conflict_event_view_adm_specified.admin2_code == 'FOO-XXX-XXX', ( - 'admin2_code should keep its value when admin1_is_unspecified is False' - ) - assert conflict_event_view_adm_specified.admin2_name == 'District A', ( - 'admin2_name should keep its value when admin1_is_unspecified is False' - ) + assert adm_x.admin1_code is None + assert adm_x.admin1_name is None + assert adm_x.admin2_code is None + assert adm_x.admin2_name is None + assert adm_x.admin_level == 0 - conflict_event_view_adm_unspecified = ConflictEventResponse( + adm_x = ConflictEventResponse( resource_hdx_id='test-resource1', event_type=EventType.CIVILIAN_TARGETING, events=10, fatalities=2, - location_ref=1, + reference_period_start=datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + reference_period_end=datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), location_code='Foolandia', location_name='FOO-XXX', - admin1_is_unspecified=True, - admin1_ref=1, admin1_code='FOO-XXX', admin1_name='Unspecified', - provider_admin1_name='Unspecified', - admin2_ref=1, - admin2_is_unspecified=True, admin2_code='FOO-XXX-XXX', admin2_name='Unspecified', - provider_admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=1, + ) + + assert adm_x.admin1_code == 'FOO-XXX' + assert adm_x.admin1_name == 'Province 0 Provider adm1 name' + assert adm_x.admin2_code is None + assert adm_x.admin2_name is None + assert adm_x.admin_level == 1 + + adm_x = ConflictEventResponse( + resource_hdx_id='test-resource1', + event_type=EventType.CIVILIAN_TARGETING, + events=10, + fatalities=2, reference_period_start=datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), reference_period_end=datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), + location_code='Foolandia', + location_name='FOO-XXX', + admin1_code='FOO-XXX', + admin1_name='Unspecified', + admin2_code='FOO-XXX-XXX', + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=2, ) - assert conflict_event_view_adm_unspecified.admin1_code is None, ( - 'admin1_code should be changed to None when admin1_is_unspecified is True' - ) - assert conflict_event_view_adm_unspecified.admin1_name is None, ( - 'admin1_name should be changed to None when admin1_is_unspecified is True' - ) - assert conflict_event_view_adm_unspecified.admin2_code is None, ( - 'admin2_code should be changed to None when admin1_is_unspecified is True' - ) - assert conflict_event_view_adm_unspecified.admin2_name is None, ( - 'admin2_name should be changed to None when admin1_is_unspecified is True' - ) + assert adm_x.admin1_code == 'FOO-XXX' + assert adm_x.admin1_name == 'Province 0 Provider adm1 name' + assert adm_x.admin2_code == 'FOO-XXX-XXX' + assert adm_x.admin2_name == 'District A Provider adm2 name' + assert adm_x.admin_level == 2 @pytest.mark.asyncio diff --git a/tests/test_endpoints/test_data_availability_endpoint.py b/tests/test_endpoints/test_data_availability_endpoint.py index 05c40438..64939180 100644 --- a/tests/test_endpoints/test_data_availability_endpoint.py +++ b/tests/test_endpoints/test_data_availability_endpoint.py @@ -1,7 +1,9 @@ +import datetime import pytest import logging from httpx import ASGITransport, AsyncClient +from hdx_hapi.endpoints.models.availability import AvailabilityResponse from main import app from hdx_hapi.endpoints.util.util import AdminLevel from tests.test_endpoints.endpoint_data import endpoint_data @@ -115,3 +117,71 @@ async def test_get_data_availability_for_admin_level_filter(event_loop, refresh_ assert item['admin2_name'] is not None assert item['admin1_code'] is not None assert item['admin1_name'] is not None + + +@pytest.mark.asyncio +async def test_get_data_availability_adm_fields(event_loop, refresh_db): + log.info('started test_get_data_availability_adm_fields') + + adm_x = AvailabilityResponse( + category='coordination-context', + subcategory='conflict-events', + hapi_updated_date=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + location_code='Foolandia', + location_name='FOO-XXX', + admin1_code='FOO-XXX', + admin1_name='Unspecified', + admin2_code='FOO-XXX-XXX', + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=0, + ) + + assert adm_x.admin1_code is None + assert adm_x.admin1_name is None + assert adm_x.admin2_code is None + assert adm_x.admin2_name is None + assert adm_x.admin_level == 0 + + adm_x = AvailabilityResponse( + category='coordination-context', + subcategory='conflict-events', + hapi_updated_date=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + location_code='Foolandia', + location_name='FOO-XXX', + admin1_code='FOO-XXX', + admin1_name='Unspecified', + admin2_code='FOO-XXX-XXX', + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=1, + ) + + assert adm_x.admin1_code == 'FOO-XXX' + assert adm_x.admin1_name == 'Province 0 Provider adm1 name' + assert adm_x.admin2_code is None + assert adm_x.admin2_name is None + assert adm_x.admin_level == 1 + + adm_x = AvailabilityResponse( + category='coordination-context', + subcategory='conflict-events', + hapi_updated_date=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + location_code='Foolandia', + location_name='FOO-XXX', + admin1_code='FOO-XXX', + admin1_name='Unspecified', + admin2_code='FOO-XXX-XXX', + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=2, + ) + + assert adm_x.admin1_code == 'FOO-XXX' + assert adm_x.admin1_name == 'Province 0 Provider adm1 name' + assert adm_x.admin2_code == 'FOO-XXX-XXX' + assert adm_x.admin2_name == 'District A Provider adm2 name' + assert adm_x.admin_level == 2 diff --git a/tests/test_endpoints/test_endpoints_vs_encode_identifier.py b/tests/test_endpoints/test_endpoints_vs_encode_identifier.py index fc959bfd..83ffc450 100644 --- a/tests/test_endpoints/test_endpoints_vs_encode_identifier.py +++ b/tests/test_endpoints/test_endpoints_vs_encode_identifier.py @@ -29,7 +29,7 @@ '/api/v1/metadata/sector', '/api/v1/metadata/currency', '/api/v1/metadata/wfp-commodity', - '/api/v1/metadata/wfp-market', + # '/api/v1/metadata/wfp-market', '/api/v1/metadata/data-availability', '/api/v2/food-security-nutrition-poverty/food-prices-market-monitor', '/api/v2/food-security-nutrition-poverty/food-security', @@ -52,7 +52,7 @@ '/api/v2/metadata/sector', '/api/v2/metadata/currency', '/api/v2/metadata/wfp-commodity', - '/api/v2/metadata/wfp-market', + # '/api/v2/metadata/wfp-market', '/api/v2/metadata/data-availability', ] diff --git a/tests/test_endpoints/test_food_price_endpoint.py b/tests/test_endpoints/test_food_price_endpoint.py index d53cd342..ac69b043 100644 --- a/tests/test_endpoints/test_food_price_endpoint.py +++ b/tests/test_endpoints/test_food_price_endpoint.py @@ -75,7 +75,7 @@ async def test_get_food_price_result(event_loop, refresh_db): async def test_get_food_price_adm_fields(event_loop, refresh_db): log.info('started test_get_food_price_adm_fields') - food_price_view_adm_specified = FoodPriceResponse( + adm_x = FoodPriceResponse( resource_hdx_id='', market_code='', market_name='', @@ -93,35 +93,55 @@ async def test_get_food_price_adm_fields(event_loop, refresh_db): reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), location_code='Foolandia', location_name='FOO-XXX', - admin1_ref=1, admin1_code='FOO-XXX', - admin1_name='Province 01', - provider_admin1_name='Province 01', - admin2_ref=1, + admin1_name='Unspecified', admin2_code='FOO-XXX-XXX', - admin2_name='District A', - provider_admin2_name='District A', - location_ref=2, - admin1_is_unspecified=False, - admin2_is_unspecified=False, + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=0, ) - assert True + assert adm_x.admin1_code is None + assert adm_x.admin1_name is None + assert adm_x.admin2_code is None + assert adm_x.admin2_name is None + assert adm_x.admin_level == 0 - assert food_price_view_adm_specified.admin1_code == 'FOO-XXX', ( - 'admin1_code should keep its value when admin1_is_unspecified is False' - ) - assert food_price_view_adm_specified.admin1_name == 'Province 01', ( - 'admin1_name should keep its value when admin1_is_unspecified is False' - ) - assert food_price_view_adm_specified.admin2_code == 'FOO-XXX-XXX', ( - 'admin2_code should keep its value when admin1_is_unspecified is False' - ) - assert food_price_view_adm_specified.admin2_name == 'District A', ( - 'admin2_name should keep its value when admin1_is_unspecified is False' + adm_x = FoodPriceResponse( + resource_hdx_id='', + market_code='', + market_name='', + commodity_code='', + commodity_name='', + commodity_category=CommodityCategory.CEREALS_TUBERS, + currency_code='', + unit='', + price_flag=PriceFlag.AGGREGATE, + price_type=PriceType.FARM_GATE, + price=Decimal(1.5), + lat=0.0, + lon=0.0, + reference_period_start=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), + location_code='Foolandia', + location_name='FOO-XXX', + admin1_code='FOO-XXX', + admin1_name='Unspecified', + admin2_code='FOO-XXX-XXX', + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=1, ) - food_price_view_adm_unspecified = FoodPriceResponse( + assert adm_x.admin1_code == 'FOO-XXX' + assert adm_x.admin1_name == 'Province 0 Provider adm1 name' + assert adm_x.admin2_code is None + assert adm_x.admin2_name is None + assert adm_x.admin_level == 1 + + adm_x = FoodPriceResponse( resource_hdx_id='', market_code='', market_name='', @@ -139,31 +159,20 @@ async def test_get_food_price_adm_fields(event_loop, refresh_db): reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), location_code='Foolandia', location_name='FOO-XXX', - admin1_ref=1, admin1_code='FOO-XXX', admin1_name='Unspecified', - provider_admin1_name='Unspecified', - admin2_ref=1, admin2_code='FOO-XXX-XXX', admin2_name='Unspecified', - provider_admin2_name='Unspecified', - location_ref=2, - admin1_is_unspecified=True, - admin2_is_unspecified=True, + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=2, ) - assert food_price_view_adm_unspecified.admin1_code is None, ( - 'admin1_code should be changed to None when admin1_is_unspecified is True' - ) - assert food_price_view_adm_unspecified.admin1_name is None, ( - 'admin1_name should be changed to None when admin1_is_unspecified is True' - ) - assert food_price_view_adm_unspecified.admin2_code is None, ( - 'admin2_code should be changed to None when admin1_is_unspecified is True' - ) - assert food_price_view_adm_unspecified.admin2_name is None, ( - 'admin2_name should be changed to None when admin1_is_unspecified is True' - ) + assert adm_x.admin1_code == 'FOO-XXX' + assert adm_x.admin1_name == 'Province 0 Provider adm1 name' + assert adm_x.admin2_code == 'FOO-XXX-XXX' + assert adm_x.admin2_name == 'District A Provider adm2 name' + assert adm_x.admin_level == 2 @pytest.mark.asyncio diff --git a/tests/test_endpoints/test_food_security_endpoint.py b/tests/test_endpoints/test_food_security_endpoint.py index 9ca4d7f4..dca9d8fd 100644 --- a/tests/test_endpoints/test_food_security_endpoint.py +++ b/tests/test_endpoints/test_food_security_endpoint.py @@ -70,77 +70,80 @@ async def test_get_food_security_result(event_loop, refresh_db): async def test_get_food_security_adm_fields(event_loop, refresh_db): log.info('started test_get_food_security_adm_fields') - food_security_view_adm_specified = FoodSecurityResponse( + adm_x = FoodSecurityResponse( population_in_phase=8225, population_fraction_in_phase=0.02, ipc_phase='2', ipc_type='current', resource_hdx_id='test-resource1', - location_ref=1, + reference_period_start=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), location_code='Foolandia', location_name='FOO-XXX', - admin1_ref=1, - admin1_is_unspecified=False, - admin2_ref=1, admin1_code='FOO-XXX', - admin1_name='Province 01', - provider_admin1_name='Province 01', - admin2_is_unspecified=False, + admin1_name='Unspecified', admin2_code='FOO-XXX-XXX', - admin2_name='District A', - provider_admin2_name='District A', - reference_period_start=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), - reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=0, ) - assert food_security_view_adm_specified.admin1_code == 'FOO-XXX', ( - 'admin1_code should keep its value when admin1_is_unspecified is False' - ) - assert food_security_view_adm_specified.admin1_name == 'Province 01', ( - 'admin1_name should keep its value when admin1_is_unspecified is False' - ) - assert food_security_view_adm_specified.admin2_code == 'FOO-XXX-XXX', ( - 'admin2_code should keep its value when admin1_is_unspecified is False' - ) - assert food_security_view_adm_specified.admin2_name == 'District A', ( - 'admin2_name should keep its value when admin1_is_unspecified is False' - ) + assert adm_x.admin1_code is None + assert adm_x.admin1_name is None + assert adm_x.admin2_code is None + assert adm_x.admin2_name is None + assert adm_x.admin_level == 0 - food_security_view_adm_unspecified = FoodSecurityResponse( + adm_x = FoodSecurityResponse( population_in_phase=8225, population_fraction_in_phase=0.02, ipc_phase='2', ipc_type='current', resource_hdx_id='test-resource1', - location_ref=1, + reference_period_start=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), location_code='Foolandia', location_name='FOO-XXX', - admin1_ref=1, - admin1_is_unspecified=True, admin1_code='FOO-XXX', admin1_name='Unspecified', - provider_admin1_name='Unspecified', - admin2_ref=1, - admin2_is_unspecified=True, - admin2_code='FOO-XXX', + admin2_code='FOO-XXX-XXX', admin2_name='Unspecified', - provider_admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=1, + ) + + assert adm_x.admin1_code == 'FOO-XXX' + assert adm_x.admin1_name == 'Province 0 Provider adm1 name' + assert adm_x.admin2_code is None + assert adm_x.admin2_name is None + assert adm_x.admin_level == 1 + + adm_x = FoodSecurityResponse( + population_in_phase=8225, + population_fraction_in_phase=0.02, + ipc_phase='2', + ipc_type='current', + resource_hdx_id='test-resource1', reference_period_start=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), + location_code='Foolandia', + location_name='FOO-XXX', + admin1_code='FOO-XXX', + admin1_name='Unspecified', + admin2_code='FOO-XXX-XXX', + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=2, ) - assert food_security_view_adm_unspecified.admin1_code is None, ( - 'admin1_code should be changed to None when admin1_is_unspecified is True' - ) - assert food_security_view_adm_unspecified.admin1_name is None, ( - 'admin1_name should be changed to None when admin1_is_unspecified is True' - ) - assert food_security_view_adm_unspecified.admin2_code is None, ( - 'admin2_code should be changed to None when admin1_is_unspecified is True' - ) - assert food_security_view_adm_unspecified.admin2_name is None, ( - 'admin2_name should be changed to None when admin1_is_unspecified is True' - ) + assert adm_x.admin1_code == 'FOO-XXX' + assert adm_x.admin1_name == 'Province 0 Provider adm1 name' + assert adm_x.admin2_code == 'FOO-XXX-XXX' + assert adm_x.admin2_name == 'District A Provider adm2 name' + assert adm_x.admin_level == 2 @pytest.mark.asyncio diff --git a/tests/test_endpoints/test_humanitarian_needs_endpoint.py b/tests/test_endpoints/test_humanitarian_needs_endpoint.py index 81473b91..33a9d279 100644 --- a/tests/test_endpoints/test_humanitarian_needs_endpoint.py +++ b/tests/test_endpoints/test_humanitarian_needs_endpoint.py @@ -70,7 +70,7 @@ async def test_get_humanitarian_needs_result(event_loop, refresh_db): async def test_get_humanitarian_needs_adm_fields(event_loop, refresh_db): log.info('started test_get_humanitarian_needs_adm_fields') - humanitarian_needs_view_adm_specified = HumanitarianNeedsResponse( + adm_0 = HumanitarianNeedsResponse( resource_hdx_id='17acb541-9431-409a-80a8-50eda7e8ebab', category='', sector_code='EDU', @@ -81,38 +81,51 @@ async def test_get_humanitarian_needs_adm_fields(event_loop, refresh_db): sector_name='Education', location_code='Foolandia', location_name='FOO-XXX', - admin1_is_unspecified=False, - admin1_ref=1, - admin2_ref=1, admin1_code='FOO-XXX', - admin1_name='Province 01', - provider_admin1_name='Province 01', - admin2_is_unspecified=False, + admin1_name='Unspecified', admin2_code='FOO-XXX-XXX', - admin2_name='District A', - provider_admin2_name='District A', - location_ref=2, + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=0, ) - assert True + assert adm_0.admin1_code is None + assert adm_0.admin1_name is None + assert adm_0.admin2_code is None + assert adm_0.admin2_name is None + assert adm_0.admin_level == 0 - assert humanitarian_needs_view_adm_specified.admin1_code == 'FOO-XXX', ( - 'admin1_code should keep its value when admin1_is_unspecified is False' - ) - assert humanitarian_needs_view_adm_specified.admin1_name == 'Province 01', ( - 'admin1_name should keep its value when admin1_is_unspecified is False' - ) - assert humanitarian_needs_view_adm_specified.admin2_code == 'FOO-XXX-XXX', ( - 'admin2_code should keep its value when admin1_is_unspecified is False' - ) - assert humanitarian_needs_view_adm_specified.admin2_name == 'District A', ( - 'admin2_name should keep its value when admin1_is_unspecified is False' + adm_1 = HumanitarianNeedsResponse( + resource_hdx_id='17acb541-9431-409a-80a8-50eda7e8ebab', + category='', + sector_code='EDU', + population_status=PopulationStatus.AFFECTED, + population=500000, + reference_period_start=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), + sector_name='Education', + location_code='Foolandia', + location_name='FOO-XXX', + admin1_code='FOO-XXX', + admin1_name='Unspecified', + admin2_code='FOO-XXX-XXX', + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=1, ) - humanitarian_needs_view_adm_unspecified = HumanitarianNeedsResponse( + assert adm_1.admin1_code == 'FOO-XXX' + assert adm_1.admin1_name == 'Province 0 Provider adm1 name' + assert adm_1.admin2_code is None + assert adm_1.admin2_name is None + assert adm_1.admin_level == 1 + + adm_2 = HumanitarianNeedsResponse( resource_hdx_id='17acb541-9431-409a-80a8-50eda7e8ebab', - sector_code='EDU', category='', + sector_code='EDU', population_status=PopulationStatus.AFFECTED, population=500000, reference_period_start=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), @@ -120,31 +133,20 @@ async def test_get_humanitarian_needs_adm_fields(event_loop, refresh_db): sector_name='Education', location_code='Foolandia', location_name='FOO-XXX', - admin1_is_unspecified=True, - admin1_ref=1, - admin2_ref=1, admin1_code='FOO-XXX', admin1_name='Unspecified', - provider_admin1_name='Unspecified', - admin2_is_unspecified=True, - admin2_code='FOO-XXX', + admin2_code='FOO-XXX-XXX', admin2_name='Unspecified', - provider_admin2_name='Unspecified', - location_ref=2, + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=2, ) - assert humanitarian_needs_view_adm_unspecified.admin1_code is None, ( - 'admin1_code should be changed to None when admin1_is_unspecified is True' - ) - assert humanitarian_needs_view_adm_unspecified.admin1_name is None, ( - 'admin1_name should be changed to None when admin1_is_unspecified is True' - ) - assert humanitarian_needs_view_adm_unspecified.admin2_code is None, ( - 'admin2_code should be changed to None when admin1_is_unspecified is True' - ) - assert humanitarian_needs_view_adm_unspecified.admin2_name is None, ( - 'admin2_name should be changed to None when admin1_is_unspecified is True' - ) + assert adm_2.admin1_code == 'FOO-XXX' + assert adm_2.admin1_name == 'Province 0 Provider adm1 name' + assert adm_2.admin2_code == 'FOO-XXX-XXX' + assert adm_2.admin2_name == 'District A Provider adm2 name' + assert adm_2.admin_level == 2 @pytest.mark.asyncio diff --git a/tests/test_endpoints/test_idps_endpoint.py b/tests/test_endpoints/test_idps_endpoint.py index 910ba3fa..e052bd46 100644 --- a/tests/test_endpoints/test_idps_endpoint.py +++ b/tests/test_endpoints/test_idps_endpoint.py @@ -74,9 +74,8 @@ async def test_get_idps_result(event_loop, refresh_db): async def test_get_idps_adm_fields(event_loop, refresh_db): log.info('started test_get_idps_adm_fields') - idps_view_adm_specified = IdpsResponse( + idps_view_adm_0 = IdpsResponse( resource_hdx_id='17acb541-9431-409a-80a8-50eda7e8ebab', - admin2_ref=1, reporting_round=1, assessment_type=DTMAssessmentType.BASELINE, operation='operation', @@ -85,36 +84,22 @@ async def test_get_idps_adm_fields(event_loop, refresh_db): reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), location_code='Foolandia', location_name='FOO-XXX', - admin1_ref=1, admin1_code='FOO-XXX', - admin1_name='Province 01', - provider_admin1_name='Province 01', + admin1_name='Unspecified', admin2_code='FOO-XXX-XXX', - admin2_name='District A', - provider_admin2_name='District A', - location_ref=2, - admin1_is_unspecified=False, - admin2_is_unspecified=False, + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=0, ) + assert idps_view_adm_0.admin1_code is None + assert idps_view_adm_0.admin1_name is None + assert idps_view_adm_0.admin2_code is None + assert idps_view_adm_0.admin2_name is None + assert idps_view_adm_0.admin_level == 0 - assert True - - assert idps_view_adm_specified.admin1_code == 'FOO-XXX', ( - 'admin1_code should keep its value when admin1_is_unspecified is False' - ) - assert idps_view_adm_specified.admin1_name == 'Province 01', ( - 'admin1_name should keep its value when admin1_is_unspecified is False' - ) - assert idps_view_adm_specified.admin2_code == 'FOO-XXX-XXX', ( - 'admin2_code should keep its value when admin1_is_unspecified is False' - ) - assert idps_view_adm_specified.admin2_name == 'District A', ( - 'admin2_name should keep its value when admin1_is_unspecified is False' - ) - - idps_view_adm_unspecified = IdpsResponse( + idps_view_adm_1 = IdpsResponse( resource_hdx_id='17acb541-9431-409a-80a8-50eda7e8ebab', - admin2_ref=1, reporting_round=1, assessment_type=DTMAssessmentType.BASELINE, operation='operation', @@ -123,30 +108,43 @@ async def test_get_idps_adm_fields(event_loop, refresh_db): reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), location_code='Foolandia', location_name='FOO-XXX', - admin1_ref=1, admin1_code='FOO-XXX', - admin1_name='unspecified', - provider_admin1_name='unspecified', + admin1_name='Unspecified', admin2_code='FOO-XXX-XXX', - admin2_name='unspecified', - provider_admin2_name='unspecified', - location_ref=2, - admin1_is_unspecified=True, - admin2_is_unspecified=True, + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=1, ) + assert idps_view_adm_1.admin1_code == 'FOO-XXX' + assert idps_view_adm_1.admin1_name == 'Province 0 Provider adm1 name' + assert idps_view_adm_1.admin2_code is None + assert idps_view_adm_1.admin2_name is None + assert idps_view_adm_1.admin_level == 1 - assert idps_view_adm_unspecified.admin1_code is None, ( - 'admin1_code should be changed to None when admin1_is_unspecified is True' - ) - assert idps_view_adm_unspecified.admin1_name is None, ( - 'admin1_name should be changed to None when admin1_is_unspecified is True' - ) - assert idps_view_adm_unspecified.admin2_code is None, ( - 'admin2_code should be changed to None when admin1_is_unspecified is True' - ) - assert idps_view_adm_unspecified.admin2_name is None, ( - 'admin2_name should be changed to None when admin1_is_unspecified is True' + idps_view_adm_2 = IdpsResponse( + resource_hdx_id='17acb541-9431-409a-80a8-50eda7e8ebab', + reporting_round=1, + assessment_type=DTMAssessmentType.BASELINE, + operation='operation', + population=500000, + reference_period_start=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), + location_code='Foolandia', + location_name='FOO-XXX', + admin1_code='FOO-XXX', + admin1_name='Unspecified', + admin2_code='FOO-XXX-XXX', + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=2, ) + assert idps_view_adm_2.admin1_code == 'FOO-XXX' + assert idps_view_adm_2.admin1_name == 'Province 0 Provider adm1 name' + assert idps_view_adm_2.admin2_code == 'FOO-XXX-XXX' + assert idps_view_adm_2.admin2_name == 'District A Provider adm2 name' + assert idps_view_adm_2.admin_level == 2 @pytest.mark.asyncio @@ -170,5 +168,5 @@ async def test_get_idps_admin_level(event_loop, refresh_db): async with AsyncClient( transport=ASGITransport(app=app), base_url='http://test', params={'admin_level': admin_level} ) as ac: - response = await ac.get(ENDPOINT_ROUTER) - assert len(response.json()['data']) == count, f'Admin level {admin_level} should return {count} entries' + _response = await ac.get(ENDPOINT_ROUTER) + assert len(_response.json()['data']) == count, f'Admin level {admin_level} should return {count} entries' diff --git a/tests/test_endpoints/test_operational_presence_endpoint.py b/tests/test_endpoints/test_operational_presence_endpoint.py index 6244c8f6..be7d39ff 100644 --- a/tests/test_endpoints/test_operational_presence_endpoint.py +++ b/tests/test_endpoints/test_operational_presence_endpoint.py @@ -69,7 +69,7 @@ async def test_get_operational_presence_result(event_loop, refresh_db): async def test_get_operational_presence_adm_fields(event_loop, refresh_db): log.info('started test_get_operational_presence_adm_fields') - operational_presence_view_adm_specified = OperationalPresenceResponse( + adm_0 = OperationalPresenceResponse( sector_code='ABC', resource_hdx_id='test-resource1', org_acronym='ORG01', @@ -77,37 +77,26 @@ async def test_get_operational_presence_adm_fields(event_loop, refresh_db): org_type_code='unimportant', org_type_description='Unimportant', sector_name='Sector Name', - location_ref=1, + reference_period_start=datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + reference_period_end=datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), location_code='Foolandia', location_name='FOO-XXX', - admin1_ref=1, - admin1_is_unspecified=False, admin1_code='FOO-XXX', - admin1_name='Province 01', - provider_admin1_name='Province 01', - admin2_ref=1, - admin2_is_unspecified=False, + admin1_name='Unspecified', admin2_code='FOO-XXX-XXX', - admin2_name='District A', - provider_admin2_name='District A', - reference_period_start=datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), - reference_period_end=datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=0, ) - assert operational_presence_view_adm_specified.admin1_code == 'FOO-XXX', ( - 'admin1_code should keep its value when admin1_is_unspecified is False' - ) - assert operational_presence_view_adm_specified.admin1_name == 'Province 01', ( - 'admin1_name should keep its value when admin1_is_unspecified is False' - ) - assert operational_presence_view_adm_specified.admin2_code == 'FOO-XXX-XXX', ( - 'admin2_code should keep its value when admin1_is_unspecified is False' - ) - assert operational_presence_view_adm_specified.admin2_name == 'District A', ( - 'admin2_name should keep its value when admin1_is_unspecified is False' - ) + assert adm_0.admin1_code is None + assert adm_0.admin1_name is None + assert adm_0.admin2_code is None + assert adm_0.admin2_name is None + assert adm_0.admin_level == 0 - operational_presence_view_adm_unspecified = OperationalPresenceResponse( + adm_1 = OperationalPresenceResponse( sector_code='ABC', resource_hdx_id='test-resource1', org_acronym='ORG01', @@ -115,35 +104,51 @@ async def test_get_operational_presence_adm_fields(event_loop, refresh_db): org_type_code='unimportant', org_type_description='Unimportant', sector_name='Sector Name', - location_ref=1, + reference_period_start=datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + reference_period_end=datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), location_code='Foolandia', location_name='FOO-XXX', - admin1_is_unspecified=True, - admin1_ref=1, admin1_code='FOO-XXX', admin1_name='Unspecified', - provider_admin1_name='Unspecified', - admin2_ref=1, - admin2_is_unspecified=True, admin2_code='FOO-XXX-XXX', admin2_name='Unspecified', - provider_admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=1, + ) + + assert adm_1.admin1_code == 'FOO-XXX' + assert adm_1.admin1_name == 'Province 0 Provider adm1 name' + assert adm_1.admin2_code is None + assert adm_1.admin2_name is None + assert adm_1.admin_level == 1 + + adm_2 = OperationalPresenceResponse( + sector_code='ABC', + resource_hdx_id='test-resource1', + org_acronym='ORG01', + org_name='Organisation 1', + org_type_code='unimportant', + org_type_description='Unimportant', + sector_name='Sector Name', reference_period_start=datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), reference_period_end=datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), + location_code='Foolandia', + location_name='FOO-XXX', + admin1_code='FOO-XXX', + admin1_name='Unspecified', + admin2_code='FOO-XXX-XXX', + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=2, ) - assert operational_presence_view_adm_unspecified.admin1_code is None, ( - 'admin1_code should be changed to None when admin1_is_unspecified is True' - ) - assert operational_presence_view_adm_unspecified.admin1_name is None, ( - 'admin1_name should be changed to None when admin1_is_unspecified is True' - ) - assert operational_presence_view_adm_unspecified.admin2_code is None, ( - 'admin2_code should be changed to None when admin1_is_unspecified is True' - ) - assert operational_presence_view_adm_unspecified.admin2_name is None, ( - 'admin2_name should be changed to None when admin1_is_unspecified is True' - ) + assert adm_2.admin1_code == 'FOO-XXX' + assert adm_2.admin1_name == 'Province 0 Provider adm1 name' + assert adm_2.admin2_code == 'FOO-XXX-XXX' + assert adm_2.admin2_name == 'District A Provider adm2 name' + assert adm_2.admin_level == 2 @pytest.mark.asyncio diff --git a/tests/test_endpoints/test_population_endpoint.py b/tests/test_endpoints/test_population_endpoint.py index d3aeb440..d8738bef 100644 --- a/tests/test_endpoints/test_population_endpoint.py +++ b/tests/test_endpoints/test_population_endpoint.py @@ -63,9 +63,8 @@ async def test_get_population_result(event_loop, refresh_db): @pytest.mark.asyncio async def test_get_population_adm_fields(event_loop, refresh_db): log.info('started test_get_population_adm_fields') - population_view_adm_specified = PopulationResponse( + adm_x = PopulationResponse( resource_hdx_id='foo', - admin2_ref=1, gender=Gender.MALE, age_range='10-14', min_age=10, @@ -73,35 +72,25 @@ async def test_get_population_adm_fields(event_loop, refresh_db): population=100, reference_period_start=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), - location_ref=1, - location_code='FOO', - location_name='Foolandia', - admin1_ref=1, + location_code='Foolandia', + location_name='FOO-XXX', admin1_code='FOO-XXX', - admin1_name='Province 01', - provider_admin1_name='Province 01', - admin1_is_unspecified=False, + admin1_name='Unspecified', admin2_code='FOO-XXX-XXX', - admin2_name='District A', - provider_admin2_name='District A', - admin2_is_unspecified=False, - ) - assert population_view_adm_specified.admin1_code == 'FOO-XXX', ( - 'admin1_code should keep its value when admin1_is_unspecified is False' - ) - assert population_view_adm_specified.admin1_name == 'Province 01', ( - 'admin1_name should keep its value when admin1_is_unspecified is False' - ) - assert population_view_adm_specified.admin2_code == 'FOO-XXX-XXX', ( - 'admin2_code should keep its value when admin1_is_unspecified is False' - ) - assert population_view_adm_specified.admin2_name == 'District A', ( - 'admin2_name should keep its value when admin1_is_unspecified is False' + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=0, ) - population_view_adm_unspecified = PopulationResponse( + assert adm_x.admin1_code is None + assert adm_x.admin1_name is None + assert adm_x.admin2_code is None + assert adm_x.admin2_name is None + assert adm_x.admin_level == 0 + + adm_x = PopulationResponse( resource_hdx_id='foo', - admin2_ref=1, gender=Gender.MALE, age_range='10-14', min_age=10, @@ -109,33 +98,49 @@ async def test_get_population_adm_fields(event_loop, refresh_db): population=100, reference_period_start=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), - location_ref=1, - location_code='FOO', - location_name='Foolandia', - admin1_ref=1, + location_code='Foolandia', + location_name='FOO-XXX', admin1_code='FOO-XXX', admin1_name='Unspecified', - provider_admin1_name='Unspecified', - admin1_is_unspecified=True, admin2_code='FOO-XXX-XXX', admin2_name='Unspecified', - provider_admin2_name='Unspecified', - admin2_is_unspecified=True, + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=1, ) - assert population_view_adm_unspecified.admin1_code is None, ( - 'admin1_code should be changed to None when admin1_is_unspecified is True' - ) - assert population_view_adm_unspecified.admin1_name is None, ( - 'admin1_name should be changed to None when admin1_is_unspecified is True' - ) - assert population_view_adm_unspecified.admin2_code is None, ( - 'admin2_code should be changed to None when admin1_is_unspecified is True' - ) - assert population_view_adm_unspecified.admin2_name is None, ( - 'admin2_name should be changed to None when admin1_is_unspecified is True' + assert adm_x.admin1_code == 'FOO-XXX' + assert adm_x.admin1_name == 'Province 0 Provider adm1 name' + assert adm_x.admin2_code is None + assert adm_x.admin2_name is None + assert adm_x.admin_level == 1 + + adm_x = PopulationResponse( + resource_hdx_id='foo', + gender=Gender.MALE, + age_range='10-14', + min_age=10, + max_age=14, + population=100, + reference_period_start=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), + location_code='Foolandia', + location_name='FOO-XXX', + admin1_code='FOO-XXX', + admin1_name='Unspecified', + admin2_code='FOO-XXX-XXX', + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=2, ) + assert adm_x.admin1_code == 'FOO-XXX' + assert adm_x.admin1_name == 'Province 0 Provider adm1 name' + assert adm_x.admin2_code == 'FOO-XXX-XXX' + assert adm_x.admin2_name == 'District A Provider adm2 name' + assert adm_x.admin_level == 2 + @pytest.mark.asyncio async def test_get_population_admin_level(event_loop, refresh_db): diff --git a/tests/test_endpoints/test_poverty_rate_endpoint.py b/tests/test_endpoints/test_poverty_rate_endpoint.py index 2772f864..fa270d70 100644 --- a/tests/test_endpoints/test_poverty_rate_endpoint.py +++ b/tests/test_endpoints/test_poverty_rate_endpoint.py @@ -1,9 +1,12 @@ import pytest import logging +import datetime from httpx import ASGITransport, AsyncClient +from hdx_hapi.endpoints.models.poverty_rate import PovertyRateResponse from main import app from tests.test_endpoints.endpoint_data import endpoint_data +from tests.util.util import split_items_by_admin_level log = logging.getLogger(__name__) @@ -60,3 +63,76 @@ async def test_get_poverty_rate_result(event_loop, refresh_db): assert len(response.json()['data'][0]) == len(expected_fields), ( 'Response has a different number of fields than expected' ) + + +@pytest.mark.asyncio +async def test_get_poverty_rate_admin_level(event_loop, refresh_db): + log.info('started test_get_poverty_rate_admin_level') + + async with AsyncClient( + transport=ASGITransport(app=app), + base_url='http://test', + ) as ac: + response = await ac.get(ENDPOINT_ROUTER) + + assert len(response.json()['data'][0]) == len(expected_fields), ( + 'Response has a different number of fields than expected' + ) + + response_items = response.json()['data'] + counts_map = split_items_by_admin_level(response_items) + + for item in response_items: + log.info(f'{item["admin1_name"]}') + log.info(counts_map) + for admin_level, count in counts_map.items(): + async with AsyncClient( + transport=ASGITransport(app=app), base_url='http://test', params={'admin_level': admin_level} + ) as ac: + response = await ac.get(ENDPOINT_ROUTER) + assert len(response.json()['data']) == count, f'Admin level {admin_level} should return {count} entries' + + +@pytest.mark.asyncio +async def test_get_poverty_rate_adm_fields(event_loop, refresh_db): + log.info('started test_get_poverty_rate_adm_fields') + adm_x = PovertyRateResponse( + resource_hdx_id='foo', + mpi=0.2212, + headcount_ratio=46.987, + intensity_of_deprivation=49.123, + vulnerable_to_poverty=27.123, + in_severe_poverty=20.321, + reference_period_start=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), + location_code='Foolandia', + location_name='FOO-XXX', + admin1_code='FOO-XXX', + admin1_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + admin_level=0, + ) + assert adm_x.admin1_code is None + assert adm_x.admin1_name is None + assert adm_x.admin_level == 0 + + adm_x = PovertyRateResponse( + resource_hdx_id='foo', + mpi=0.2212, + headcount_ratio=46.987, + intensity_of_deprivation=49.123, + vulnerable_to_poverty=27.123, + in_severe_poverty=20.321, + reference_period_start=datetime.datetime.strptime('2023-01-01 00:00:00', '%Y-%m-%d %H:%M:%S'), + reference_period_end=datetime.datetime.strptime('2023-03-31 23:59:59', '%Y-%m-%d %H:%M:%S'), + location_code='Foolandia', + location_name='FOO-XXX', + admin1_code='FOO-XXX', + admin1_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + admin_level=1, + ) + + assert adm_x.admin1_code == 'FOO-XXX' + assert adm_x.admin1_name == 'Province 0 Provider adm1 name' + assert adm_x.admin_level == 1 diff --git a/tests/test_endpoints/test_wfp_market_endpoint.py b/tests/test_endpoints/test_wfp_market_endpoint.py index 54dbebfb..ceb72db6 100644 --- a/tests/test_endpoints/test_wfp_market_endpoint.py +++ b/tests/test_endpoints/test_wfp_market_endpoint.py @@ -69,76 +69,76 @@ async def test_get_wfp_market_result(event_loop, refresh_db): @pytest.mark.asyncio async def test_get_wpf_markets_adm_fields(event_loop, refresh_db): - log.info('started test_get_population_adm_fields') - wfp_market_view_adm_specified = WfpMarketResponse( + log.info('started test_get_wpf_markets_adm_fields') + adm_x = WfpMarketResponse( code='', name='', lat=1.1, lon=1.1, location_code='Foolandia', location_name='FOO-XXX', - admin1_ref=1, admin1_code='FOO-XXX', - admin1_name='Province 01', - provider_admin1_name='Province 01', - admin2_ref=1, + admin1_name='Unspecified', admin2_code='FOO-XXX-XXX', - admin2_name='District A', - provider_admin2_name='District A', - location_ref=2, - admin1_is_unspecified=False, - admin2_is_unspecified=False, - ) - assert wfp_market_view_adm_specified.admin1_code == 'FOO-XXX', ( - 'admin1_code should keep its value when admin1_is_unspecified is False' - ) - assert wfp_market_view_adm_specified.admin1_name == 'Province 01', ( - 'admin1_name should keep its value when admin1_is_unspecified is False' - ) - assert wfp_market_view_adm_specified.admin2_code == 'FOO-XXX-XXX', ( - 'admin2_code should keep its value when admin1_is_unspecified is False' - ) - assert wfp_market_view_adm_specified.admin2_name == 'District A', ( - 'admin2_name should keep its value when admin1_is_unspecified is False' + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=0, ) + assert adm_x.admin1_code is None + assert adm_x.admin1_name is None + assert adm_x.admin2_code is None + assert adm_x.admin2_name is None + assert adm_x.admin_level == 0 - wfp_market_view_adm_unspecified = WfpMarketResponse( + adm_x = WfpMarketResponse( code='', name='', lat=1.1, lon=1.1, location_code='Foolandia', location_name='FOO-XXX', - admin1_ref=1, admin1_code='FOO-XXX', admin1_name='Unspecified', - provider_admin1_name='Unspecified', - admin2_ref=1, admin2_code='FOO-XXX-XXX', admin2_name='Unspecified', - provider_admin2_name='Unspecified', - location_ref=2, - admin1_is_unspecified=True, - admin2_is_unspecified=True, + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=1, ) - assert wfp_market_view_adm_unspecified.admin1_code is None, ( - 'admin1_code should be changed to None when admin1_is_unspecified is True' - ) - assert wfp_market_view_adm_unspecified.admin1_name is None, ( - 'admin1_name should be changed to None when admin1_is_unspecified is True' - ) - assert wfp_market_view_adm_unspecified.admin2_code is None, ( - 'admin2_code should be changed to None when admin1_is_unspecified is True' - ) - assert wfp_market_view_adm_unspecified.admin2_name is None, ( - 'admin2_name should be changed to None when admin1_is_unspecified is True' + assert adm_x.admin1_code == 'FOO-XXX' + assert adm_x.admin1_name == 'Province 0 Provider adm1 name' + assert adm_x.admin2_code is None + assert adm_x.admin2_name is None + assert adm_x.admin_level == 1 + + adm_x = WfpMarketResponse( + code='', + name='', + lat=1.1, + lon=1.1, + location_code='Foolandia', + location_name='FOO-XXX', + admin1_code='FOO-XXX', + admin1_name='Unspecified', + admin2_code='FOO-XXX-XXX', + admin2_name='Unspecified', + provider_admin1_name='Province 0 Provider adm1 name', + provider_admin2_name='District A Provider adm2 name', + admin_level=2, ) + assert adm_x.admin1_code == 'FOO-XXX' + assert adm_x.admin1_name == 'Province 0 Provider adm1 name' + assert adm_x.admin2_code == 'FOO-XXX-XXX' + assert adm_x.admin2_name == 'District A Provider adm2 name' + assert adm_x.admin_level == 2 + @pytest.mark.asyncio async def test_get_wpf_markets_admin_level(event_loop, refresh_db): - log.info('started test_get_population_admin_level') + log.info('started test_get_wpf_markets_admin_level') async with AsyncClient( transport=ASGITransport(app=app), diff --git a/tests/test_helpers/test_by_introspection.py b/tests/test_helpers/test_by_introspection.py index 1ad0f7af..a789126e 100644 --- a/tests/test_helpers/test_by_introspection.py +++ b/tests/test_helpers/test_by_introspection.py @@ -26,17 +26,17 @@ } GEOGRAPHIC_PARAMETERS = { - 'location_ref', + # 'location_ref', 'location_code', 'location_name', - 'admin1_ref', + # 'admin1_ref', 'admin1_code', 'admin1_name', - 'provider_admin1_name', - 'admin2_ref', + # 'provider_admin1_name', + # 'admin2_ref', 'admin2_code', 'admin2_name', - 'provider_admin2_name', + # 'provider_admin2_name', 'has_hrp', 'in_gho', } @@ -113,7 +113,7 @@ def test_poverty_rate_call_signature(): service_parameters_set = {x for x, _ in service_function_signature.parameters.items()} list_parameters_set = {x for x, _ in list_function_signature.parameters.items()} - assert 'provider_admin1_name' in router_parameters_set + assert 'common_location_params' in router_parameters_set assert router_parameters_set - set(['common_parameters', 'output_format']) == service_parameters_set - set( ['pagination_parameters', 'ref_period_parameters'] diff --git a/tests/util/util.py b/tests/util/util.py index 0a6f7bc3..b3a71833 100644 --- a/tests/util/util.py +++ b/tests/util/util.py @@ -2,33 +2,9 @@ def split_items_by_admin_level(response_items: List[Dict[str, str]]) -> Dict[str, int]: - admin_0_count = len( - [ - item - for item in response_items - if item['admin1_name'] is None - and item['provider_admin1_name'] == '' - and item['admin2_name'] is None - and item['provider_admin2_name'] == '' - ] - ) - admin_1_count = len( - [ - item - for item in response_items - if (item['admin1_name'] is not None or item['provider_admin1_name'] != '') - and item['admin2_name'] is None - and item['provider_admin2_name'] == '' - ] - ) - admin_2_count = len( - [ - item - for item in response_items - if (item['admin1_name'] is not None or item['provider_admin1_name'] != '') - and (item['admin2_name'] is not None or item['provider_admin2_name'] != '') - ] - ) + admin_0_count = len([item for item in response_items if item['admin_level'] == 0]) + admin_1_count = len([item for item in response_items if item['admin_level'] == 1]) + admin_2_count = len([item for item in response_items if item['admin_level'] == 2]) counts_map = { '0': admin_0_count, '1': admin_1_count,