diff --git a/__init__.py b/__init__.py index 0650744..76a74f9 100644 --- a/__init__.py +++ b/__init__.py @@ -1 +1 @@ -from . import models +from . import models, controllers diff --git a/controllers/__init__.py b/controllers/__init__.py new file mode 100644 index 0000000..8ee9bae --- /dev/null +++ b/controllers/__init__.py @@ -0,0 +1 @@ +import main diff --git a/controllers/main.py b/controllers/main.py new file mode 100644 index 0000000..75ec644 --- /dev/null +++ b/controllers/main.py @@ -0,0 +1,60 @@ +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 '' + diff --git a/models/shipcloud_shipping_service.py b/models/shipcloud_shipping_service.py index 9edbb96..2b1d019 100644 --- a/models/shipcloud_shipping_service.py +++ b/models/shipcloud_shipping_service.py @@ -13,6 +13,7 @@ class SMCStockPickingShipclodu(models.Model): sc_shipment_id = fields.Char(string='shipcloud shipment ID', readonly=True, copy=False) sc_tracking_url = fields.Char(string='shipcloud tracking URL', readonly=True, copy=False) sc_content_desc = fields.Char(string='Description of Contents') + sc_tracking_state = fields.Char(string='shipcloud tracking status', readonly=True, copy=Fasle) class SMCShippingScCarrierService(models.Model): diff --git a/views/sc_delivery_carrier.xml b/views/sc_delivery_carrier.xml index eee5737..8fb947d 100644 --- a/views/sc_delivery_carrier.xml +++ b/views/sc_delivery_carrier.xml @@ -8,6 +8,7 @@ +