def post(self):
     """Report auction results for lot.
     """
     apply_patch(self.request, save=False, src=self.request.validated['tender_src'])
     if all([i.auctionPeriod and i.auctionPeriod.endDate for i in self.request.validated['tender'].lots if i.status == 'active']):
         add_next_award(self.request)
     if save_tender(self.request):
         self.LOGGER.info('Report auction results', extra=context_unpack(self.request, {'MESSAGE_ID': 'tender_lot_auction_post'}))
         return {'data': self.request.validated['tender'].serialize(self.request.validated['tender'].status)}
 def cancel_lot(self, cancellation=None):
     if not cancellation:
         cancellation = self.context
     tender = self.request.validated['tender']
     [setattr(i, 'status', 'cancelled') for i in tender.lots if i.id == cancellation.relatedLot]
     cancelled_lots = [i.id for i in tender.lots if i.status == 'cancelled']
     cancelled_items = [i.id for i in tender.items if i.relatedLot in cancelled_lots]
     cancelled_features = [
         i.code
         for i in (tender.features or [])
         if i.featureOf == 'lot' and i.relatedItem in cancelled_lots or i.featureOf == 'item' and i.relatedItem in cancelled_items
     ]
     if tender.status in ['active.tendering', 'active.pre-qualification', 'active.pre-qualification.stand-still', 'active.auction']:
         for bid in tender.bids:
             if tender.status == "active.tendering":
                 bid.documents = [i for i in bid.documents if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots]
             bid.financialDocuments = [i for i in bid.financialDocuments if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots]
             bid.eligibilityDocuments = [i for i in bid.eligibilityDocuments if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots]
             bid.qualificationDocuments = [i for i in bid.qualificationDocuments if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots]
             bid.parameters = [i for i in bid.parameters if i.code not in cancelled_features]
             bid.lotValues = [i for i in bid.lotValues if i.relatedLot not in cancelled_lots]
             if not bid.lotValues:
                 bid.status = 'invalid'
     for qualification in tender.qualifications:
         if qualification.lotID in cancelled_lots:
             qualification.status = 'cancelled'
     statuses = set([lot.status for lot in tender.lots])
     if statuses == set(['cancelled']):
         self.cancel_tender()
     elif not statuses.difference(set(['unsuccessful', 'cancelled'])):
         tender.status = 'unsuccessful'
     elif not statuses.difference(set(['complete', 'unsuccessful', 'cancelled'])):
         tender.status = 'complete'
     if tender.status == 'active.auction' and all([
         i.auctionPeriod and i.auctionPeriod.endDate
         for i in self.request.validated['tender'].lots
         if i.status == 'active'
     ]):
         add_next_award(self.request)
 def cancel_lot(self, cancellation=None):
     if not cancellation:
         cancellation = self.context
     tender = self.request.validated['tender']
     [setattr(i, 'status', 'cancelled') for i in tender.lots if i.id == cancellation.relatedLot]
     cancelled_lots = [i.id for i in tender.lots if i.status == 'cancelled']
     cancelled_items = [i.id for i in tender.items if i.relatedLot in cancelled_lots]
     cancelled_features = [
         i.code
         for i in (tender.features or [])
         if i.featureOf == 'lot' and i.relatedItem in cancelled_lots or i.featureOf == 'item' and i.relatedItem in cancelled_items
     ]
     if tender.status in ['active.tendering', 'active.pre-qualification', 'active.pre-qualification.stand-still', 'active.auction']:
         for bid in tender.bids:
             if tender.status == "active.tendering":
                 bid.documents = [i for i in bid.documents if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots]
             bid.financialDocuments = [i for i in bid.financialDocuments if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots]
             bid.eligibilityDocuments = [i for i in bid.eligibilityDocuments if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots]
             bid.qualificationDocuments = [i for i in bid.qualificationDocuments if i.documentOf != 'lot' or i.relatedItem not in cancelled_lots]
             bid.parameters = [i for i in bid.parameters if i.code not in cancelled_features]
             bid.lotValues = [i for i in bid.lotValues if i.relatedLot not in cancelled_lots]
             if not bid.lotValues:
                 bid.status = 'invalid' if tender.status == 'active.tendering' and bid.status in ['pending', 'active'] else 'invalid.pre-qualification'
     for qualification in tender.qualifications:
         if qualification.lotID in cancelled_lots:
             qualification.status = 'cancelled'
     statuses = set([lot.status for lot in tender.lots])
     if statuses == set(['cancelled']):
         self.cancel_tender()
     elif not statuses.difference(set(['unsuccessful', 'cancelled'])):
         tender.status = 'unsuccessful'
     elif not statuses.difference(set(['complete', 'unsuccessful', 'cancelled'])):
         tender.status = 'complete'
     if tender.status == 'active.auction' and all([
         i.auctionPeriod and i.auctionPeriod.endDate
         for i in self.request.validated['tender'].lots
         if i.status == 'active'
     ]):
         add_next_award(self.request)
    def collection_post(self):
        """Report auction results.

        Report auction results
        ----------------------

        Example request to report auction results:

        .. sourcecode:: http

            POST /tenders/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['tender_src'])
        if all([i.auctionPeriod and i.auctionPeriod.endDate for i in self.request.validated['tender'].lots if i.status == 'active']):
            add_next_award(self.request)
        if save_tender(self.request):
            self.LOGGER.info('Report auction results', extra=context_unpack(self.request, {'MESSAGE_ID': 'tender_auction_post'}))
            return {'data': self.request.validated['tender'].serialize(self.request.validated['tender'].status)}