Files
SKEEN-Proyecto/infra/provision/demo_limpiar.py

90 lines
3.0 KiB
Python
Executable File

#!/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/<slug>-odoo.conf --db <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)