diff --git a/delivery_easypost_hibou/__init__.py b/delivery_easypost_hibou/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/delivery_easypost_hibou/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/delivery_easypost_hibou/__manifest__.py b/delivery_easypost_hibou/__manifest__.py new file mode 100644 index 00000000..a27a069e --- /dev/null +++ b/delivery_easypost_hibou/__manifest__.py @@ -0,0 +1,18 @@ +{ + 'name': 'Hibou EasyPost Shipping', + 'version': '13.0.1.0.0', + 'category': 'Stock', + 'author': "Hibou Corp.", + 'license': 'AGPL-3', + 'website': 'https://hibou.io/', + 'depends': [ + 'delivery_easypost', + 'delivery_hibou', + ], + 'data': [ + ], + 'demo': [ + ], + 'installable': True, + 'application': False, + } diff --git a/delivery_easypost_hibou/models/__init__.py b/delivery_easypost_hibou/models/__init__.py new file mode 100644 index 00000000..0a1fe29f --- /dev/null +++ b/delivery_easypost_hibou/models/__init__.py @@ -0,0 +1 @@ +from . import delivery_carrier diff --git a/delivery_easypost_hibou/models/delivery_carrier.py b/delivery_easypost_hibou/models/delivery_carrier.py new file mode 100644 index 00000000..a42f1744 --- /dev/null +++ b/delivery_easypost_hibou/models/delivery_carrier.py @@ -0,0 +1,63 @@ +import requests +from odoo import models, _ +from odoo.exceptions import UserError +from odoo.addons.delivery_easypost.models.easypost_request import EasypostRequest +import logging +_logger = logging.getLogger(__name__) + + +class DeliveryCarrier(models.Model): + _inherit = 'delivery.carrier' + + def easypost_send_shipping(self, pickings): + """ It creates an easypost order and buy it with the selected rate on + delivery method or cheapest rate if it is not set. It will use the + packages used with the put in pack functionality or a single package if + the user didn't use packages. + Once the order is purchased. It will post as message the tracking + links and the shipping labels. + """ + res = [] + superself = self.sudo() + ep = EasypostRequest(self.sudo().easypost_production_api_key if self.prod_environment else self.sudo().easypost_test_api_key, self.log_xml) + for picking in pickings: + # Call Hibou delivery method to get picking type + is_return = superself._classify_picking(picking) in ('in', 'dropship_in',) + result = ep.send_shipping(self, picking.partner_id, picking.picking_type_id.warehouse_id.partner_id, + picking=picking, is_return=is_return) + if result.get('error_message'): + raise UserError(_(result['error_message'])) + rate = result.get('rate') + if rate['currency'] == picking.company_id.currency_id.name: + price = float(rate['rate']) + else: + quote_currency = self.env['res.currency'].search([('name', '=', rate['currency'])], limit=1) + price = quote_currency._convert(float(rate['rate']), picking.company_id.currency_id, self.env.company, fields.Date.today()) + + # return tracking information + carrier_tracking_link = "" + for track_number, tracker_url in result.get('track_shipments_url').items(): + carrier_tracking_link += '' + track_number + '
' + + carrier_tracking_ref = ' + '.join(result.get('track_shipments_url').keys()) + + labels = [] + for track_number, label_url in result.get('track_label_data').items(): + label = requests.get(label_url) + labels.append(('LabelEasypost-%s.%s' % (track_number, self.easypost_label_file_type), label.content)) + + logmessage = _("Shipment created into Easypost
" + "Tracking Numbers: %s
") % (carrier_tracking_link) + pickings.message_post(body=logmessage, attachments=labels) + + shipping_data = { + 'exact_price': price, + 'tracking_number': carrier_tracking_ref, + } + res = res + [shipping_data] + # store order reference on picking + picking.ep_order_ref = result.get('id') + if picking.carrier_id.return_label_on_delivery: + self.get_return_label(picking) + return res +