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)
Example #2
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_verification_status(request, error_handler):
    if request.validated['data'].get(
            'status'
    ) == 'verification' and request.context.status == 'composing':
        lot = request.validated['lot']
        auctions = sorted(lot.auctions, key=lambda a: a.tenderAttempts)
        english = auctions[0]
        second_english = auctions[1]

        required_fields = [
            'value', 'minimalStep', 'auctionPeriod', 'guarantee'
        ]
        if not all(english[field] for field in required_fields):
            request.errors.add(
                'body', 'data',
                'Can\'t switch lot to verification status from composing until '
                'these fields are empty {} within the auctions'.format(
                    required_fields))
            request.errors.status = 422

        required_fields = ['tenderingDuration']
        if not all(second_english[field] for field in required_fields):
            request.errors.add(
                'body', 'data',
                'Can\'t switch lot to verification status from composing until '
                'these fields are empty {} within the second (english) auction'
                .format(required_fields))
            request.errors.status = 422

        if request.errors:
            raise error_handler(request)
def validate_decision_by_decisionOf(request, error_handler, **kwargs):
    decision = request.validated['decision']
    if decision.decisionOf != 'lot':
        request.errors.add(
            'body', 'mode',
            'Can edit only decisions which have decisionOf equal to \'lot\'.')
        request.errors.status = 403
        raise error_handler(request)
def rectificationPeriod_item_validation(request, error_handler, **kwargs):
    if bool(request.validated['lot'].rectificationPeriod and
            request.validated['lot'].rectificationPeriod.endDate < get_now()):
        request.errors.add(
            'body', 'mode',
            'You can\'t change items after rectification period')
        request.errors.status = 403
        raise error_handler(request)
def rectificationPeriod_auction_document_validation(request, error_handler,
                                                    **kwargs):
    is_period_ended = bool(
        request.validated['lot'].rectificationPeriod
        and request.validated['lot'].rectificationPeriod.endDate < get_now())
    if is_period_ended and request.method == 'POST':
        request.errors.add(
            'body', 'mode',
            'You can\'t add documents to auction after rectification period')
        request.errors.status = 403
        raise error_handler(request)

    if is_period_ended and request.method in ['PUT', 'PATCH']:
        request.errors.add(
            'body', 'mode',
            'You can\'t change documents after rectification period')
        request.errors.status = 403
        raise error_handler(request)
def rectificationPeriod_auction_validation(request, error_handler, **kwargs):
    is_rectificationPeriod_finished = bool(
        request.validated['lot'].rectificationPeriod
        and request.validated['lot'].rectificationPeriod.endDate < get_now())
    if request.authenticated_role != 'convoy' and is_rectificationPeriod_finished:
        request.errors.add(
            'body', 'mode',
            'You can\'t change auctions after rectification period')
        request.errors.status = 403
        raise error_handler(request)
def validate_file_upload(request, **kwargs):
    update_logging_context(request, {'document_id': '__new__'})
    if request.registry.use_docservice and request.content_type == "application/json":
        return validate_document_data(request)
    if 'file' not in request.POST or not hasattr(request.POST['file'],
                                                 'filename'):
        request.errors.add('body', 'file', 'Not Found')
        request.errors.status = 404
        raise error_handler(request)
    else:
        request.validated['file'] = request.POST['file']
def rectificationPeriod_document_validation(request, error_handler, **kwargs):
    is_period_ended = bool(
        request.validated['lot'].rectificationPeriod
        and request.validated['lot'].rectificationPeriod.endDate < get_now())
    if bool(
        (is_period_ended and
         request.validated['document'].documentType != 'cancellationDetails')
            and request.method == 'POST'):
        request.errors.add(
            'body', 'mode',
            'You can add only document with cancellationDetails after rectification period'
        )
        request.errors.status = 403
        raise error_handler(request)

    if is_period_ended and request.method in ['PUT', 'PATCH']:
        request.errors.add(
            'body', 'mode',
            'You can\'t change documents after rectification period')
        request.errors.status = 403
        raise error_handler(request)
def validate_deleted_status(request, error_handler):
    can_be_deleted = any([
        doc.documentType == 'cancellationDetails'
        for doc in request.context['documents']
    ])
    if request.json['data'].get(
            'status') == 'pending.deleted' and not can_be_deleted:
        request.errors.add(
            'body', 'mode', "You can set deleted status "
            "only when lot have at least one document with \'cancellationDetails\' documentType"
        )
        request.errors.status = 403
        raise error_handler(request)