odoo_resource.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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. if name_exists:
  76. r.issue = '%s: name is already exists' % name
  77. r.status = 5
  78. r.save()
  79. error('%s: name is already exists' % name)
  80. return self.create_response(request, {
  81. 'error_message': '%s: name is already exists' % name
  82. })
  83. info('%s: name is ok' % name)
  84. # 2. Get port
  85. port = randomize_port()
  86. info('%s: port is ok' % port)
  87. # 3. Folder structure create
  88. folders_created = create_folders(name)
  89. if not folders_created:
  90. r.issue = '%s: folders structure cannot be created' % name
  91. r.status = 5
  92. r.save()
  93. error('%s: folders structure cannot be created' % name)
  94. return self.create_response(request, {
  95. 'error_message': '%s: folders structure cannot be created' % name
  96. })
  97. info('%s: folders is ok' % name)
  98. # 4. Configuration create
  99. conf_created = create_configuration(name)
  100. if not conf_created:
  101. r.issue = '%s: configuration cannot be created' % name
  102. r.status = 5
  103. r.save()
  104. error('%s: configuration cannot be created' % name)
  105. return self.create_response(request, {
  106. 'error_message': '%s: configuration cannot be created' % name
  107. })
  108. info('%s: configuration is ok' % name)
  109. # 5. Database create
  110. db_created = create_database(name)
  111. if not db_created:
  112. r.issue = '%s: database cannot be created' % name
  113. r.status = 5
  114. r.save()
  115. error('%s: database cannot be created' % name)
  116. return self.create_response(request, {
  117. 'error_message': '%s: database cannot be created' % name
  118. })
  119. info('%s: database is ok' % name)
  120. # 6. Copy a database backup
  121. seed_copied = copy_database_seed()
  122. if not seed_copied:
  123. r.issue = '%s: database seed cannot be copied' % name
  124. r.status = 5
  125. r.save()
  126. error('%s: database seed cannot be copied' % name)
  127. return self.create_response(request, {
  128. 'error_message': '%s: database seed cannot be copied' % name
  129. })
  130. info('%s: database seed is ok' % name)
  131. # 7. Restore database schema
  132. db_restored = restore_database(name)
  133. if not db_restored:
  134. r.issue = '%s: database cannot be restored' % name
  135. r.status = 5
  136. r.save()
  137. error('%s: database cannot be restored' % name)
  138. return self.create_response(request, {
  139. 'error_message': '%s: database cannot be restored' % name
  140. })
  141. info('%s: database restore is ok' % name)
  142. # 8. Remove unused bakup file
  143. seed_removed = remove_database_seed()
  144. if not seed_removed:
  145. r.issue = '%s: seed cannot be removed' % name
  146. r.status = 5
  147. r.save()
  148. error('%s: seed cannot be removed' % name)
  149. return self.create_response(request, {
  150. 'error_message': '%s: seed cannot be removed' % name
  151. })
  152. info('%s: database seed remove is ok' % name)
  153. # 9. Odoo create
  154. odoo_created = create_odoo_container(name, [port])
  155. if not odoo_created:
  156. r.issue = '%s: odoo container cannot be created' % name
  157. r.status = 5
  158. r.save()
  159. error('%s: odoo container cannot be created' % name)
  160. return self.create_response(request, {
  161. 'error_message': '%s: odoo container cannot be created' % name
  162. })
  163. info('%s: container creation is ok' % name)
  164. # 10. Apply permissions
  165. permissions_applied = apply_permissions(name)
  166. if not permissions_applied:
  167. r.issue = '%s: odoo container cannot be started' % name
  168. r.status = 5
  169. r.save()
  170. error('%s: odoo container cannot be started' % name)
  171. return self.create_response(request, {
  172. 'error_message': '%s: odoo container cannot be started' % name
  173. })
  174. info('%s: container started is ok' % name)
  175. r.issue = '%s: odoo container created successfully' % name
  176. r.status = 4
  177. r.save()
  178. # 11. Get internal IP
  179. internal_ip = get_odoo_internal_ip(name)
  180. # 12. Send email
  181. email_sended = send_email(
  182. '''
  183. El usuario %s ha creado exitosamente un nuevo sistema Odoo\n\n
  184. ------------------- Datos -------------------\n
  185. -\tNombre del Sistema:\t%s\n
  186. -\tIP Externo:\t%s\n
  187. -\tPuerto Externo:\t%s\n
  188. -\tIP Interno:\t%s\n
  189. ---------------------------------------------\n\n
  190. Obs.: Estos datos pueden ser usados para generar el subdominio del sistema
  191. ''' % (user.username, name, settings.EXTERNAL_IP, port, internal_ip),
  192. user.username,
  193. to_admins=True
  194. )
  195. if not email_sended:
  196. warning('%s email not sended' % user.username)
  197. else:
  198. info('%s email sended' % user.username)
  199. # 13. Send response
  200. info('%s: odoo creation is ok' % name)
  201. return self.create_response(request, {
  202. 'action': {
  203. 'type': 'redirect',
  204. 'ip': settings.EXTERNAL_IP,
  205. 'port': port
  206. }
  207. })