def next_check(self): checks = [] extend_next_check_by_complaint_period_ends(self, checks) if cancellation_block_tender(self): return min(checks).isoformat() if checks else None # Add checks here if needed return min(checks).isoformat() if checks else None
def next_check(self): now = get_now() checks = [] if (self.status == "active.tendering" and self.tenderPeriod.endDate and not has_unanswered_complaints(self) and not has_unanswered_questions(self)): checks.append(self.tenderPeriod.endDate.astimezone(TZ)) elif (not self.lots and self.status == "active.auction" and self.auctionPeriod and self.auctionPeriod.startDate and not self.auctionPeriod.endDate): if now < self.auctionPeriod.startDate: checks.append(self.auctionPeriod.startDate.astimezone(TZ)) elif now < calc_auction_end_time( self.numberOfBids, self.auctionPeriod.startDate).astimezone(TZ): checks.append( calc_auction_end_time( self.numberOfBids, self.auctionPeriod.startDate).astimezone(TZ)) elif self.lots and self.status == "active.auction": for lot in self.lots: if (lot.status != "active" or not lot.auctionPeriod or not lot.auctionPeriod.startDate or lot.auctionPeriod.endDate): continue if now < lot.auctionPeriod.startDate: checks.append(lot.auctionPeriod.startDate.astimezone(TZ)) elif now < calc_auction_end_time( lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(TZ): checks.append( calc_auction_end_time( lot.numberOfBids, lot.auctionPeriod.startDate).astimezone(TZ)) elif (not self.lots and self.status == "active.awarded" and not any( [i.status in self.block_complaint_status for i in self.complaints]) and not any([ i.status in self.block_complaint_status for a in self.awards for i in a.complaints ])): standStillEnds = [ a.complaintPeriod.endDate.astimezone(TZ) for a in self.awards if a.complaintPeriod.endDate ] last_award_status = self.awards[-1].status if self.awards else "" if standStillEnds and last_award_status == "unsuccessful": checks.append(max(standStillEnds)) elif (self.lots and self.status in ["active.qualification", "active.awarded"] and not any([ i.status in self.block_complaint_status and i.relatedLot is None for i in self.complaints ])): for lot in self.lots: if lot["status"] != "active": continue lot_awards = [i for i in self.awards if i.lotID == lot.id] pending_complaints = any([ i["status"] in self.block_complaint_status and i.relatedLot == lot.id for i in self.complaints ]) pending_awards_complaints = any([ i.status in self.block_complaint_status for a in lot_awards for i in a.complaints ]) standStillEnds = [ a.complaintPeriod.endDate.astimezone(TZ) for a in lot_awards if a.complaintPeriod.endDate ] last_award_status = lot_awards[-1].status if lot_awards else "" if (not pending_complaints and not pending_awards_complaints and standStillEnds and last_award_status == "unsuccessful"): checks.append(max(standStillEnds)) if self.status.startswith("active"): for award in self.awards: if award.status == "active" and not any( [i.awardID == award.id for i in self.contracts]): checks.append(award.date) extend_next_check_by_complaint_period_ends(self, checks) return min(checks).isoformat() if checks else None
def __call__(self, obj): now = get_now() checks = [] configurator = getAdapter(obj, IContentConfigurator) if (obj.status == "active.tendering" and obj.tenderPeriod.endDate and not has_unanswered_complaints(obj) and not has_unanswered_questions(obj)): checks.append(obj.tenderPeriod.endDate.astimezone(configurator.tz)) elif (obj.status == "active.pre-qualification.stand-still" and obj.qualificationPeriod and obj.qualificationPeriod.endDate): active_lots = [ lot.id for lot in obj.lots if lot.status == "active" ] if obj.lots else [None] if not any([ i.status in obj.block_complaint_status for q in obj.qualifications for i in q.complaints if q.lotID in active_lots ]): checks.append( obj.qualificationPeriod.endDate.astimezone( configurator.tz)) elif (not obj.lots and obj.status == "active.auction" and obj.auctionPeriod and obj.auctionPeriod.startDate and not obj.auctionPeriod.endDate): if now < obj.auctionPeriod.startDate: checks.append( obj.auctionPeriod.startDate.astimezone(configurator.tz)) elif now < calc_auction_end_time( obj.numberOfBids, obj.auctionPeriod.startDate).astimezone( configurator.tz): checks.append( calc_auction_end_time( obj.numberOfBids, obj.auctionPeriod.startDate).astimezone( configurator.tz)) elif obj.lots and obj.status == "active.auction": for lot in obj.lots: if (lot.status != "active" or not lot.auctionPeriod or not lot.auctionPeriod.startDate or lot.auctionPeriod.endDate): continue if now < lot.auctionPeriod.startDate: checks.append( lot.auctionPeriod.startDate.astimezone( configurator.tz)) elif now < calc_auction_end_time( lot.numberOfBids, lot.auctionPeriod.startDate).astimezone( configurator.tz): checks.append( calc_auction_end_time( lot.numberOfBids, lot.auctionPeriod.startDate).astimezone( configurator.tz)) elif obj.status == "active.qualification.stand-still" and obj.awardPeriod and obj.awardPeriod.endDate: active_lots = [ lot.id for lot in obj.lots if lot.status == "active" ] if obj.lots else [None] if not any([ i.status in obj.block_complaint_status for q in obj.qualifications for i in q.complaints if q.lotID in active_lots ]): checks.append( obj.awardPeriod.endDate.astimezone(configurator.tz)) extend_next_check_by_complaint_period_ends(obj, checks) return min(checks).isoformat() if checks else None
def next_check(self): checks = [] extend_next_check_by_complaint_period_ends(self, checks) return min(checks).isoformat() if checks else None