Files
suite/connector_opencart/models/sale_order/common.py
Jared Kipe 6e04b9d61d WIP from 12
2021-12-15 14:02:15 -08:00

121 lines
4.4 KiB
Python

# © 2019 Hibou Corp.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import odoo.addons.decimal_precision as dp
from odoo import models, fields, api
from odoo.exceptions import ValidationError
from odoo.addons.queue_job.job import job
from odoo.addons.component.core import Component
from odoo.addons.queue_job.exception import RetryableJobError
class OpencartSaleOrder(models.Model):
_name = 'opencart.sale.order'
_inherit = 'opencart.binding'
_description = 'Opencart Sale Order'
_inherits = {'sale.order': 'odoo_id'}
odoo_id = fields.Many2one(comodel_name='sale.order',
string='Sale Order',
required=True,
ondelete='cascade')
opencart_order_line_ids = fields.One2many(
comodel_name='opencart.sale.order.line',
inverse_name='opencart_order_id',
string='Walmart Order Lines'
)
store_id = fields.Many2one('opencart.store', string='Store')
total_amount = fields.Float(
string='Total amount',
digits=dp.get_precision('Account')
)
@job(default_channel='root.opencart')
@api.model
def import_batch(self, backend, filters=None):
""" Prepare the import of Sales Orders from Opencart """
return super(OpencartSaleOrder, self).import_batch(backend, filters=filters)
class SaleOrder(models.Model):
_inherit = 'sale.order'
opencart_bind_ids = fields.One2many(
comodel_name='opencart.sale.order',
inverse_name='odoo_id',
string="Opencart Bindings",
)
class OpencartSaleOrderLine(models.Model):
_name = 'opencart.sale.order.line'
_inherit = 'opencart.binding'
_description = 'Opencart Sale Order Line'
_inherits = {'sale.order.line': 'odoo_id'}
opencart_order_id = fields.Many2one(comodel_name='opencart.sale.order',
string='Opencart Sale Order',
required=True,
ondelete='cascade',
index=True)
odoo_id = fields.Many2one(comodel_name='sale.order.line',
string='Sale Order Line',
required=True,
ondelete='cascade')
backend_id = fields.Many2one(related='opencart_order_id.backend_id',
string='Opencart Backend',
readonly=True,
store=True,
required=False)
@api.model
def create(self, vals):
opencart_order_id = vals['opencart_order_id']
binding = self.env['opencart.sale.order'].browse(opencart_order_id)
vals['order_id'] = binding.odoo_id.id
binding = super(OpencartSaleOrderLine, self).create(vals)
return binding
class SaleOrderLine(models.Model):
_inherit = 'sale.order.line'
opencart_bind_ids = fields.One2many(
comodel_name='opencart.sale.order.line',
inverse_name='odoo_id',
string="Opencart Bindings",
)
class SaleOrderAdapter(Component):
_name = 'opencart.sale.order.adapter'
_inherit = 'opencart.adapter'
_apply_on = 'opencart.sale.order'
def search(self, filters=None):
api_instance = self.api_instance
api_filters = {}
if 'after_id' in filters:
api_filters['id_larger_than'] = filters['after_id']
if 'modified_from' in filters:
api_filters['modified_from'] = filters['modified_from']
orders_response = api_instance.orders.all(**api_filters)
if 'error' in orders_response and orders_response['error']:
raise ValidationError(str(orders_response))
if 'data' not in orders_response or not isinstance(orders_response['data'], list):
return []
orders = orders_response['data']
# Note that `store_id is None` is checked as it may not be in the output.
return map(lambda o: (o['order_id'], o.get('store_id', None), o.get('date_modified') or o.get('date_added')), orders)
def read(self, id):
api_instance = self.api_instance
record = api_instance.orders.get(id)
if 'data' in record and record['data']:
return record['data']
raise RetryableJobError('Order "' + str(id) + '" did not return an order response. ' + str(record))