odoo_api.py 3.3 KB

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