def validate_verification_status(request, error_handler):
    if request.validated['data'].get(
            'status'
    ) == 'verification' and request.context.status == 'composing':
        # Decision validation
        if not any(decision.decisionOf == 'lot'
                   for decision in request.context.decisions):
            raise_operation_error(
                request, error_handler,
                'Can\'t switch to verification while lot decisions not available.'
            )

        # Auction validation
        lot = request.validated['lot']

        auction_error_message = get_auction_validation_result(lot)

        # Raise errors from first and second auction
        if auction_error_message['description']:
            request.errors.add(**auction_error_message)
            request.errors.status = 422
            raise error_handler(request)

        if not lot.relatedProcesses:
            request.errors.add(
                'body', 'mode', 'You can set verification status '
                'only when lot have at least one relatedProcess')
            request.errors.status = 422
            raise error_handler(request)

        if request.errors:
            raise error_handler(request)
def validate_document_operation_in_not_allowed_lot_status(
        request, error_handler, **kwargs):
    status = request.validated['lot_status']
    if status not in ['pending', 'composing']:
        raise_operation_error(
            request, error_handler,
            'Can\'t update document in current ({}) lot status'.format(status))
Ejemplo n.º 3
0
def validate_decision_patch(request, error_handler):
    # Validate second decision because second decision come from asset and can be changed
    is_decisions_available = bool(
        len(request.context.decisions) == 2 or
        len(request.json['data'].get('decisions', [])) == 2
    )
    if request.json['data'].get('status') == 'pending' and not is_decisions_available:
        raise_operation_error(
            request,
            error_handler,
            'Can\'t switch to pending while decisions not available.'
        )

    is_asset_decision_patched_wrong = bool(
        len(request.context.decisions) < 2 or
        (
            request.json['data'].get('decisions') and (
                len(request.json['data']['decisions']) < 2 or
                request.context.decisions[1].serialize() != request.json['data']['decisions'][1]
            )
        )
    )
    if request.context.status == 'pending' and is_asset_decision_patched_wrong:
        raise_operation_error(
            request,
            error_handler,
            'Can\'t update decision that was created from asset')
Ejemplo n.º 4
0
def validate_update_auction_document_in_not_allowed_status(request, error_handler, **kwargs):
    if request.validated['lot_status'] not in ['draft', 'composing', 'pending']:
            raise_operation_error(
                request,
                error_handler,
                'Can\'t update document of auction in current ({}) lot status'.format(request.validated['lot_status'])
            )
Ejemplo n.º 5
0
def validate_update_auction_in_not_allowed_status(request, error_handler, **kwargs):
    is_convoy = bool(request.authenticated_role == 'convoy')
    if not is_convoy and request.validated['lot_status'] not in ['draft', 'composing', 'pending']:
            raise_operation_error(
                request,
                error_handler,
                'Can\'t update auction in current ({}) lot status'.format(request.validated['lot_status'])
            )
Ejemplo n.º 6
0
def validate_verification_status(request, error_handler):
    if request.validated['data'].get(
            'status'
    ) == 'verification' and request.context.status == 'composing':
        # Decision validation
        if not any(decision.decisionOf == 'lot'
                   for decision in request.context.decisions):
            raise_operation_error(
                request, error_handler,
                'Can\'t switch to verification while lot decisions not available.'
            )

        # Auction validation
        lot = request.validated['lot']
        auctions = sorted(lot.auctions, key=lambda a: a.tenderAttempts)
        english = auctions[0]

        auction_error_message = get_auction_validation_result(lot)

        # Raise errors from first and second auction
        if auction_error_message['description']:
            request.errors.add(**auction_error_message)
            request.errors.status = 422
            raise error_handler(request)

        duration = DAYS_AFTER_RECTIFICATION_PERIOD + RECTIFICATION_PERIOD_DURATION

        min_auction_start_date = calculate_business_date(start=get_now(),
                                                         delta=duration,
                                                         context=lot,
                                                         working_days=True)

        auction_period = english.auctionPeriod
        if auction_period and min_auction_start_date > auction_period.startDate:
            request.errors.add(
                'body', 'mode', 'startDate of auctionPeriod must be '
                'at least in {} days after today'.format(duration.days))
            request.errors.status = 422
            raise error_handler(request)

        if not lot.relatedProcesses:
            request.errors.add(
                'body', 'mode', 'You can set verification status '
                'only when lot have at least one relatedProcess')
            request.errors.status = 422
            raise error_handler(request)

        if request.errors:
            raise error_handler(request)
def validate_related_process_operation_in_not_allowed_lot_status(
        request, error_handler, **kwargs):
    status = request.validated['lot_status']
    if request.authenticated_role == 'concierge' and status not in [
            'verification'
    ]:
        raise_operation_error(
            request, error_handler,
            'Can\'t update relatedProcess in current ({}) lot status by concierge'
            .format(status))
    if request.authenticated_role == 'lot_owner' and status not in [
            'draft', 'composing'
    ]:
        raise_operation_error(
            request, error_handler,
            'Can\'t update relatedProcess in current ({}) lot status'.format(
                status))
def validate_pending_status(request, error_handler):
    # Check if at least one decision with type = 'asset' is available in lot.decisions
    # or patching to pending status is going with decisions
    is_decisions_in_context = any(decision.decisionOf == 'asset'
                                  for decision in request.context.decisions)
    is_decision_in_data = any(
        decision['decisionOf'] == 'asset'
        for decision in request.validated['data'].get('decisions', []))

    status_check = bool(request.json['data'].get('status') == 'pending'
                        and request.context.status == 'verification')

    if status_check and not (is_decision_in_data or is_decisions_in_context):
        raise_operation_error(
            request, error_handler,
            'Can\'t switch to pending while decisions not available.')
    if status_check and not request.json['data'].get('items', []):
        raise_operation_error(
            request, error_handler,
            'Can\'t switch to pending while items in asset not available.')
Ejemplo n.º 9
0
def validate_decision_post(request, error_handler, **kwargs):
    if len(request.validated['lot'].decisions) > 1:
        raise_operation_error(request, error_handler,
                              'Can\'t add more than one decisions to lot')