NextERP-scripts/services/odoo/module.py
2025-04-04 09:10:37 +07:00

89 lines
3.8 KiB
Python

from services.git.handler import GitHandler
from services.odoo.connection import OdooConnection
import subprocess
import lib.color_log as color_log
class OdooModuleManager:
def __init__(self, config_path: str = "config/settings.yaml"):
self.config = OdooConnection(config_path)
def _manage_module(
self, action: str, instance_name: str = None, module_names: list = None
) -> None:
"""Generic method to install, uninstall, or upgrade modules."""
if action not in {"install", "uninstall", "upgrade"}:
raise ValueError(f"Invalid action: {action}")
self.config.connect(instance_name)
for instance in self.config.get_instances():
if instance_name and instance["name"] != instance_name:
continue
color_log.Show("INFO", f"Processing instance: {instance['name']}")
for module_name in module_names:
try:
color_log.Show(
"INFO",
f"{action.capitalize()}ing module: {module_name} in {instance['name']}",
)
module_ids = self.config.execute(
instance["name"],
"ir.module.module",
"search",
[("name", "=", module_name)],
)
if not module_ids and action in ["upgrade", "uninstall"]:
color_log.Show(
"WARNING",
f"Module {module_name} not found in {instance['name']}, skipping.",
)
continue
button_action = f"button_immediate_{action}"
self.config.execute(
instance["name"],
"ir.module.module",
button_action,
module_ids, # Pass list directly instead of wrapping in another list
)
color_log.Show(
"OK",
f"Module {module_name} {action}ed successfully in {instance['name']}",
)
except Exception as e:
color_log.Show(
"FAILED",
f"Error while {action}ing {module_name} in {instance['name']}: {e}",
)
def get_modules(self, instance_name: str = None) -> list:
"""Get a list of installed modules for the specified instance(s)."""
self.config.connect(instance_name)
modules = []
for instance in self.config.get_instances():
if instance_name and instance["name"] != instance_name:
continue
color_log.Show("INFO", f"Fetching modules for instance: {instance['name']}")
if not instance.get("modules"):
color_log.Show(
"WARNING",
f"No modules found for instance {instance['name']}, skipping.",
)
continue
modules.extend(instance["modules"])
return modules
def install(self, instance_name: str = None, module_names: list = None) -> None:
"""Install multiple modules for the specified instance(s)."""
self._manage_module("install", instance_name, module_names)
def uninstall(self, instance_name: str = None, module_names: list = None) -> None:
"""Uninstall multiple modules for the specified instance(s)."""
self._manage_module("uninstall", instance_name, module_names)
def upgrade(self, instance_name: str = None, module_names: list = None) -> None:
"""Upgrade multiple modules for the specified instance(s)."""
self._manage_module("upgrade", instance_name, module_names)