Files
Odoo-Modules/fusion-woo-odoo/fusion_woocommerce/wizard/woo_setup_wizard.py
2026-03-31 20:43:36 -04:00

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',
}