Skip to content

Commit

Permalink
Merge pull request #96 from OCHA-DAP/feature/HDX-9830-3w-and-funding
Browse files Browse the repository at this point in the history
PR Feature/HDX-9830 3w and funding
  • Loading branch information
danmihaila authored May 20, 2024
2 parents 2896670 + 200b8a1 commit 2c135eb
Show file tree
Hide file tree
Showing 20 changed files with 506 additions and 307 deletions.
57 changes: 57 additions & 0 deletions hdx_hapi/db/dao/funding_view_dao.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import logging
from typing import Optional, Sequence

from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select

from hdx_hapi.db.models.views.all_views import FundingView
from hdx_hapi.db.dao.util.util import apply_pagination, apply_reference_period_filter, case_insensitive_filter
from hdx_hapi.endpoints.util.util import PaginationParams, ReferencePeriodParameters


logger = logging.getLogger(__name__)


async def funding_view_list(
pagination_parameters: PaginationParams,
ref_period_parameters: ReferencePeriodParameters,
db: AsyncSession,
appeal_code: Optional[str] = None,
appeal_type: Optional[str] = None,
org_acronym: Optional[str] = None,
org_name: Optional[str] = None,
sector_name: Optional[str] = None,
# location_ref: Optional[int] = None,
location_code: Optional[str] = None,
location_name: Optional[str] = None,
) -> Sequence[FundingView]:
query = select(FundingView)
if org_acronym:
query = case_insensitive_filter(query, FundingView.org_acronym, org_acronym)
if org_name:
query = query.where(FundingView.org_name.icontains(org_name))
if sector_name:
query = query.where(FundingView.sector_name.icontains(sector_name))
# if location_ref:
# query = query.where(FundingView.location_ref == location_ref)
if location_code:
query = case_insensitive_filter(query, FundingView.location_code, location_code)
if location_name:
query = query.where(FundingView.location_name.icontains(location_name))
if appeal_code:
query = case_insensitive_filter(query, FundingView.appeal_code, appeal_code)
if appeal_type:
query = case_insensitive_filter(query, FundingView.appeal_type, appeal_type)

query = apply_reference_period_filter(query, ref_period_parameters, FundingView)

query = apply_pagination(query, pagination_parameters)

logger.debug(f'Executing SQL query: {query}')

result = await db.execute(query)
funding = result.scalars().all()

logger.info(f'Retrieved {len(funding)} rows from the database')

return funding
79 changes: 42 additions & 37 deletions hdx_hapi/db/dao/operational_presence_view_dao.py
Original file line number Diff line number Diff line change
@@ -1,86 +1,91 @@
import logging
from datetime import datetime

from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select

from hdx_hapi.db.models.views.db_operational_presence_view import OperationalPresenceView
from hdx_hapi.db.dao.util.util import apply_pagination, case_insensitive_filter
from hdx_hapi.endpoints.util.util import PaginationParams
from hdx_hapi.db.models.views.all_views import OperationalPresenceView
from hdx_hapi.db.dao.util.util import apply_pagination, apply_reference_period_filter, case_insensitive_filter
from hdx_hapi.endpoints.util.util import PaginationParams, ReferencePeriodParameters


logger = logging.getLogger(__name__)


async def operational_presences_view_list(
pagination_parameters: PaginationParams,
ref_period_parameters: ReferencePeriodParameters,
db: AsyncSession,
sector_code: str = None,
dataset_hdx_provider_stub: str = None,
resource_update_date_min: datetime = None,
resource_update_date_max: datetime = None,
hapi_updated_date_min: datetime = None,
hapi_updated_date_max: datetime = None,
hapi_replaced_date_min: datetime = None,
hapi_replaced_date_max: datetime = None,
# dataset_hdx_provider_stub: str = None,
# resource_update_date_min: datetime = None,
# resource_update_date_max: datetime = None,
# hapi_updated_date_min: datetime = None,
# hapi_updated_date_max: datetime = None,
# hapi_replaced_date_min: datetime = None,
# hapi_replaced_date_max: datetime = None,
org_acronym: str = None,
org_name: str = None,
sector_name: str = None,
location_code: str = None,
location_name: str = None,
admin1_ref: int = None,
admin1_code: str = None,
admin1_name: str = None,
admin1_is_unspecified: bool = None,
location_ref: int = None,
admin2_ref: int = None,
admin2_code: str = None,
admin2_name: str = None,
admin2_is_unspecified: bool = None,
admin1_ref: int = None,
):
logger.info(
f'operational_presences_view_list called with params: sector_code={sector_code}, '
f'dataset_hdx_provider_stub={dataset_hdx_provider_stub}, resource_update_date_min={resource_update_date_min}, '
f'resource_update_date_max={resource_update_date_max}, org_acronym={org_acronym}, org_name={org_name}, '
f'org_acronym={org_acronym}, org_name={org_name}, '
f'sector_name={sector_name}, location_code={location_code}, location_name={location_name}, '
f'admin1_code={admin1_code}, admin1_name={admin1_name}, admin1_is_unspecified={admin1_is_unspecified}, '
f'admin2_code={admin2_code}, admin2_name={admin2_name}, admin2_is_unspecified={admin2_is_unspecified}'
f'admin2_code={admin2_code}, admin2_name={admin2_name}, admin2_is_unspecified={admin2_is_unspecified}, '
f'ref_period_parameters={ref_period_parameters}'
)

