def check_status(request):
    tender = request.validated['tender']
    now = get_now()

    if tender.status == 'active.tendering' and tender.tenderPeriod.endDate <= now and \
            not has_unanswered_complaints(tender) and not has_unanswered_questions(tender):
        for complaint in tender.complaints:
            check_complaint_status(request, complaint)
        LOGGER.info(
            'Switched tender {} to {}'.format(tender['id'],
                                              'active.pre-qualification'),
            extra=context_unpack(
                request,
                {'MESSAGE_ID': 'switched_tender_active.pre-qualification'}))
        tender.status = 'active.pre-qualification'
        tender.qualificationPeriod = type(tender).qualificationPeriod(
            {'startDate': now})
        check_initial_bids_count(request)
        prepare_qualifications(request)
        return

    elif tender.status == 'active.pre-qualification.stand-still' and tender.qualificationPeriod and tender.qualificationPeriod.endDate <= now and not any(
        [
            i.status in tender.block_complaint_status
            for q in tender.qualifications for i in q.complaints
        ]):
        LOGGER.info(
            'Switched tender {} to {}'.format(tender['id'],
                                              'active.stage2.pending'),
            extra=context_unpack(
                request,
                {'MESSAGE_ID': 'switched_tender_active_stage2_pending'}))
        tender.status = 'active.stage2.pending'
        check_initial_bids_count(request)
        return
def check_status(request):
    tender = request.validated['tender']
    now = get_now()

    if tender.status == 'active.tendering' and tender.tenderPeriod.endDate <= now and \
            not has_unanswered_complaints(tender) and not has_unanswered_questions(tender):
        for complaint in tender.complaints:
            check_complaint_status(request, complaint)
        LOGGER.info('Switched tender {} to {}'.format(tender['id'], 'active.pre-qualification'),
                    extra=context_unpack(request, {'MESSAGE_ID': 'switched_tender_active.pre-qualification'}))
        tender.status = 'active.pre-qualification'
        tender.qualificationPeriod = type(tender).qualificationPeriod({'startDate': now})
        check_initial_bids_count(request)
        prepare_qualifications(request)
        return

    elif tender.status == 'active.pre-qualification.stand-still' and tender.qualificationPeriod and tender.qualificationPeriod.endDate <= now and not any([
        i.status in tender.block_complaint_status
        for q in tender.qualifications
        for i in q.complaints
    ]):
        LOGGER.info('Switched tender {} to {}'.format(tender['id'], 'active.stage2.pending'),
                    extra=context_unpack(request, {'MESSAGE_ID': 'switched_tender_active_stage2_pending'}))
        tender.status = 'active.stage2.pending'
        check_initial_bids_count(request)
        return
    def patch(self):
        """Post a qualification resolution
        """
        def set_bid_status(tender, bid_id, status, lotId=None):
            if lotId:
                for bid in tender.bids:
                    if bid.id == bid_id:
                        for lotValue in bid.lotValues:
                            if lotValue.relatedLot == lotId:
                                lotValue.status = status
                                if status in ["pending", "active"]:
                                    bid.status = status
                                return bid
            for bid in tender.bids:
                if bid.id == bid_id:
                    bid.status = status
                    return bid

        tender = self.request.validated["tender"]
        prev_status = self.request.context.status
        apply_patch(self.request,
                    save=False,
                    src=self.request.context.serialize())
        if prev_status != "pending" and self.request.context.status != "cancelled":
            raise_operation_error(
                self.request,
                "Can't update qualification status".format(tender.status))
        if self.request.context.status == "active":
            # approve related bid
            set_bid_status(tender, self.request.context.bidID, "active",
                           self.request.context.lotID)
        elif self.request.context.status == "unsuccessful":
            # cancel related bid
            set_bid_status(tender, self.request.context.bidID, "unsuccessful",
                           self.request.context.lotID)
        elif self.request.context.status == "cancelled":
            # return bid to initial status
            bid = set_bid_status(tender, self.request.context.bidID, "pending",
                                 self.request.context.lotID)
            # generate new qualification for related bid
            ids = prepare_qualifications(self.request,
                                         bids=[bid],
                                         lotId=self.request.context.lotID)
            self.request.response.headers["Location"] = self.request.route_url(
                "{}:Tender Qualification".format(tender.procurementMethodType),
                tender_id=tender.id,
                qualification_id=ids[0],
            )
        if save_tender(self.request):
            self.LOGGER.info(
                "Updated tender qualification {}".format(
                    self.request.context.id),
                extra=context_unpack(
                    self.request,
                    {"MESSAGE_ID": "tender_qualification_patch"}),
            )
            return {"data": self.request.context.serialize("view")}
