odoo_api.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. from __future__ import unicode_literals
  2. from django.conf import settings
  3. from random import randint
  4. from jinja2 import Environment, PackageLoader, select_autoescape
  5. from api.utils.docker_api import (
  6. execute_command,
  7. run_container,
  8. copy_in
  9. )
  10. from api.utils.command import execute
  11. import os
  12. import socket
  13. import time
  14. import unicodedata
  15. import stringcase
  16. import tarfile
  17. '''
  18. '''
  19. def normalize_name(name = None):
  20. if not name:
  21. return name
  22. try:
  23. name = unicodedata.normalize('NFKD', name)
  24. name = name.encode('ASCII', 'ignore')
  25. except TypeError:
  26. pass
  27. name = stringcase.trimcase(name)
  28. name = stringcase.lowercase(name)
  29. name = stringcase.snakecase(name)
  30. return name
  31. '''
  32. '''
  33. def randomize_port():
  34. ports = settings.ODOO_PORTS_RANGE
  35. port = 0
  36. while not check_port(port):
  37. time.sleep(1)
  38. port = randint(ports[0], ports[1])
  39. return port
  40. '''
  41. '''
  42. def check_port(port=0):
  43. if port == 0:
  44. return False
  45. ok = False
  46. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  47. try:
  48. s.bind((settings.DOCKER_NETWORK, port))
  49. ok = True
  50. except socket.error:
  51. ok = False
  52. s.close()
  53. return ok
  54. '''
  55. '''
  56. def check_name(name=None):
  57. if not name:
  58. return False
  59. full_path = os.path.join(settings.ODOO_ROOT_PATH, name)
  60. return os.path.exists(full_path)
  61. '''
  62. '''
  63. def create_folders(name=None):
  64. if not name:
  65. return False
  66. folders = settings.ODOO_DEFAULT_FOLDERS
  67. for folder in folders:
  68. full_path = os.path.join(settings.ODOO_ROOT_PATH, name, folder.strip())
  69. os.makedirs(full_path)
  70. time.sleep(1)
  71. return True
  72. '''
  73. '''
  74. def apply_permissions(name=None):
  75. if not name:
  76. return False
  77. full_path = os.path.join(settings.ODOO_ROOT_PATH, name)
  78. execute(['chmod', '-Rf', '777', full_path])
  79. return True
  80. '''
  81. '''
  82. def create_configuration(name=None):
  83. if not name:
  84. return False
  85. conf_path = os.path.join(settings.ODOO_ROOT_PATH, name, 'config')
  86. if not os.path.exists(conf_path):
  87. return False
  88. env = Environment(
  89. loader=PackageLoader('api', 'templates'),
  90. autoescape=select_autoescape(['j2'])
  91. )
  92. template = env.get_template(settings.ODOO_CONF_FILENAME + '.j2')
  93. template_rendered = template.stream({
  94. 'admin_password': settings.ODOO_ADMIN_PASSWORD,
  95. 'db_host': settings.ODOO_DB_HOST,
  96. 'db_port': settings.ODOO_DB_PORT,
  97. 'db_name': name,
  98. 'db_user': settings.ODOO_DB_USER,
  99. 'db_password': settings.ODOO_DB_PASSWORD
  100. })
  101. template_rendered.dump(os.path.join(conf_path, settings.ODOO_CONF_FILENAME + '.conf'))
  102. return True
  103. '''
  104. '''
  105. def create_database(name=None):
  106. if not name:
  107. return False
  108. cmd = 'createdb -U %s %s' % (settings.ODOO_DB_USER, name)
  109. return execute_command(settings.ODOO_DB_CONTAINER, cmd)
  110. '''
  111. '''
  112. def copy_database_seed():
  113. backup_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'files', 'odoo.tar')
  114. return copy_in(settings.ODOO_DB_CONTAINER, '/tmp', backup_path)
  115. '''
  116. '''
  117. def restore_database(name=None):
  118. if not name:
  119. return False
  120. cmd = 'psql -U %s -d %s -f %s' % (settings.ODOO_DB_USER, name, '/tmp/odoo.sql')
  121. return execute_command(settings.ODOO_DB_CONTAINER, cmd)
  122. '''
  123. '''
  124. def remove_database_seed():
  125. cmd = 'rm -f %s' % ('/tmp/odoo.sql')
  126. return execute_command(settings.ODOO_DB_CONTAINER, cmd)
  127. '''
  128. '''
  129. def create_odoo_container(name=None, ports=[]):
  130. if not name:
  131. return False
  132. ports = dict(map(lambda p: ('%d/tcp' % 8069, p), ports))
  133. volumes = dict(map(lambda f: (os.path.join(settings.ODOO_ROOT_PATH, name, f.strip()), {
  134. 'bind': settings.ODOO_DEFAULT_FOLDERS[f].strip(),
  135. 'mode': 'rw'
  136. }) , settings.ODOO_DEFAULT_FOLDERS))
  137. run_container(settings.ODOO_IMAGE, name, ports, volumes, settings.DOCKER_NETWORK_NAME)
  138. time.sleep(5)
  139. return True