mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
IMP connector_opencart Add field opencart_sku on product.template to let you pre-make products and link them up.
Improved partner matching and added some logging for the testing phase. Added menu item Connectors->Opencart-Products to find and fix mapping easily. Allow deleting `product.template` even with bindings so that you could re-make the binding.
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
'views/delivery_views.xml',
|
||||
'views/opencart_backend_views.xml',
|
||||
'views/opencart_product_views.xml',
|
||||
'views/product_views.xml',
|
||||
],
|
||||
'installable': True,
|
||||
'application': False,
|
||||
|
||||
@@ -12,7 +12,7 @@ class OpencartProductTemplate(models.Model):
|
||||
odoo_id = fields.Many2one('product.template',
|
||||
string='Product',
|
||||
required=True,
|
||||
ondelete='restrict')
|
||||
ondelete='cascade') # cascade so that you can delete an Odoo product that was created by connector
|
||||
opencart_attribute_value_ids = fields.One2many('opencart.product.template.attribute.value',
|
||||
'opencart_product_tmpl_id',
|
||||
string='Opencart Product Attribute Values')
|
||||
@@ -34,7 +34,7 @@ class OpencartProductTemplate(models.Model):
|
||||
if reentry:
|
||||
raise RetryableJobError('Product imported, but selected option is not available.')
|
||||
if not opencart_attribute_value.odoo_id:
|
||||
raise RetryableJobError('Order Product has option (%s) "%s" that is not mapped to an Odoo Attribute Value.' % (opencart_attribute_value.external_id, opencart_attribute_value.opencart_name))
|
||||
raise RetryableJobError('Order Product (%s) has option (%s) "%s" that is not mapped to an Odoo Attribute Value.' % (self, opencart_attribute_value.external_id, opencart_attribute_value.opencart_name))
|
||||
selected_attribute_values += opencart_attribute_value.odoo_id
|
||||
# Now that we know what options are selected, we can load a variant with those options
|
||||
return self.odoo_id._create_product_variant(selected_attribute_values)
|
||||
@@ -43,6 +43,7 @@ class OpencartProductTemplate(models.Model):
|
||||
class ProductTemplate(models.Model):
|
||||
_inherit = 'product.template'
|
||||
|
||||
opencart_sku = fields.Char('Opencart SKU')
|
||||
opencart_bind_ids = fields.One2many('opencart.product.template', 'odoo_id', string='Opencart Bindings')
|
||||
|
||||
|
||||
|
||||
@@ -23,6 +23,10 @@ class ProductImportMapper(Component):
|
||||
def product_type(self, record):
|
||||
return {'type': 'product' if record.get('shipping') else 'service'}
|
||||
|
||||
@mapping
|
||||
def opencart_sku(self, record):
|
||||
return {'opencart_sku': (record.get('sku') or '').strip()}
|
||||
|
||||
@only_create
|
||||
@mapping
|
||||
def existing_product(self, record):
|
||||
@@ -30,7 +34,12 @@ class ProductImportMapper(Component):
|
||||
template = product_template.browse()
|
||||
|
||||
if record.get('sku'):
|
||||
template = product_template.search([('default_code', '=', record.get('sku'))], limit=1)
|
||||
sku = (record.get('sku') or '').strip()
|
||||
# Try to match our own field
|
||||
template = product_template.search([('opencart_sku', '=', sku)], limit=1)
|
||||
if not template:
|
||||
# Try to match the default_code
|
||||
template = product_template.search([('default_code', '=', record.get('sku'))], limit=1)
|
||||
if not template and record.get('model'):
|
||||
template = product_template.search([('default_code', '=', record.get('model'))], limit=1)
|
||||
if not template and record.get('name'):
|
||||
|
||||
@@ -9,6 +9,9 @@ from odoo.addons.component.core import Component
|
||||
from odoo.addons.connector.components.mapper import mapping
|
||||
from odoo.exceptions import ValidationError
|
||||
|
||||
import logging
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SaleOrderBatchImporter(Component):
|
||||
_name = 'opencart.sale.order.batch.importer'
|
||||
@@ -184,14 +187,21 @@ class SaleOrderImporter(Component):
|
||||
return self.env['res.partner'].create(values)
|
||||
|
||||
def _partner_matches(self, partner, values):
|
||||
_logger.warn('_partner_matches partner: ' + str(partner) + ' values: ' + str(values))
|
||||
for key, value in values.items():
|
||||
if key in ('active', 'parent_id'):
|
||||
continue
|
||||
|
||||
if key == 'state_id':
|
||||
if value != partner.state_id.id:
|
||||
_logger.warn(' return false for state_id value: ' + str(value) + ' partner.state_id.id: ' + str(partner.state_id.id))
|
||||
return False
|
||||
elif key == 'country_id':
|
||||
if value != partner.country_id.id:
|
||||
_logger.warn(' return false for country_id value: ' + str(value) + ' partner.country_id.id: ' + str(partner.country_id.id))
|
||||
return False
|
||||
elif bool(value) and value != getattr(partner, key):
|
||||
_logger.warn(' return false for ' + str(key) + ' : ' + str(value) + ' partner value: ' + str(getattr(partner, key)))
|
||||
return False
|
||||
return True
|
||||
|
||||
@@ -232,13 +242,13 @@ class SaleOrderImporter(Component):
|
||||
], limit=1)
|
||||
|
||||
return {
|
||||
'email': email,
|
||||
'name': name,
|
||||
'phone': phone,
|
||||
'street': street,
|
||||
'street2': street2,
|
||||
'zip': zip_,
|
||||
'city': city,
|
||||
'email': email.strip(),
|
||||
'name': name.strip(),
|
||||
'phone': phone.strip(),
|
||||
'street': street.strip(),
|
||||
'street2': street2.strip(),
|
||||
'zip': zip_.strip(),
|
||||
'city': city.strip(),
|
||||
'state_id': state.id,
|
||||
'country_id': country.id,
|
||||
}
|
||||
@@ -247,9 +257,18 @@ class SaleOrderImporter(Component):
|
||||
record = self.opencart_record
|
||||
|
||||
partner_values = self._get_partner_values()
|
||||
partner = self.env['res.partner'].search([
|
||||
partners = self.env['res.partner'].search([
|
||||
('email', '=', partner_values['email']),
|
||||
], limit=1)
|
||||
])
|
||||
|
||||
partner = None
|
||||
for possible in partners:
|
||||
if self._partner_matches(possible, partner_values):
|
||||
_logger.warn('matched partner: ' + str(possible))
|
||||
partner = possible
|
||||
break
|
||||
if not partner and partners:
|
||||
partner = partners[0]
|
||||
|
||||
if not partner:
|
||||
# create partner.
|
||||
@@ -260,18 +279,28 @@ class SaleOrderImporter(Component):
|
||||
partner_values['active'] = False
|
||||
shipping_partner = self._create_partner(copy(partner_values))
|
||||
else:
|
||||
_logger.warn('same shipping partner')
|
||||
shipping_partner = partner
|
||||
|
||||
invoice_values = self._get_partner_values(info_string='payment_')
|
||||
|
||||
if (not self._partner_matches(partner, invoice_values)
|
||||
and not self._partner_matches(shipping_partner, invoice_values)):
|
||||
partner_values['parent_id'] = partner.id
|
||||
partner_values['active'] = False
|
||||
invoice_partner = self._create_partner(copy(invoice_values))
|
||||
# Try to find existing invoice address....
|
||||
for possible in partners:
|
||||
if self._partner_matches(possible, invoice_values):
|
||||
_logger.warn('matched invoice partner: ' + str(possible))
|
||||
invoice_partner = possible
|
||||
break
|
||||
else:
|
||||
partner_values['parent_id'] = partner.id
|
||||
partner_values['active'] = False
|
||||
invoice_partner = self._create_partner(copy(invoice_values))
|
||||
elif self._partner_matches(partner, invoice_values):
|
||||
_logger.warn('same invoice partner')
|
||||
invoice_partner = partner
|
||||
elif self._partner_matches(shipping_partner, invoice_values):
|
||||
_logger.warn('same invoice shipping partner')
|
||||
invoice_partner = shipping_partner
|
||||
|
||||
self.partner = partner
|
||||
|
||||
@@ -25,4 +25,32 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_opencart_product_template_tree" model="ir.ui.view">
|
||||
<field name="name">opencart.product.template.tree</field>
|
||||
<field name="model">opencart.product.template</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Opencart Products">
|
||||
<field name="backend_id"/>
|
||||
<field name="external_id" string="Opencart ID"/>
|
||||
<field name="odoo_id" string="Product Template"/>
|
||||
<field name="create_date"/>
|
||||
<field name="write_date"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_opencart_product_template" model="ir.actions.act_window">
|
||||
<field name="name">Opencart Products</field>
|
||||
<field name="res_model">opencart.product.template</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
<field name="view_id" ref="view_opencart_product_template_tree"/>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_opencart_product"
|
||||
name="Products"
|
||||
parent="menu_opencart_root"
|
||||
sequence="50"
|
||||
action="action_opencart_product_template"/>
|
||||
|
||||
</odoo>
|
||||
15
connector_opencart/views/product_views.xml
Normal file
15
connector_opencart/views/product_views.xml
Normal file
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo>
|
||||
|
||||
<record id="product_template_only_form_view_inherit" model="ir.ui.view">
|
||||
<field name="name">product.template.product.form.inherit</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="inherit_id" ref="product.product_template_only_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='barcode']" position="after">
|
||||
<field name="opencart_sku"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user