odoo_resource.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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. get_odoo_internal_ip
  21. )
  22. from api.utils.jwt_token import get_user
  23. from api.utils.jwt_authentication import JWTAuthentication
  24. from api.utils.logger import (
  25. info,
  26. error,
  27. warning
  28. )
  29. from api.utils.email import send_email
  30. from simplejson import JSONDecodeError
  31. import simplejson as json
  32. class OdooResource(Resource):
  33. class Meta:
  34. authentication = JWTAuthentication()
  35. '''
  36. '''
  37. def prepend_urls(self):
  38. return [
  39. url(r'^(?P<resource_name>%s)/create%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('odoo_create'), name='api_odoo_create'),
  40. ]
  41. '''
  42. '''
  43. def odoo_create(self, request, **kwargs):
  44. info('odoo creation is requested')
  45. self.method_check(request, allowed='post')
  46. self.is_authenticated(request)
  47. authorization_header = request.META.get(settings.JWT_ACCEPT_HEADER)
  48. prefix_length = len(settings.JWT_PREFIX_HEADER)
  49. user = get_user(authorization_header[prefix_length + 1:])
  50. info('%s is authenticated' % user.username)
  51. name = None
  52. try:
  53. data = json.loads(request.body)
  54. name = data['name']
  55. except JSONDecodeError:
  56. name = None
  57. error('json decode error')
  58. except KeyError:
  59. name = None
  60. error('key error')
  61. r = Request.objects.create(name='Crear contenedor Odoo')
  62. r.user = user
  63. if not name:
  64. r.issue = 'name is required'
  65. r.status = 5
  66. r.save()
  67. error('name is required')
  68. return self.create_response(request, {
  69. 'error_message': 'name is required'
  70. })
  71. info('%s: request is ok' % name)
  72. # 1. Check and get name
  73. name = normalize_name(name)
  74. name_exists = check_name(name)
  75. get_odoo_internal_ip(name)
  76. if name_exists:
  77. r.issue = '%s: name is already exists' % name
  78. r.status = 5
  79. r.save()
  80. error('%s: name is already exists' % name)
  81. return self.create_response(request, {
  82. 'error_message': '%s: name is already exists' % name
  83. })
  84. info('%s: name is ok' % name)
  85. # 2. Get port
  86. port = randomize_port()
  87. info('%s: port is ok' % port)
  88. # 3. Folder structure create
  89. folders_created = create_folders(name)
  90. if not folders_created:
  91. r.issue = '%s: folders structure cannot be created' % name
  92. r.status = 5
  93. r.save()
  94. error('%s: folders structure cannot be created' % name)
  95. return self.create_response(request, {
  96. 'error_message': '%s: folders structure cannot be created' % name
  97. })
  98. info('%s: folders is ok' % name)
  99. # 4. Configuration create
  100. conf_created = create_configuration(name)
  101. if not conf_created:
  102. r.issue = '%s: configuration cannot be created' % name
  103. r.status = 5
  104. r.save()
  105. error('%s: configuration cannot be created' % name)
  106. return self.create_response(request, {
  107. 'error_message': '%s: configuration cannot be created' % name
  108. })
  109. info('%s: configuration is ok' % name)
  110. # 5. Database create
  111. db_created = create_database(name)
  112. if not db_created:
  113. r.issue = '%s: database cannot be created' % name
  114. r.status = 5
  115. r.save()
  116. error('%s: database cannot be created' % name)
  117. return self.create_response(request, {
  118. 'error_message': '%s: database cannot be created' % name
  119. })
  120. info('%s: database is ok' % name)
  121. # 6. Copy a database backup
  122. seed_copied = copy_database_seed()
  123. if not seed_copied:
  124. r.issue = '%s: database seed cannot be copied' % name
  125. r.status = 5
  126. r.save()
  127. error('%s: database seed cannot be copied' % name)
  128. return self.create_response(request, {
  129. 'error_message': '%s: database seed cannot be copied' % name
  130. })
  131. info('%s: database seed is ok' % name)
  132. # 7. Restore database schema
  133. db_restored = restore_database(name)
  134. if not db_restored:
  135. r.issue = '%s: database cannot be restored' % name
  136. r.status = 5
  137. r.save()
  138. error('%s: database cannot be restored' % name)
  139. return self.create_response(request, {
  140. 'error_message': '%s: database cannot be restored' % name
  141. })
  142. info('%s: database restore is ok' % name)
  143. # 8. Remove unused bakup file
  144. seed_removed = remove_database_seed()
  145. if not seed_removed:
  146. r.issue = '%s: seed cannot be removed' % name
  147. r.status = 5
  148. r.save()
  149. error('%s: seed cannot be removed' % name)
  150. return self.create_response(request, {
  151. 'error_message': '%s: seed cannot be removed' % name
  152. })
  153. info('%s: database seed remove is ok' % name)
  154. # 9. Odoo create
  155. odoo_created = create_odoo_container(name, [port])
  156. if not odoo_created:
  157. r.issue = '%s: odoo container cannot be created' % name
  158. r.status = 5
  159. r.save()
  160. error('%s: odoo container cannot be created' % name)
  161. return self.create_response(request, {
  162. 'error_message': '%s: odoo container cannot be created' % name
  163. })
  164. info('%s: container creation is ok' % name)
  165. # 10. Apply permissions
  166. permissions_applied = apply_permissions(name)
  167. if not permissions_applied:
  168. r.issue = '%s: odoo container cannot be started' % name
  169. r.status = 5
  170. r.save()
  171. error('%s: odoo container cannot be started' % name)
  172. return self.create_response(request, {
  173. 'error_message': '%s: odoo container cannot be started' % name
  174. })
  175. info('%s: container started is ok' % name)
  176. r.issue = '%s: odoo container created successfully' % name
  177. r.status = 4
  178. r.save()
  179. # Send email
  180. email_sended = send_email(
  181. 'Has creado exitosamente un nuevo sistema Odoo\n *** Datos *** \n-\tNombre:\t%s\nIP externo:\t%s\nPuerto externo:%s\n' % (name, settings.EXTERNAL_IP, port),
  182. user.username
  183. )
  184. if not email_sended:
  185. warning('%s email not sended' % user.username)
  186. else:
  187. info('%s email sended' % user.username)
  188. info('%s: odoo creation is ok' % name)
  189. return self.create_response(request, {
  190. 'action': {
  191. 'type': 'redirect',
  192. 'ip': settings.EXTERNAL_IP,
  193. 'port': port
  194. }
  195. })