def collection_post(self):
     """Post a cancellation
     """
     tender = self.request.validated['tender']
     if tender.status in ['complete', 'cancelled', 'unsuccessful']:
         self.request.errors.add('body', 'data', 'Can\'t add cancellation in current ({}) tender status'.format(tender.status))
         self.request.errors.status = 403
         return
     cancellation_data = self.request.validated['data']
     if any([i.status != 'active' for i in tender.lots if i.id == cancellation_data.get('relatedLot')]):
         self.request.errors.add('body', 'data', 'Can add cancellation only in active lot status')
         self.request.errors.status = 403
         return
     cancellation = Cancellation(cancellation_data)
     cancellation.__parent__ = self.request.context
     if cancellation.relatedLot and cancellation.status == 'active':
         [setattr(i, 'status', 'cancelled') for i in tender.lots if i.id == cancellation.relatedLot]
         check_tender_status(self.request)
     elif cancellation.status == 'active':
         tender.status = 'cancelled'
     tender.cancellations.append(cancellation)
     if save_tender(self.request):
         LOGGER.info('Created tender cancellation {}'.format(cancellation.id),
                     extra=context_unpack(self.request, {'MESSAGE_ID': 'tender_cancellation_create'}, {'cancellation_id': cancellation.id}))
         self.request.response.status = 201
         self.request.response.headers['Location'] = self.request.route_url('Tender Cancellations', tender_id=tender.id, cancellation_id=cancellation.id)
         return {'data': cancellation.serialize("view")}
 def collection_post(self):
     """Post a cancellation
     """
     tender = self.request.validated['tender']
     if tender.status in ['complete', 'cancelled', 'unsuccessful']:
         self.request.errors.add('body', 'data', 'Can\'t add cancellation in current ({}) tender status'.format(tender.status))
         self.request.errors.status = 403
         return
     cancellation_data = self.request.validated['data']
     cancellation = Cancellation(cancellation_data)
     if cancellation.status == 'active':
         tender.status = 'cancelled'
     tender.cancellations.append(cancellation)
     if save_tender(self.request):
         update_journal_handler_params({'cancellation_id': cancellation.id})
         LOGGER.info('Created tender cancellation {}'.format(cancellation.id), extra={'MESSAGE_ID': 'tender_cancellation_create'})
         self.request.response.status = 201
         self.request.response.headers['Location'] = self.request.route_url('Tender Cancellations', tender_id=tender.id, cancellation_id=cancellation.id)
         return {'data': cancellation.serialize("view")}