"""Contract Lifecycle Schedule Detail Blueprint.""" from abacus_common_logic.views.item_view import ItemView from flask import Blueprint from flask import request from owsrequest import flask_request from owsresponse import response from owsresponse.adaptors.flask import flaskify from abacus_contract.constants.error import ERROR_CODE_AUTHORIZATION, ERROR_INVALID_IDS from abacus_contract.logic import contract_lifecycle_schedule_detail as logic from abacus_contract.models.contract_lifecycle_schedule_detail import \ ContractLifecycleScheduleDetail from abacus_contract.schemas.contract_lifecycle_schedule_detail import \ ContractLifecycleScheduleDetailSchema from abacus_contract.utils.authorization import pdp_authorize_resource from abacus_contract.utils.format_error import validation_error from abacus_contract.utils.request import get_optional_numeric_list_from_params contract_lifecycle_schedule_detail_api = Blueprint( 'contract_lifecycle_schedule_detail_api', __name__ ) class ContractLifecycleScheduleDetailItemView(ItemView): """View for finding a contract lifecycle schedule detail by ID.""" model_class = ContractLifecycleScheduleDetail object_detail_schema = ContractLifecycleScheduleDetailSchema() def get(self, object_id, **kwargs): """GET Contract lifecycle schedule detail item by ID.""" access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify(response.create_error_response( code=ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=401, )) return super().get(object_id, **kwargs) contract_lifecycle_schedule_detail_api.add_url_rule( '/contract-lifecycle-schedule-detail/', methods=['GET'], view_func=ContractLifecycleScheduleDetailItemView.as_view( 'contract_lifecycle_schedule_detail' ) ) @contract_lifecycle_schedule_detail_api.route( '/contract-lifecycle-schedule-detail/dataloader', methods=['POST'] ) def get_contract_lifecycle_schedule_details_by_ids(): """Get contract lifecycle schedule details by a list of ids. Note: This endpoint uses a POST method to allow for a list of ids to be passed in the body of the request. """ try: contract_lifecycle_schedule_detail_ids = get_optional_numeric_list_from_params() except ValueError: return flaskify( validation_error( ERROR_INVALID_IDS.format(object='ContractLifecycleScheduleDetail') ) ) access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: authorized = pdp_authorize_resource( # Id of 0 means "all reference transaction types" # This resource type is all or nothing, permissions-wise. resource_id=0, resource_type='contract_lifecycle_schedule_detail' ) if not authorized: return flaskify(response.create_error_response( code=ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, )) return flaskify(logic.get_contract_lifecycle_schedule_details_by_ids( contract_lifecycle_schedule_detail_ids ))