146 lines
4.5 KiB
Python
146 lines
4.5 KiB
Python
import secrets
|
|
import logging
|
|
|
|
from odoo import api, fields, models
|
|
from odoo.exceptions import UserError
|
|
|
|
from ..lib.woo_api_client import WooApiClient
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class WooSetupWizard(models.TransientModel):
|
|
_name = 'woo.setup.wizard'
|
|
_description = 'WooCommerce Setup Wizard'
|
|
|
|
# Step 1: Connection
|
|
name = fields.Char(string='Instance Name', required=True)
|
|
url = fields.Char(string='WooCommerce URL', required=True)
|
|
consumer_key = fields.Char(string='Consumer Key', required=True)
|
|
consumer_secret = fields.Char(string='Consumer Secret', required=True)
|
|
|
|
# Step 2: Configuration
|
|
default_warehouse_id = fields.Many2one('stock.warehouse', string='Default Warehouse')
|
|
sync_interval = fields.Selection([
|
|
('5', '5 Minutes'),
|
|
('15', '15 Minutes'),
|
|
('30', '30 Minutes'),
|
|
('60', '1 Hour'),
|
|
], string='Sync Interval', default='15')
|
|
|
|
# State tracking
|
|
step = fields.Selection([
|
|
('connection', 'Connection'),
|
|
('config', 'Configuration'),
|
|
('done', 'Done'),
|
|
], default='connection')
|
|
connection_tested = fields.Boolean()
|
|
instance_id = fields.Many2one('woo.instance')
|
|
api_key = fields.Char(string='Generated API Key', readonly=True)
|
|
|
|
def action_test_connection(self):
|
|
self.ensure_one()
|
|
try:
|
|
client = WooApiClient(
|
|
url=self.url,
|
|
consumer_key=self.consumer_key,
|
|
consumer_secret=self.consumer_secret,
|
|
)
|
|
success, info = client.test_connection()
|
|
if success:
|
|
self.connection_tested = True
|
|
else:
|
|
raise UserError(f"Connection failed: {info}")
|
|
except UserError:
|
|
raise
|
|
except Exception as exc:
|
|
raise UserError(f"Connection error: {exc}") from exc
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'res_model': self._name,
|
|
'res_id': self.id,
|
|
'view_mode': 'form',
|
|
'target': 'new',
|
|
}
|
|
|
|
def action_next_step(self):
|
|
self.ensure_one()
|
|
if self.step == 'connection':
|
|
if not self.connection_tested:
|
|
raise UserError("Please test the connection before proceeding.")
|
|
self.step = 'config'
|
|
elif self.step == 'config':
|
|
self.step = 'done'
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'res_model': self._name,
|
|
'res_id': self.id,
|
|
'view_mode': 'form',
|
|
'target': 'new',
|
|
}
|
|
|
|
def action_back(self):
|
|
self.ensure_one()
|
|
if self.step == 'config':
|
|
self.step = 'connection'
|
|
elif self.step == 'done':
|
|
self.step = 'config'
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'res_model': self._name,
|
|
'res_id': self.id,
|
|
'view_mode': 'form',
|
|
'target': 'new',
|
|
}
|
|
|
|
def action_complete(self):
|
|
self.ensure_one()
|
|
api_key = secrets.token_urlsafe(32)
|
|
instance = self.env['woo.instance'].create({
|
|
'name': self.name,
|
|
'url': self.url,
|
|
'consumer_key': self.consumer_key,
|
|
'consumer_secret': self.consumer_secret,
|
|
'default_warehouse_id': self.default_warehouse_id.id,
|
|
'sync_interval': self.sync_interval,
|
|
'odoo_api_key': api_key,
|
|
'state': 'connected',
|
|
})
|
|
self.instance_id = instance
|
|
self.api_key = api_key
|
|
self.step = 'done'
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'res_model': self._name,
|
|
'res_id': self.id,
|
|
'view_mode': 'form',
|
|
'target': 'new',
|
|
}
|
|
|
|
def action_open_instance(self):
|
|
self.ensure_one()
|
|
if not self.instance_id:
|
|
raise UserError("No instance created yet.")
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'res_model': 'woo.instance',
|
|
'res_id': self.instance_id.id,
|
|
'view_mode': 'form',
|
|
'target': 'current',
|
|
}
|
|
|
|
def action_fetch_products(self):
|
|
self.ensure_one()
|
|
if not self.instance_id:
|
|
raise UserError("No instance created yet.")
|
|
wizard = self.env['woo.product.fetch'].create({
|
|
'instance_id': self.instance_id.id,
|
|
})
|
|
return {
|
|
'type': 'ir.actions.act_window',
|
|
'res_model': 'woo.product.fetch',
|
|
'res_id': wizard.id,
|
|
'view_mode': 'form',
|
|
'target': 'new',
|
|
}
|