def act(self): """ After the auction results have come in bids wich didn`t do rate change status to 'invalid' """ # invalidate bids after auction context = self.context context.auctionPeriod['endDate'] = get_now() auction_value = context.value.amount invalid_bids = [ bid for bid in context.bids if bid.value.amount == auction_value ] for bid in invalid_bids: bid.status = 'invalid' # check if there is a winner # if not, then switch procedure to 'unsuccessful' status if any([bid.status == 'active' for bid in self.context.bids]): # get awarding reg = get_current_registry() awarding = reg.queryMultiAdapter((self.context, self.request), IContentConfigurator) awarding.start_awarding() else: self.context.status = 'unsuccessful' log_auction_status_change(self.request, self.context, self.context.status)
def check_status(request): auction = request.validated['auction'] now = get_now() for complaint in auction.complaints: check_complaint_status(request, complaint, now) for award in auction.awards: request.content_configurator.check_award_status(request, award, now) for complaint in award.complaints: check_complaint_status(request, complaint, now) if not auction.lots and auction.status == 'active.tendering' and auction.tenderPeriod.endDate <= now: auction.status = 'active.auction' remove_draft_bids(request) check_bids(request) log_auction_status_change(request, auction, auction.status) if auction.numberOfBids < 2 and auction.auctionPeriod: auction.auctionPeriod.startDate = None return elif auction.lots and auction.status == 'active.tendering' and auction.tenderPeriod.endDate <= now: auction.status = 'active.auction' remove_draft_bids(request) check_bids(request) log_auction_status_change(request, auction, auction.status) [ setattr(i.auctionPeriod, 'startDate', None) for i in auction.lots if i.numberOfBids < 2 and i.auctionPeriod ] return elif not auction.lots and auction.status == 'active.awarded': standStillEnds = [ a.complaintPeriod.endDate.astimezone(TZ) for a in auction.awards if a.complaintPeriod.endDate ] if not standStillEnds: return standStillEnd = max(standStillEnds) if standStillEnd <= now: check_auction_status(request) elif auction.lots and auction.status in [ 'active.qualification', 'active.awarded' ]: if any([ i['status'] in auction.block_complaint_status and i.relatedLot is None for i in auction.complaints ]): return for lot in auction.lots: if lot['status'] != 'active': continue lot_awards = [i for i in auction.awards if i.lotID == lot.id] standStillEnds = [ a.complaintPeriod.endDate.astimezone(TZ) for a in lot_awards if a.complaintPeriod.endDate ] if not standStillEnds: continue standStillEnd = max(standStillEnds) if standStillEnd <= now: check_auction_status(request) return
def act(self): auction = self.request.auction # pendify auction status status = 'cancelled' auction.status = status log_auction_status_change(self.request, self.context, status) # clean bids after cancellation procedure auction_status = self.request.validated['auction_src']['status'] if auction_status in AUCTION_STATUSES_FOR_CLEAN_BIDS_IN_CANCELLATION: auction.bids = []
def check_auction_status(request): auction = request.validated['auction'] adapter = request.registry.getAdapter(auction, IAuctionManager) if auction.awards: awards_statuses = set([award.status for award in auction.awards]) else: awards_statuses = set([""]) if not awards_statuses.difference(set(['unsuccessful', 'cancelled'])): adapter.pendify_auction_status('unsuccessful') log_auction_status_change(request, auction, auction.status) if auction.contracts and auction.contracts[-1].status == 'active': adapter.pendify_auction_status('complete') log_auction_status_change(request, auction, auction.status)
def check_status(request): auction = request.validated['auction'] now = get_now() for award in auction.awards: request.content_configurator.check_award_status(request, award, now) if auction.status == 'active.tendering' and auction.enquiryPeriod.endDate <= now: auction.status = 'active.auction' auction.auctionUrl = generate_auction_url(request) log_auction_status_change(request, auction, auction.status) return True elif auction.status == 'active.awarded': standStillEnds = [ a.complaintPeriod.endDate.astimezone(TZ) for a in auction.awards if a.complaintPeriod.endDate ] if not standStillEnds: return True standStillEnd = max(standStillEnds) if standStillEnd <= now: check_auction_status(request)
def act(self): bids = self.context.bids active_bids = [ bid for bid in bids if bid.status in ['pending', 'active'] ] # if no any bids in status 'active' or 'pending' # switch procedure to status 'unsuccessful' if not active_bids: self.context.status = 'unsuccessful' log_auction_status_change(self.request, self.context, self.context.status) return True # if minNumberOfQualifiedBids is 2 and is only 1 bid # switch procedure to status 'unsuccessful' min_number = self.context.minNumberOfQualifiedBids if min_number == 2 and len(active_bids) == 1: self.context.status = 'unsuccessful' log_auction_status_change(self.request, self.context, self.context.status) return True # after tendering period, all bids in status 'draft' are delete for bid in bids: if bid.status == 'draft': remove_bid(self.request, self.context, bid) # switch procedure to 'active.enquiry' self.context.status = 'active.enquiry' log_auction_status_change(self.request, self.context, self.context.status)
def act(self): # check enquiry minNumberOfQualifiedBids min_number = self.context.minNumberOfQualifiedBids bids = self.context.bids active_bids = [bid for bid in bids if bid.status == 'active'] # in the end of enquiry period # all bids that are in status 'draft/pending' # switch to 'unsuccessful' status for bid in self.context['bids']: if bid.status in ['draft', 'pending']: bid.status = 'unsuccessful' if min_number == 1: if len(active_bids) == 0: status = 'unsuccessful' elif len(active_bids) == 1: status = 'active.qualification' # start awarding reg = get_current_registry() awarding = reg.queryMultiAdapter((self.context, self.request), IContentConfigurator) awarding.start_awarding() elif len(active_bids) >= 2: status = 'active.auction' elif min_number == 2: if len(active_bids) == 0: status = 'unsuccessful' elif len(active_bids) == 1: status = 'unsuccessful' elif len(active_bids) >= 2: status = 'active.auction' self.context.status = status log_auction_status_change(self.request, self.context, self.context.status)
def _reject_award(self): # organizer reject award, auction switch to status 'unsuccessful' self.context.status = 'unsuccessful' log_auction_status_change(self.request, self.context, self.context.status)
def act(self): # switch procedure to 'active.tendering' self.context.status = 'active.tendering' log_auction_status_change(self.request, self.context, self.context.status)
def check_auction_status(request): auction = request.validated['auction'] adapter = request.registry.getAdapter(auction, IAuctionManager) now = get_now() if auction.lots: if any([ i.status in auction.block_complaint_status and i.relatedLot is None for i in auction.complaints ]): return for lot in auction.lots: if lot.status != 'active': continue lot_awards = [i for i in auction.awards if i.lotID == lot.id] if not lot_awards: continue last_award = lot_awards[-1] pending_complaints = any([ i['status'] in auction.block_complaint_status and i.relatedLot == lot.id for i in auction.complaints ]) pending_awards_complaints = any([ i.status in auction.block_complaint_status for a in lot_awards for i in a.complaints ]) stand_still_end = max( [a.complaintPeriod.endDate or now for a in lot_awards]) if pending_complaints or pending_awards_complaints or not stand_still_end <= now: continue elif last_award.status == 'unsuccessful': LOGGER.info('Switched lot %s of auction %s to %s', lot.id, auction.id, 'unsuccessful', extra=context_unpack( request, {'MESSAGE_ID': 'switched_lot_unsuccessful'}, {'LOT_ID': lot.id})) lot.status = 'unsuccessful' continue elif (last_award.status == 'active' and any([ i.status == 'active' and i.awardID == last_award.id for i in auction.contracts ])): LOGGER.info('Switched lot %s of auction %s to %s', lot.id, auction.id, 'complete', extra=context_unpack( request, {'MESSAGE_ID': 'switched_lot_complete'}, {'LOT_ID': lot.id})) lot.status = 'complete' statuses = set([lot.status for lot in auction.lots]) if statuses == set(['cancelled']): adapter.pendify_auction_status('cancelled') log_auction_status_change(request, auction, auction.status) elif not statuses.difference(set(['unsuccessful', 'cancelled'])): adapter.pendify_auction_status('unsuccessful') log_auction_status_change(request, auction, auction.status) elif not statuses.difference( set(['complete', 'unsuccessful', 'cancelled'])): adapter.pendify_auction_status('complete') log_auction_status_change(request, auction, auction.status) else: pending_complaints = any([ i.status in auction.block_complaint_status for i in auction.complaints ]) pending_awards_complaints = any([ i.status in auction.block_complaint_status for a in auction.awards for i in a.complaints ]) stand_still_ends = [ a.complaintPeriod.endDate for a in auction.awards if a.complaintPeriod.endDate ] stand_still_end = max(stand_still_ends) if stand_still_ends else now stand_still_time_expired = stand_still_end < now last_award_status = auction.awards[-1].status if auction.awards else '' if not pending_complaints and not pending_awards_complaints and stand_still_time_expired \ and last_award_status == 'unsuccessful': adapter.pendify_auction_status('unsuccessful') log_auction_status_change(request, auction, auction.status) if not pending_complaints and not pending_awards_complaints and stand_still_time_expired \ and last_award_status == 'unsuccessful': adapter.pendify_auction_status('unsuccessful') log_auction_status_change(request, auction, auction.status) if auction.contracts and auction.contracts[-1].status == 'active': adapter.pendify_auction_status('complete') log_auction_status_change(request, auction, auction.status)