コード例 #1
0
    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)
コード例 #2
0
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
コード例 #3
0
    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 = []
コード例 #4
0
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)
コード例 #5
0
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)
コード例 #6
0
    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)
コード例 #7
0
    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)
コード例 #8
0
    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)
コード例 #9
0
    def act(self):
        # switch procedure to 'active.tendering'

        self.context.status = 'active.tendering'
        log_auction_status_change(self.request, self.context,
                                  self.context.status)
コード例 #10
0
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)