def post(self): """Report auction results for lot. """ apply_patch(self.request, save=False, src=self.request.validated['auction_src']) auction = self.request.validated['auction'] adapter = self.request.registry.getAdapter(auction, IAuctionManager) if (all([ i.auctionPeriod and i.auctionPeriod.endDate for i in auction.lots if i.numberOfBids > 1 and i.status == 'active' ])): cleanup_bids_for_cancelled_lots(auction) invalidate_bids_under_threshold(auction) if any([i.status == 'active' for i in auction.bids]): self.request.content_configurator.start_awarding() else: adapter.pendify_auction_status('unsuccessful') if save_auction(self.request): self.LOGGER.info('Report auction results', extra=context_unpack( self.request, {'MESSAGE_ID': 'auction_lot_auction_post'})) return { 'data': self.request.validated['auction'].serialize( self.request.validated['auction'].status) }
def collection_post(self): apply_patch(self.request, save=False, src=self.request.validated['auction_src']) auction = self.request.validated['auction'] adapter = self.request.registry.getAdapter(auction, IAuctionManager) invalidate_bids_under_threshold(auction) if any([i.status == 'active' for i in auction.bids]): self.request.content_configurator.start_awarding() else: adapter.pendify_auction_status('unsuccessful') if save_auction(self.request): self.LOGGER.info('Report auction results', extra=context_unpack(self.request, {'MESSAGE_ID': 'auction_auction_post'})) return {'data': self.request.validated['auction'].serialize(self.request.validated['auction'].status)}
def test_invalidate_bids_under_threshold(self): def get_auction(value, minimal_step, bids): return { 'value': { 'amount': value }, 'minimalStep': { 'amount': minimal_step }, 'bids': bids } need_bid_statuses = ('valid', 'invalid') amount = random.randint(50, 100) small_amount = random.randint(1, (amount - 1) / 2) big_amount = random.randint(amount, (amount * 2)) bid = munch.Munch({ 'value': { 'amount': amount }, 'status': need_bid_statuses[0] }) auction = get_auction(small_amount, small_amount, []) invalidate_bids_under_threshold(auction) self.assertEqual(bid.status, need_bid_statuses[0]) auction = get_auction(small_amount, small_amount, [bid]) invalidate_bids_under_threshold(auction) self.assertEqual(bid.status, need_bid_statuses[0]) auction = get_auction(big_amount, big_amount, [bid]) invalidate_bids_under_threshold(auction) self.assertEqual(bid.status, need_bid_statuses[1])
def collection_post(self): """Report auction results. Report auction results ---------------------- Example request to report auction results: .. sourcecode:: http POST /auctions/4879d3f8ee2443169b5fbbc9f89fa607/auction HTTP/1.1 Host: example.com Accept: application/json { "data": { "dateModified": "2014-10-27T08:06:58.158Z", "bids": [ { "value": { "amount": 400, "currency": "UAH" } }, { "value": { "amount": 385, "currency": "UAH" } } ] } } This is what one should expect in response: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "data": { "dateModified": "2014-10-27T08:06:58.158Z", "bids": [ { "value": { "amount": 400, "currency": "UAH", "valueAddedTaxIncluded": true } }, { "value": { "amount": 385, "currency": "UAH", "valueAddedTaxIncluded": true } } ], "minimalStep":{ "amount": 35, "currency": "UAH" }, "tenderPeriod":{ "startDate": "2014-11-04T08:00:00" } } } """ apply_patch(self.request, save=False, src=self.request.validated['auction_src']) auction = self.request.validated['auction'] adapter = self.request.registry.getAdapter(auction, IAuctionManager) invalidate_bids_under_threshold(auction) if any([i.status == 'active' for i in auction.bids]): self.request.content_configurator.start_awarding() else: adapter.pendify_auction_status('unsuccessful') if save_auction(self.request): self.LOGGER.info( 'Report auction results', extra=context_unpack(self.request, {'MESSAGE_ID': 'auction_auction_post'})) return { 'data': self.request.validated['auction'].serialize( self.request.validated['auction'].status) }
def migrate_awarding_1_0_to_awarding_2_0(auction): if auction['procurementMethodType'] not in ['dgfOtherAssets', 'dgfFinancialAssets'] \ or auction['status'] not in ['active.qualification', 'active.awarded'] \ or 'awards' not in auction: return now = get_now().isoformat() awards = auction["awards"] unique_awards = len(set([a['bid_id'] for a in awards])) if unique_awards > 2: switch_auction_to_unsuccessful(auction) else: invalidate_bids_under_threshold(auction) award = [a for a in awards if a['status'] in ['active', 'pending']][0] for bid in auction['bids']: if bid['id'] == award['bid_id'] and bid['status'] == 'invalid': switch_auction_to_unsuccessful(auction) if auction['status'] != 'unsuccessful': award = [a for a in awards if a['status'] in ['active', 'pending']][0] award_create_date = award['complaintPeriod']['startDate'] award.update({ 'verificationPeriod': { 'startDate': award_create_date, 'endDate': award_create_date }, 'paymentPeriod': { 'startDate': award_create_date, }, 'signingPeriod': { 'startDate': award_create_date, } }) if award['status'] == 'pending': award['status'] = 'pending.payment' elif award['status'] == 'active': award['verificationPeriod']['endDate'] = award['paymentPeriod'][ 'endDate'] = now if unique_awards == 1: bid = chef(auction['bids'], auction.get('features'), [], True)[1] award = { 'id': uuid4().hex, 'bid_id': bid['id'], 'status': 'pending.waiting', 'date': awards[0]['date'], 'value': bid['value'], 'suppliers': bid['tenderers'], 'complaintPeriod': { 'startDate': awards[0]['date'] } } if bid['status'] == 'invalid': award['status'] = 'unsuccessful' award['complaintPeriod']['endDate'] = now awards.append(award)