예제 #4
0
def check_status(request):
    tender = request.validated["tender"]
    now = get_now()

    check_complaint_statuses_at_complaint_period_end(tender, now)
    check_cancellation_status(request, CancelTenderLot)

    if cancellation_block_tender(tender):
        return

    if (tender.status == "active.tendering"
            and tender.tenderPeriod.endDate <= now
            and not has_unanswered_complaints(tender)
            and not has_unanswered_questions(tender)):
        for complaint in tender.complaints:
            check_complaint_status(request, complaint)
        LOGGER.info(
            "Switched tender {} to {}".format(tender["id"],
                                              "active.pre-qualification"),
            extra=context_unpack(
                request,
                {"MESSAGE_ID": "switched_tender_active.pre-qualification"}),
        )
        tender.status = "active.pre-qualification"
        tender.qualificationPeriod = type(tender).qualificationPeriod(
            {"startDate": now})
        check_initial_bids_count(request)
        prepare_qualifications(request)

    elif (tender.status == "active.pre-qualification.stand-still"
          and tender.qualificationPeriod
          and tender.qualificationPeriod.endDate <= now and not any([
              i.status in tender.block_complaint_status
              for q in tender.qualifications for i in q.complaints
          ])):
        LOGGER.info(
            "Switched tender {} to {}".format(tender["id"],
                                              "active.stage2.pending"),
            extra=context_unpack(
                request,
                {"MESSAGE_ID": "switched_tender_active_stage2_pending"}),
        )
        tender.status = "active.stage2.pending"
        check_initial_bids_count(request)
예제 #5
0
    def patch(self):
        """Post a qualification resolution
        """
        def set_bid_status(tender, bid_id, status, lotId=None):
            if lotId:
                for bid in tender.bids:
                    if bid.id == bid_id:
                        for lotValue in bid.lotValues:
                            if lotValue.relatedLot == lotId:
                                lotValue.status = status
                                if status in ['pending', 'active']:
                                    bid.status = status
                                return bid
            for bid in tender.bids:
                if bid.id == bid_id:
                    bid.status = status
                    return bid

        tender = self.request.validated['tender']
        prev_status = self.request.context.status
        apply_patch(self.request,
                    save=False,
                    src=self.request.context.serialize())
        if prev_status != 'pending' and self.request.context.status != 'cancelled':
            raise_operation_error(
                self.request,
                'Can\'t update qualification status'.format(tender.status))
        if self.request.context.status == 'active':
            # approve related bid
            set_bid_status(tender, self.request.context.bidID, 'active',
                           self.request.context.lotID)
        elif self.request.context.status == 'unsuccessful':
            # cancel related bid
            set_bid_status(tender, self.request.context.bidID, 'unsuccessful',
                           self.request.context.lotID)
        elif self.request.context.status == 'cancelled':
            # return bid to initial status
            bid = set_bid_status(tender, self.request.context.bidID, 'pending',
                                 self.request.context.lotID)
            # generate new qualification for related bid
            ids = prepare_qualifications(self.request,
                                         bids=[bid],
                                         lotId=self.request.context.lotID)
            self.request.response.headers['Location'] = self.request.route_url(
                '{}:Tender Qualification'.format(tender.procurementMethodType),
                tender_id=tender.id,
                qualification_id=ids[0])
        if save_tender(self.request):
            self.LOGGER.info('Updated tender qualification {}'.format(
                self.request.context.id),
                             extra=context_unpack(
                                 self.request,
                                 {'MESSAGE_ID': 'tender_qualification_patch'}))
            return {'data': self.request.context.serialize("view")}
    def patch(self):
        """Post a qualification resolution
        """
        def set_bid_status(tender, bid_id, status, lotId=None):
            if lotId:
                for bid in tender.bids:
                    if bid.id == bid_id:
                        for lotValue in bid.lotValues:
                            if lotValue.relatedLot == lotId:
                                lotValue.status = status
                                return bid
            for bid in tender.bids:
                if bid.id == bid_id:
                    bid.status = status
                    return bid
        tender = self.request.validated['tender']
        if tender.status not in ['active.pre-qualification']:
            self.request.errors.add('body', 'data', 'Can\'t update qualification in current ({}) tender status'.format(tender.status))
            self.request.errors.status = 403
            return
        if self.request.context.status == 'cancelled':
            self.request.errors.add('body', 'data', 'Can\'t update qualification in current cancelled qualification status')
            self.request.errors.status = 403
            return

        prev_status = self.request.context.status
        apply_patch(self.request, save=False, src=self.request.context.serialize())
        if prev_status != 'pending' and self.request.context.status != 'cancelled':
            self.request.errors.add('body', 'data', 'Can\'t update qualification status'.format(tender.status))
            self.request.errors.status = 403
            return
        if self.request.context.status == 'active':
            # approve related bid
            set_bid_status(tender, self.request.context.bidID, 'active', self.request.context.lotID)
        elif self.request.context.status == 'unsuccessful':
            # cancel related bid
            set_bid_status(tender, self.request.context.bidID, 'unsuccessful', self.request.context.lotID)
        elif self.request.context.status == 'cancelled':
            # return bid to initial status
            bid = set_bid_status(tender, self.request.context.bidID, 'pending', self.request.context.lotID)
            # generate new qualification for related bid
            ids = prepare_qualifications(self.request, bids=[bid], lotId=self.request.context.lotID)
            self.request.response.headers['Location'] = self.request.route_url('TenderEU Qualification',
                                                                               tender_id=tender.id,
                                                                               qualification_id=ids[0])
        if save_tender(self.request):
            self.LOGGER.info('Updated tender qualification {}'.format(self.request.context.id),
                        extra=context_unpack(self.request, {'MESSAGE_ID': 'tender_qualification_patch'}))
            return {'data': self.request.context.serialize("view")}