From faf39bae41cacbbccb6a77175fe2254077a0218c Mon Sep 17 00:00:00 2001 From: Stuart Campbell Date: Tue, 30 Apr 2024 18:05:57 -0400 Subject: [PATCH 1/6] refactor: Update facility_service to set current operating cycle --- src/nsls2api/services/facility_service.py | 37 +++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/nsls2api/services/facility_service.py b/src/nsls2api/services/facility_service.py index 359e1161..00edcdd5 100644 --- a/src/nsls2api/services/facility_service.py +++ b/src/nsls2api/services/facility_service.py @@ -95,6 +95,43 @@ async def current_operating_cycle(facility: str) -> Optional[str]: return cycle.name +async def set_current_operating_cycle(facility: str, cycle: str) -> Optional[str]: + """ + Set Current Operating Cycle + + This method sets the current operating cycle for a given facility. + + :param facility: The facility name (str). + :param cycle: The cycle name (str). + :return: The current operating cycle (str) or None if no current operating cycle is found. + """ + new_current_cycle = await Cycle.find_one( + Cycle.facility == facility, + Cycle.name == cycle, + ) + + if new_current_cycle is None: + return None + + # Now find previous current operating cycle. + previous_cycle = await Cycle.find_one( + Cycle.facility == facility, + Cycle.is_current_operating_cycle == True, # noqa: E712 + ) + + if previous_cycle is not None: + await previous_cycle.set({Cycle.is_current_operating_cycle: False}) + + await new_current_cycle.set({Cycle.is_current_operating_cycle: True}) + + # Let's now check all is well with the world + expected_current_cycle = await current_operating_cycle(facility) + if str(expected_current_cycle) != cycle: + logger.error(f"Failed to set the current operating cycle for {facility} to be {cycle}.") + return None + + return expected_current_cycle + async def is_healthy(facility: str) -> bool: """ From 8311cc01858c33e75e1d19fc122147df16e1c57b Mon Sep 17 00:00:00 2001 From: Stuart Campbell Date: Tue, 30 Apr 2024 18:06:29 -0400 Subject: [PATCH 2/6] refactor: Add API endpoint to set current operating cycle for facility --- src/nsls2api/api/v1/facility_api.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/nsls2api/api/v1/facility_api.py b/src/nsls2api/api/v1/facility_api.py index 59493888..09d74faa 100644 --- a/src/nsls2api/api/v1/facility_api.py +++ b/src/nsls2api/api/v1/facility_api.py @@ -1,16 +1,19 @@ +from typing import Annotated import fastapi +from fastapi import Depends + from nsls2api.api.models.facility_model import ( FacilityName, FacilityCyclesResponseModel, FacilityCurrentOperatingCycleResponseModel, ) +from nsls2api.infrastructure.security import validate_admin_role from nsls2api.services import proposal_service, facility_service router = fastapi.APIRouter() -# TODO: Add back into schema when implemented. @router.get( "/facility/{facility}/cycles/current", response_model=FacilityCurrentOperatingCycleResponseModel, @@ -36,6 +39,24 @@ async def get_current_operating_cycle(facility: FacilityName): return response_model +@router.post("/facility/{facility}/cycles/current", + response_model=FacilityCurrentOperatingCycleResponseModel, dependencies=[Depends(validate_admin_role)],) +async def set_current_operating_cycle(facility: FacilityName, cycle: str,): + current_cycle = await facility_service.set_current_operating_cycle(facility.name, cycle) + if current_cycle is None: + return fastapi.responses.JSONResponse( + { + "error": f"Failed to set the current operating cycle for facility {facility.name}" + }, + status_code=404, + ) + + response_model = FacilityCurrentOperatingCycleResponseModel( + facility=facility.name, cycle=current_cycle + ) + + return response_model + @router.get( "/facility/{facility}/cycles", From 0fd2750a5026068ff3ffb3ed99e9ba05d60ada0f Mon Sep 17 00:00:00 2001 From: Stuart Campbell Date: Wed, 1 May 2024 08:17:40 -0400 Subject: [PATCH 3/6] Small addition check for bad data stored in db --- src/nsls2api/services/proposal_service.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/nsls2api/services/proposal_service.py b/src/nsls2api/services/proposal_service.py index 70675cbf..47d2cafa 100644 --- a/src/nsls2api/services/proposal_service.py +++ b/src/nsls2api/services/proposal_service.py @@ -80,6 +80,11 @@ async def fetch_proposals_for_cycle(cycle: str) -> list[str]: cycle = await Cycle.find_one(Cycle.name == cycle) if cycle is None: raise LookupError(f"Cycle {cycle} not found") + + # In case a 'None' has crept into the database + if cycle.proposals is None: + return [] + return cycle.proposals @@ -549,7 +554,7 @@ async def synchronize_proposal_from_pass(proposal_id: int) -> None: user_list.append(pi_info) data_session = generate_data_session_for_proposal(proposal_id) - + proposal = Proposal( proposal_id=str(pass_proposal.Proposal_ID), title=pass_proposal.Title, @@ -643,12 +648,13 @@ async def worker_update_cycle_information( ) -> None: start_time = datetime.datetime.now() - #TODO: Add test that cycle and facility combination is valid - + # TODO: Add test that cycle and facility combination is valid if cycle: # If we've specified a cycle then only sync that one - cycles = await Cycle.find(Cycle.name == str(cycle), Cycle.facility == facility).to_list() + cycles = await Cycle.find( + Cycle.name == str(cycle), Cycle.facility == facility + ).to_list() else: cycles = await Cycle.find(Cycle.facility == facility).to_list() From d1ec71078a7f1ac62d9ea18105f56c8437f6e758 Mon Sep 17 00:00:00 2001 From: Stuart Campbell Date: Tue, 20 Aug 2024 14:35:30 -0400 Subject: [PATCH 4/6] Update src/nsls2api/services/facility_service.py Co-authored-by: Padraic Shafer <76011594+padraic-shafer@users.noreply.github.com> --- src/nsls2api/services/facility_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nsls2api/services/facility_service.py b/src/nsls2api/services/facility_service.py index 00edcdd5..c2cdeeae 100644 --- a/src/nsls2api/services/facility_service.py +++ b/src/nsls2api/services/facility_service.py @@ -116,7 +116,7 @@ async def set_current_operating_cycle(facility: str, cycle: str) -> Optional[str # Now find previous current operating cycle. previous_cycle = await Cycle.find_one( Cycle.facility == facility, - Cycle.is_current_operating_cycle == True, # noqa: E712 + Cycle.is_current_operating_cycle is True, ) if previous_cycle is not None: From fc77c8fb63a69e77f4486cc35ecd375f248a8ef2 Mon Sep 17 00:00:00 2001 From: Stuart Campbell Date: Tue, 20 Aug 2024 14:36:20 -0400 Subject: [PATCH 5/6] Update src/nsls2api/services/facility_service.py Co-authored-by: Padraic Shafer <76011594+padraic-shafer@users.noreply.github.com> --- src/nsls2api/services/facility_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nsls2api/services/facility_service.py b/src/nsls2api/services/facility_service.py index c2cdeeae..2b2bf02c 100644 --- a/src/nsls2api/services/facility_service.py +++ b/src/nsls2api/services/facility_service.py @@ -113,7 +113,7 @@ async def set_current_operating_cycle(facility: str, cycle: str) -> Optional[str if new_current_cycle is None: return None - # Now find previous current operating cycle. + # Now find previous "current operating cycle". previous_cycle = await Cycle.find_one( Cycle.facility == facility, Cycle.is_current_operating_cycle is True, From 7f860d5c726c62bd098cf75d714348a42ad4cb64 Mon Sep 17 00:00:00 2001 From: Stuart Campbell Date: Tue, 20 Aug 2024 14:37:07 -0400 Subject: [PATCH 6/6] Update src/nsls2api/services/proposal_service.py Co-authored-by: Padraic Shafer <76011594+padraic-shafer@users.noreply.github.com> --- src/nsls2api/services/proposal_service.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/nsls2api/services/proposal_service.py b/src/nsls2api/services/proposal_service.py index 47d2cafa..0c02fad2 100644 --- a/src/nsls2api/services/proposal_service.py +++ b/src/nsls2api/services/proposal_service.py @@ -81,11 +81,7 @@ async def fetch_proposals_for_cycle(cycle: str) -> list[str]: if cycle is None: raise LookupError(f"Cycle {cycle} not found") - # In case a 'None' has crept into the database - if cycle.proposals is None: - return [] - - return cycle.proposals + return cycle.proposals or [] async def fetch_data_sessions_for_username(username: str) -> list[str]: