odoo_shipcloud/controllers/main.py

61 lines
2.6 KiB
Python

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 ''