Source code for openerp.addons.magentoerpconnect.stock_tracking
# -*- coding: utf-8 -*-
##############################################################################
#
# Author: Guewen Baconnier
# Copyright 2013 Camptocamp SA
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import logging
from openerp import _
from openerp.addons.connector.queue.job import job, related_action
from openerp.addons.connector.exception import FailedJobError
from openerp.addons.connector.unit.synchronizer import Exporter
from openerp.addons.connector_ecommerce.event import on_tracking_number_added
from .connector import get_environment
from .backend import magento
from .related_action import unwrap_binding
_logger = logging.getLogger(__name__)
[docs]@magento
class MagentoTrackingExporter(Exporter):
_model_name = ['magento.stock.picking']
def _get_tracking_args(self, picking):
return (picking.carrier_id.magento_carrier_code,
picking.carrier_id.magento_tracking_title or '',
picking.carrier_tracking_ref)
def _validate(self, picking):
if picking.state != 'done': # should not happen
raise ValueError("Wrong value for picking state, "
"it must be 'done', found: %s" % picking.state)
if not picking.carrier_id.magento_carrier_code:
raise FailedJobError("Wrong value for the Magento carrier code "
"defined in the picking.")
def _check_allowed_carrier(self, picking, magento_id):
allowed_carriers = self.backend_adapter.get_carriers(magento_id)
carrier = picking.carrier_id
if carrier.magento_carrier_code not in allowed_carriers:
raise FailedJobError("The carrier %(name)s does not accept "
"tracking numbers on Magento.\n\n"
"Tracking codes accepted by Magento:\n"
"%(allowed)s.\n\n"
"Actual tracking code:\n%(code)s\n\n"
"Resolution:\n"
"* Add support of %(code)s in Magento\n"
"* Or deactivate the export of tracking "
"numbers in the setup of the carrier "
"%(name)s." %
{'name': carrier.name,
'allowed': allowed_carriers,
'code': carrier.magento_carrier_code})
[docs] def run(self, binding_id):
""" Export the tracking number of a picking to Magento """
# verify the picking is done + magento id exists
picking = self.model.browse(binding_id)
carrier = picking.carrier_id
if not carrier:
return FailedJobError('The carrier is missing on the picking %s.' %
picking.name)
if not carrier.magento_export_tracking:
return _('The carrier %s does not export '
'tracking numbers.') % carrier.name
if not picking.carrier_tracking_ref:
return _('No tracking number to send.')
sale_binding_id = picking.magento_order_id
if not sale_binding_id:
return FailedJobError("No sales order is linked with the picking "
"%s, can't export the tracking number." %
picking.name)
binder = self.binder_for()
magento_id = binder.to_backend(binding_id)
if not magento_id:
# avoid circular reference
from .stock_picking import MagentoPickingExport
picking_exporter = self.unit_for(MagentoPickingExport)
picking_exporter.run(binding_id)
magento_id = binder.to_backend(binding_id)
if not magento_id:
return FailedJobError("The delivery order %s has no Magento ID, "
"can't export the tracking number." %
picking.name)
self._validate(picking)
self._check_allowed_carrier(picking, sale_binding_id.magento_id)
tracking_args = self._get_tracking_args(picking)
self.backend_adapter.add_tracking_number(magento_id, *tracking_args)
MagentoTrackingExport = MagentoTrackingExporter # deprecated
[docs]@on_tracking_number_added
def delay_export_tracking_number(session, model_name, record_id):
"""
Call a job to export the tracking number to a existing picking that
must be in done state.
"""
picking = session.env['stock.picking'].browse(record_id)
for binding in picking.magento_bind_ids:
# Set the priority to 20 to have more chance that it would be
# executed after the picking creation
export_tracking_number.delay(session,
binding._model._name,
binding.id,
priority=20)
[docs]@job(default_channel='root.magento')
@related_action(action=unwrap_binding)
def export_tracking_number(session, model_name, record_id):
""" Export the tracking number of a delivery order. """
picking = session.env[model_name].browse(record_id)
backend_id = picking.backend_id.id
env = get_environment(session, model_name, backend_id)
tracking_exporter = env.get_connector_unit(MagentoTrackingExporter)
return tracking_exporter.run(record_id)