odoo_resource.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.conf.urls import url
  4. from django.conf import settings
  5. from tastypie.resources import Resource
  6. from tastypie.utils import trailing_slash
  7. from core.models.request import Request
  8. from api.utils.odoo_api import (
  9. normalize_name,
  10. check_name,
  11. randomize_port,
  12. create_folders,
  13. create_configuration,
  14. create_database,
  15. copy_database_seed,
  16. restore_database,
  17. remove_database_seed,
  18. create_odoo_container,
  19. apply_permissions
  20. )
  21. from api.utils.jwt_authentication import JWTAuthentication
  22. from simplejson import JSONDecodeError
  23. import simplejson as json
  24. class OdooResource(Resource):
  25. class Meta:
  26. authentication = JWTAuthentication()
  27. '''
  28. '''
  29. def prepend_urls(self):
  30. return [
  31. url(r'^(?P<resource_name>%s)/create%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('odoo_create'), name='api_odoo_create'),
  32. ]
  33. '''
  34. '''
  35. def odoo_create(self, request, **kwargs):
  36. self.method_check(request, allowed='post')
  37. self.is_authenticated(request)
  38. name = None
  39. try:
  40. data = json.loads(request.body)
  41. name = data['name']
  42. except JSONDecodeError:
  43. name = None
  44. except KeyError:
  45. name = None
  46. r = Request.objects.create(name='Crear contenedor Odoo')
  47. if not name:
  48. r.issue = 'name is required'
  49. r.status = 5
  50. r.save()
  51. return self.create_response(request, {
  52. 'error_message': 'name is required'
  53. })
  54. # 1. Check and get name
  55. name = normalize_name(name)
  56. name_exists = check_name(name)
  57. if name_exists:
  58. r.issue = 'name is already exists'
  59. r.status = 5
  60. r.save()
  61. return self.create_response(request, {
  62. 'error_message': 'name is already exists'
  63. })
  64. # 2. Get port
  65. port = randomize_port()
  66. # 3. Folder structure create
  67. folders_created = create_folders(name)
  68. if not folders_created:
  69. r.issue = 'folders structure cannot be created'
  70. r.status = 5
  71. r.save()
  72. return self.create_response(request, {
  73. 'error_message': 'folders structure cannot be created'
  74. })
  75. # 4. Configuration create
  76. conf_created = create_configuration(name)
  77. if not conf_created:
  78. r.issue = 'configuration cannot be created'
  79. r.status = 5
  80. r.save()
  81. return self.create_response(request, {
  82. 'error_message': 'configuration cannot be created'
  83. })
  84. # 5. Database create
  85. db_created = create_database(name)
  86. if not db_created:
  87. r.issue = 'database cannot be created'
  88. r.status = 5
  89. r.save()
  90. return self.create_response(request, {
  91. 'error_message': 'database cannot be created'
  92. })
  93. # 6. Copy a database backup
  94. seed_copied = copy_database_seed()
  95. if not seed_copied:
  96. r.issue = 'database seed cannot be copied'
  97. r.status = 5
  98. r.save()
  99. return self.create_response(request, {
  100. 'error_message': 'database seed cannot be copied'
  101. })
  102. # 7. Restore database schema
  103. db_restored = restore_database(name)
  104. if not db_restored:
  105. r.issue = 'database cannot be restored'
  106. r.status = 5
  107. r.save()
  108. return self.create_response(request, {
  109. 'error_message': 'database cannot be restored'
  110. })
  111. # 8. Remove unused bakup file
  112. seed_removed = remove_database_seed()
  113. if not seed_removed:
  114. r.issue = 'seed cannot be removed'
  115. r.status = 5
  116. r.save()
  117. return self.create_response(request, {
  118. 'error_message': 'seed cannot be removed'
  119. })
  120. # 9. Odoo create
  121. odoo_created = create_odoo_container(name, [port])
  122. if not odoo_created:
  123. r.issue = 'odoo container cannot be created'
  124. r.status = 5
  125. r.save()
  126. return self.create_response(request, {
  127. 'error_message': 'odoo container cannot be created'
  128. })
  129. # 10. Apply permissions
  130. permissions_applied = apply_permissions(name)
  131. if not permissions_applied:
  132. r.issue = 'odoo container cannot be started'
  133. r.status = 5
  134. r.save()
  135. return self.create_response(request, {
  136. 'error_message': 'odoo container cannot be started'
  137. })
  138. r.status = 4
  139. r.save()
  140. return self.create_response(request, {
  141. 'action': {
  142. 'type': 'redirect',
  143. 'ip': settings.SERVER_IP,
  144. 'port': port
  145. }
  146. })