فهرست منبع

[FIX] module owner resolution

Gogs 6 سال پیش
والد
کامیت
40f2a8b88d
3فایلهای تغییر یافته به همراه67 افزوده شده و 43 حذف شده
  1. 22 11
      api/resources/odoo_resource.py
  2. 7 3
      api/utils/git_api.py
  3. 38 29
      api/utils/odoo_api.py

+ 22 - 11
api/resources/odoo_resource.py

@@ -18,7 +18,7 @@ from api.utils.odoo_api import (
     create_odoo_container,
     apply_permissions,
     get_odoo_internal_ip,
-    install_module
+    install_modules
 )
 from api.utils.jwt_token import get_user
 from api.utils.jwt_authentication import JWTAuthentication
@@ -256,7 +256,16 @@ class OdooResource(Resource):
     '''
     '''
     def install_odoo_module(self, request, **kwargs):
+        info('odoo module installation is requested')
+
         self.method_check(request, allowed='post')
+        self.is_authenticated(request)
+
+        authorization_header = request.META.get(settings.JWT_ACCEPT_HEADER)
+        prefix_length = len(settings.JWT_PREFIX_HEADER)
+        user = get_user(authorization_header[prefix_length + 1:])
+
+        info('%s is authenticated' % user.username)
         
         err = {'error_message': None}
         data = None
@@ -269,24 +278,26 @@ class OdooResource(Resource):
         if not data:
             err['error_message'] = 'cannot parse request body'
 
-        if data and (not 'system' in data or not 'module' in data):
-            err['error_message'] = 'module and system name is required'
+        if data and (not 'system' in data or not 'modules' in data):
+            err['error_message'] = 'module names and system name is required'
+
+        system = data.get('system', '')
+        modules = data.get('modules', [])
 
-        result = install_module(data.get('system', None), data.get('module', None))
+        result = install_modules(system, modules)
 
         if 'error' in result:
             err['error_message'] = result['error']
 
         if len(err) != 0:    
             return self.create_response(request, err)
+
+        module_names = ''
+        for module_name in data.get('modules', []):
+            module_names = '-\t' + module_name + '\n'
+
+        send_email('El usuario %s ha instalado los siguientes módulos en el sistema %d:\n%s', (user.username, system, module_names), user.username, only_admins=True)
         
         return self.create_response(request, {
             'success_message': '%s successfully installed' % data.get('module')
         })
-
-        
-
-        
-
-        
-

+ 7 - 3
api/utils/git_api.py

@@ -41,12 +41,12 @@ def resolve_owner_by_name(name=None):
     if not name:
         return None
     
-    path = [r for r in get_odoo_modules_repos_paths() if '%s.git' % name in r]
+    paths = [r for r in get_odoo_modules_repos_paths() if r.endswith('/%s.git' % name)]
 
-    if len(path) == 0:
+    if len(paths) == 0:
         return None
 
-    return path[0].replace('%s/' % settings.GIT_PATH, '').replace('/%s.git' % name, '')
+    return paths[0].replace('%s/' % settings.GIT_PATH, '').replace('/%s.git' % name, '')
 
 
 '''
@@ -56,6 +56,10 @@ def clone_repo(name=None, to=None, branch='master'):
         return False
     
     owner = resolve_owner_by_name(name)
+
+    if not owner:
+        return False
+
     repo_path = '%s.git' % join_path(settings.GIT_PATH, owner, name)
 
     try:

+ 38 - 29
api/utils/odoo_api.py

@@ -13,6 +13,7 @@ from api.utils.docker_api import (
 )
 from api.utils.git_api import clone_repo
 from api.utils.command import execute
+from api.utils.email import send_email
 from api.utils.logger import info
 import os
 import socket
@@ -205,57 +206,65 @@ def get_odoo_internal_ip(name=None):
 
     return get_internal_ip(name)
 
-
 '''
 '''
-def install_module(system_name=None, module_name=None):
+def install_modules(system_name=None, module_names=[]):
     if not system_name:
-        return {'error': 'system name is required'} 
+        return {'error': 'system name is required'}
 
-    if not module_name:
-        return {'error': 'module name is required'}
+    if len(module_names) == 0:
+        return {'error': 'module names is required'}
 
-    # 1. check system path
+     # 1. check system path
     system_path = os.path.join(settings.ODOO_ROOT_PATH, system_name)
 
     if not os.path.exists(system_path):
         return {'error': 'system path not exists'}
 
-    # 2. stop system container
-    stopped = stop_container(system_name)
+    # # 2. stop system container
+    # stopped = stop_container(system_name)
 
-    if not stopped:
-        return {'error': 'cannot stop system'}
+    # if not stopped:
+    #     return {'error': 'cannot stop system'}
 
-    # 3. check module path and remove it
-    module_path = os.path.join(system_path, 'custom-addons', module_name)
+    for module_name in module_names:
+        # 3. check module path and remove it
+        module_path = os.path.join(system_path, 'custom-addons', module_name)
 
-    if os.path.exists(module_path):
-        execute(['rm', '-Rf', module_path])
+        if os.path.exists(module_path):
+            execute(['rm', '-Rf', module_path])
 
-    # 4. clone repo
-    cloned = clone_repo(module_name, os.path.join(system_path, 'custom-addons'))
+        # 4. clone repo
+        addons_path = os.path.join(system_path, 'custom-addons')
+        cloned = clone_repo(module_name, addons_path)
 
-    if not cloned:
-        return {'error': 'cannot clone repo'}
+        if not cloned:
+            return {'error': 'cannot clone repo'}
 
-    # 5. remove git data
-    git_data_path = os.path.join(module_name, '.git')
+        # 5. remove git data
+        git_data_path = os.path.join(module_path, '.git')
 
-    if os.path.exists(git_data_path):
-        execute(['rm', '-Rf', git_data_path])
+        if os.path.exists(git_data_path):
+            execute(['rm', '-Rf', git_data_path])
+        
+        try:
+            execute(['chmod', '-R', '777', module_path])
+        except Exception:
+            pass
 
-    # 6. apply permissions
-    execute(['chmod', '-Rf', '777', module_path])
+    # # 7. start system container
+    # started = start_container(system_name)
 
-    # 7. start system container
-    started = start_container(system_name)
-
-    if not started:
-        return {'error': 'cannot start system'}
+    # if not started:
+    #     return {'error': 'cannot start system'}
 
     return {'result': '%s installed' % module_name}
 
+'''
+'''
+def install_module(system_name=None, module_name=None):
+    return install_modules(system_name, [module_name])
+
 '''
 '''
 def up():