odoo_instance.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. # -*- coding: utf-8 -*-
  2. from openerp import models, fields, api
  3. from openerp.exceptions import Warning
  4. from ..utils import odoo_api
  5. class OdooInstance(models.Model):
  6. _name = 'odoo.instance'
  7. CONTAINER_STATUS = [
  8. ('draft', 'Por activar'),
  9. ('activated', 'Activado'),
  10. ('disapproved', 'No aprobado'),
  11. ('suspended', 'Suspendido'),
  12. ('destroyed', 'Eliminado')
  13. ]
  14. name = fields.Char(string='Nombre', size=50)
  15. normalized_name = fields.Char(string='Nombre normalizado', compute='_normalize_name', size=50)
  16. logo = fields.Binary(string='Logo')
  17. internal_ip = fields.Char(string='IP interno', size=15)
  18. internal_port = fields.Integer(string='Puerto interno')
  19. external_ip = fields.Char(string='IP externo', size=15)
  20. external_port = fields.Integer(string='Puerto externo')
  21. expose_ip = fields.Boolean(string='Exponer IP', default=True)
  22. state = fields.Selection(string='Estado', selection=CONTAINER_STATUS, default='draft')
  23. demo = fields.Boolean(string='Es un demo?', default=False)
  24. domain = fields.Char(string='Dominio', size=100)
  25. running = fields.Boolean(string='Está online?', default=False)
  26. payment_plan_id = fields.Many2one(string='Plan de pago', comodel_name='payment.plan', required=True)
  27. @api.one
  28. @api.onchange('name')
  29. def _onchange_name(self):
  30. if self.name:
  31. self.name = self.name.title()
  32. @api.one
  33. @api.depends('name')
  34. def _normalize_name(self):
  35. self.normalized_name = odoo_api.snakeize_name(self.name)
  36. @api.one
  37. def action_activate(self):
  38. if self.state not in ('draft', 'suspended'):
  39. raise Warning('No se puede activar un sistema ya activo')
  40. # 1. Check name
  41. name_is_available = odoo_api.check_name_availability(self.normalized_name)
  42. if not name_is_available:
  43. raise Warning('El nombre ya está siendo usado por otro sistema')
  44. # 2. Get a port
  45. port_to_use = odoo_api.randomize_port()
  46. # 3. Create dirs
  47. make_ok = odoo_api.make_default_dirs(self.normalized_name)
  48. if not make_ok:
  49. raise Warning('No se pudo crear la estructura de directorios')
  50. # 4. Create configuration file
  51. config_ok = odoo_api.make_config_file(self.normalized_name)
  52. if not config_ok:
  53. raise Warning('No se pudo crear el archivo de configuración')
  54. # 5. Create database
  55. db_ok = odoo_api.create_database(self.normalized_name)
  56. if not db_ok:
  57. raise Warning('No se pudo crear la base de datos')
  58. # 6. Copy database seed
  59. seed_copied = odoo_api.copy_database_seed()
  60. if not seed_copied:
  61. raise Warning('No se pudo copiar la estructura inicial de la base de datos')
  62. # 7. Restore database schema
  63. restored = odoo_api.restore_database(self.normalized_name)
  64. if not restored:
  65. raise Warning('No se pudo reestablecer la copia de base de datos')
  66. # 8. Remove database seed
  67. seed_removed = odoo_api.remove_database_seed()
  68. if not seed_removed:
  69. raise Warning('No se pudo remover la copia de base de datos')
  70. # 9. Create odoo container
  71. odoo_created = odoo_api.create_container(self.normalized_name, [port_to_use])
  72. if not odoo_created:
  73. raise Warning('No se pudo crear el contenedor')
  74. # 10. Apply permissions
  75. permissions_applied = odoo_api.apply_permissions(self.normalized_name)
  76. if not permissions_applied:
  77. raise Warning('No se pudo aplicar los permisos correspondientes')
  78. # 11. Get internal ip
  79. internal_ip = odoo_api.get_internal_ip(self.normalized_name)
  80. # 12. Send email
  81. # TODO
  82. print(internal_ip)
  83. self.state = 'activated'
  84. @api.one
  85. def action_disapprove(self):
  86. if self.state != 'draft':
  87. raise Warning('No se puede desaprobar un sistema ya activo')
  88. self.state = 'disapproved'
  89. @api.one
  90. def action_suspend(self):
  91. if self.state != 'activated':
  92. raise Warning('No se puede suspender un sistema no activo')
  93. self.state = 'suspended'
  94. self.running = False
  95. @api.one
  96. def copy(self):
  97. raise Warning('Atención', 'No se puede duplicar una instancia. Por favor, cree uno nuevo')
  98. @api.one
  99. def action_destroy(self):
  100. if self.state == 'destroyed':
  101. raise Warning('No se puede eliminar un sistema ya eliminado')
  102. self.state = 'destroyed'
  103. self.running = False
  104. @api.one
  105. def action_start(self):
  106. if self.running:
  107. raise Warning('Atención', 'No se puede arrancar una instancia que ya está arrancada')
  108. self.running = True
  109. @api.one
  110. def action_restart(self):
  111. if not self.running:
  112. raise Warning('Atención', 'No se puede parar y arrancar una instancia que ya está parada')
  113. self.running = True
  114. @api.model
  115. def check_status(self):
  116. print('croned')