odoo_resource.py 4.9 KB

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