query = select(OperationalPresenceView)
if sector_code:
query = query.where(OperationalPresenceView.sector_code.icontains(sector_code))
if dataset_hdx_provider_stub:
query = case_insensitive_filter(
query, OperationalPresenceView.dataset_hdx_provider_stub, dataset_hdx_provider_stub
)
if resource_update_date_min:
query = query.where(OperationalPresenceView.resource_update_date >= resource_update_date_min)
if resource_update_date_max:
query = query.where(OperationalPresenceView.resource_update_date < resource_update_date_max)
if hapi_updated_date_min:
query = query.where(OperationalPresenceView.hapi_updated_date >= hapi_updated_date_min)
if hapi_updated_date_max:
query = query.where(OperationalPresenceView.hapi_updated_date < hapi_updated_date_max)
if hapi_replaced_date_min:
query = query.where(OperationalPresenceView.hapi_replaced_date >= hapi_replaced_date_min)
if hapi_replaced_date_max:
query = query.where(OperationalPresenceView.hapi_replaced_date < hapi_replaced_date_max)
# if dataset_hdx_provider_stub:
# query = case_insensitive_filter(
# query, OperationalPresenceView.dataset_hdx_provider_stub, dataset_hdx_provider_stub
# )
# if resource_update_date_min:
# query = query.where(OperationalPresenceView.resource_update_date >= resource_update_date_min)
# if resource_update_date_max:
# query = query.where(OperationalPresenceView.resource_update_date < resource_update_date_max)
# if hapi_updated_date_min:
# query = query.where(OperationalPresenceView.hapi_updated_date >= hapi_updated_date_min)
# if hapi_updated_date_max:
# query = query.where(OperationalPresenceView.hapi_updated_date < hapi_updated_date_max)
# if hapi_replaced_date_min:
# query = query.where(OperationalPresenceView.hapi_replaced_date >= hapi_replaced_date_min)
# if hapi_replaced_date_max:
# query = query.where(OperationalPresenceView.hapi_replaced_date < hapi_replaced_date_max)
if org_acronym:
query = case_insensitive_filter(query, OperationalPresenceView.org_acronym, org_acronym)
if org_name:
query = query.where(OperationalPresenceView.org_name.icontains(org_name))
if sector_code:
query = query.where(OperationalPresenceView.sector_code.icontains(sector_code))
if sector_name:
query = query.where(OperationalPresenceView.sector_name.icontains(sector_name))
if location_ref:
query = query.where(OperationalPresenceView.location_ref == location_ref)
if location_code:
query = case_insensitive_filter(query, OperationalPresenceView.location_code, location_code)
if location_name:
query = query.where(OperationalPresenceView.location_name.icontains(location_name))
if admin1_ref:
query = query.where(OperationalPresenceView.admin1_ref == admin1_ref)
if admin1_code:
query = case_insensitive_filter(query, OperationalPresenceView.admin1_code, admin1_code)
if admin1_name:
query = query.where(OperationalPresenceView.admin1_name.icontains(admin1_name))
if location_ref:
query = query.where(OperationalPresenceView.location_ref == location_ref)
if admin2_ref:
query = query.where(OperationalPresenceView.admin2_ref == admin2_ref)
if admin2_code:
query = case_insensitive_filter(query, OperationalPresenceView.admin2_code, admin2_code)
if admin2_name:
Expand All @@ -89,8 +94,8 @@ async def operational_presences_view_list(
query = query.where(OperationalPresenceView.admin1_is_unspecified == admin1_is_unspecified)
if admin2_is_unspecified is not None:
query = query.where(OperationalPresenceView.admin2_is_unspecified == admin2_is_unspecified)
if admin1_ref:
query = query.where(OperationalPresenceView.admin1_ref == admin1_ref)

query = apply_reference_period_filter(query, ref_period_parameters, OperationalPresenceView)

query = apply_pagination(query, pagination_parameters)

Expand Down
60 changes: 60 additions & 0 deletions hdx_hapi/endpoints/get_funding.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from typing import Annotated, Optional
from fastapi import APIRouter, Depends, Query

from sqlalchemy.ext.asyncio import AsyncSession

from hdx_hapi.config.doc_snippets import DOC_LOCATION_CODE, DOC_LOCATION_NAME, DOC_SEE_LOC
from hdx_hapi.endpoints.models.base import HapiGenericResponse
from hdx_hapi.endpoints.models.funding import FundingResponse
from hdx_hapi.endpoints.util.util import (
CommonEndpointParams,
OutputFormat,
ReferencePeriodParameters,
common_endpoint_parameters,
reference_period_parameters,
)
from hdx_hapi.services.csv_transform_logic import transform_result_to_csv_stream_if_requested
from hdx_hapi.services.funding_logic import get_funding_srv
from hdx_hapi.services.sql_alchemy_session import get_db


router = APIRouter(
tags=['Funding'],
)


@router.get(
'/api/coordination-context/funding',
response_model=HapiGenericResponse[FundingResponse],
summary='Funding endpoint',
include_in_schema=False,
)
@router.get(
'/api/v1/coordination-context/funding',
response_model=HapiGenericResponse[FundingResponse],
summary='Funding endpoint',
)
async def get_fundings(
ref_period_parameters: Annotated[ReferencePeriodParameters, Depends(reference_period_parameters)],
common_parameters: Annotated[CommonEndpointParams, Depends(common_endpoint_parameters)],
db: AsyncSession = Depends(get_db),
appeal_code: Annotated[Optional[str], Query(max_length=32, description='Appeal code')] = None,
appeal_type: Annotated[Optional[str], Query(max_length=32, description='Appeal type')] = 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,
output_format: OutputFormat = OutputFormat.JSON,
):
result = await get_funding_srv(
pagination_parameters=common_parameters,
ref_period_parameters=ref_period_parameters,
db=db,
appeal_code=appeal_code,
appeal_type=appeal_type,
location_code=location_code,
location_name=location_name,
)
return transform_result_to_csv_stream_if_requested(result, output_format, FundingResponse)
Loading

0 comments on commit 2c135eb

Please sign in to comment.