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")}
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)
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")}