#!/usr/bin/env python3 # -*- coding: utf-8 -*- """Borra los datos de demostración sembrados por `--demo`. /root/odoo-venv/bin/python demo_limpiar.py --conf /root/-odoo.conf --db [--dry-run] Usa la lista de ids guardada en ir.config_parameter `skeen.demo.ids` y, como respaldo, los marcadores ('DEMO-' en servicios, referred_by='DEMO' en pacientes, '[DEMO]' en citas/empleados). Pensado para no dejar basura en una instancia de cliente antes de entregarla. """ import argparse import json import sys import traceback def load_env(conf_path, db_name): sys.path.insert(0, '/root/skeen-odoo') import odoo from odoo.tools import config as odoo_config odoo_config.parse_config(['-c', conf_path, '-d', db_name, '--no-http', '--log-level', 'error']) odoo.service.server.load_server_wide_modules() return odoo, odoo.registry(db_name) # Orden de borrado: primero lo que depende de lo demás. ORDER = ['skeen.cita', 'skeen.paquete.compra', 'skeen.paquete', 'skeen.monedero', 'skeen.servicio', 'res.partner', 'hr.employee'] def main(): ap = argparse.ArgumentParser() ap.add_argument('--conf', required=True) ap.add_argument('--db', required=True) ap.add_argument('--dry-run', action='store_true') args = ap.parse_args() odoo, registry = load_env(args.conf, args.db) with registry.cursor() as cr: env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {}) ICP = env['ir.config_parameter'].sudo() raw = ICP.get_param('skeen.demo.ids') or '{}' try: ids = json.loads(raw) except Exception: ids = {} # respaldo por marcadores cuando no hay ids guardados markers = {} if not any(ids.values()): markers = { 'skeen.servicio': [('code', 'like', 'DEMO-%')], 'res.partner': [('referred_by', '=', 'DEMO')], 'hr.employee': [('notes', 'like', '[DEMO]')], 'skeen.cita': [('notes', 'like', '[DEMO]')], } for model in ORDER: if model not in env: continue Model = env[model].sudo() recs = Model.browse([]) for rid in ids.get(model.split('.')[-1], []): recs |= Model.browse(rid).exists() if model in markers: recs |= Model.search(markers[model]) if not recs: continue print('%-22s %d registros' % (model, len(recs))) if not args.dry_run: try: recs.unlink() except Exception as e: print(' no se pudo borrar del todo: %s' % e) if not args.dry_run: ICP.set_param('skeen.demo.ids', '{}') cr.commit() print('LIMPIEZA %s' % ('SIMULADA (dry-run)' if args.dry_run else 'OK')) if __name__ == '__main__': try: main() except Exception: traceback.print_exc() sys.exit(1)