import json import logging import pprint #import urllib2 #import werkzeug from openerp import http, SUPERUSER_ID from openerp.http import request _logger = logging.getLogger(__name__) # map event types to human-readable strings TYPE_MAP = { 'shipment.status.deleted': 'Label has been deleted', 'shipment.tracking.label_created': 'Label has been created', 'shipment.tracking.picked_up': 'Shipment was picked up by carrier', 'shipment.tracking.transit': 'Shipment is in transit', 'shipment.tracking.out_for_delivery': 'Shipment is out for delivery', 'shipment.tracking.delivered': 'Shipment was delivered', 'shipment.tracking.awaits_pickup_by_receiver': 'Shipment awaits pick-up by recipient', 'shipment.tracking.canceled': 'Label has been cancelled', 'shipment.tracking.delayed': 'Delivery will be delayed', 'shipment.tracking.exception': 'Shipment problem / exception', 'shipment.tracking.not_delivered': 'Shipment was not delivered', 'shipment.tracking.destroyed': 'Shipment destroyed by customs or higher authorities', 'shipment.tracking.notification': 'Carrier internal notification', 'shipment.tracking.unknown': 'Shipment status unknown', } class ShipcloudController(http.Controller): def shipcloud_tracking_event(**post): event_type = post.get('type') event_time = post.get('occured_at') event_data = post.get('data') event_id = event_data['id'] if event_data['object_type'] == 'shipment': # look up the picking by sc_shipment_id == id picking_obj = self.env['stock.picking'] picking = picking_obj.search([('sc_shipment_id','=',event_id)], limit=1) if not picking: _logger.error('shipcloud webhook for unknown shipment %s' % event_id) return # update event type picking.sc_tracking_state = event_type.replace('shipment.tracking.','') # post a message to the picking event_str = TYPE_MAP[event_type] if event_type in TYPE_MAP else event_type msg = 'shipcloud event: %s at %s' % (event_str, event_time) picking.message_post(type='comment', subtype='mt_comment', content_subtype='plaintext', body=msg) @http.route('/webhook/shipcloud/tracking', type='json', auth='none', methods=['POST']) def shipcloud_tracking(self, **post): _logger.info('Beginning shipcloud tracking webhook with post data %s', pprint.pformat(post)) self.shipcloud_process_tracking_event(**post) return ''