system_administration:automation:module_manager

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
system_administration:automation:module_manager [2022/03/18 21:08] azizsystem_administration:automation:module_manager [2022/09/19 10:44] (current) – [Résumé] aziz
Line 1: Line 1:
-===== :todo: Module Manager Description =====+===== Module Manager Description ===== 
 +===== Fonctionnement du module ===== 
 +Quand l’utilisateur clique sur le lien de téléchargement de l'attachement au niveau du portail Odoo : 
 +La fonction **download_attachement()** sera lancé ,elle vérifie si le client à acheté le produit associé 
 +<code python> 
 +def download_attachment(self, attachment_id): 
 +        # Check if this is a valid attachment id 
 +        log.warning("########### i''m in #######################"
 +        attachment = request.env['ir.attachment'].sudo().search_read( 
 +            [('id', '=', int(attachment_id))], 
 +            ["name", "datas", "mimetype", "res_model", "res_id", "type", "url"
 +        ) 
 + 
 +        if attachment: 
 +            attachment = attachment[0] 
 +        else: 
 +            return redirect(self.orders_page) 
 + 
 +        # Check if the user has bought the associated product 
 +        res_model = attachment['res_model'
 +        res_id = attachment['res_id'
 +        purchased_products = request.env['account.move.line'].get_digital_purchases() 
 + 
 + 
 +        if res_model == 'product.product': 
 +            if res_id not in purchased_products: 
 +                return redirect(self.orders_page) 
 +</code> 
 +Aussi elle vérifie la pièce jointe (attachement) sur le module **product.template**  
 +<code python> 
 + # Also check for attachments in the product templates 
 +        elif res_model == 'product.template': 
 +            template_ids = request.env['product.product'].sudo().browse(purchased_products).mapped('product_tmpl_id').ids 
 +            if res_id not in template_ids: 
 +                return redirect(self.orders_page) 
 + 
 +        else: 
 +            return redirect(self.orders_page) 
 +</code> 
 +Si le type de l’attachement == 'module' une requête sera envoyé pour vérifier si les modules avec ces versions existe sur le serveur (module-manager) a travers la route : http://m-m/api/update/modules/version 
 +<code python> 
 +data = [] 
 +# Get the list of product & append them in a list [name, version] 
 +for a in attachments: 
 +    if a['version']: 
 +        b = requests.get(f'{static_url}/api/update/modules/{a["version"]}'
 +        log.warning('======== B ============== {} '.format(b)) 
 +        data.append( 
 +            { 
 +            "name": a['name'], 
 +            "version": a['version'
 +            }) 
 +</code> 
 + 
 +Au niveau du serveur Module-manager: 
 +La fonction **update_module_list()** fait appel à la fonction **module_populator()**: 
 +<code python> def update_module_list(request, version): 
 +    utils.modules_populator(Module, str(version)) 
 +    return JsonResponse({'status': 200, 'date':" DATE "}) 
 +</code> 
 +La fonction **module_populator()** récupère la version du module et le nom du modele: 
 +  * La fonction récupère la liste des modules depuis gitlab a traves la fonction **get_module_liste()** et vérifie si la version du module existe sur la liste  
 +  * Si la version n'existe pas elle va créer des modules sur la base de données locale du module manager pour les version qui n’existe pas 
 +<code python> 
 +def modules_populator(model, version): 
 +    """ 
 +        Create Modules in The Local Database     
 +    """ 
 +    for module in get_module_list(version=version): 
 +        # Check if module exists in the local database 
 +        if not model.objects.filter( 
 +            name=module, 
 +            version=version 
 +            ).exists(): 
 +                model.objects.create( 
 +                    name=module, 
 +                    version=version 
 +                ) 
 +</code> 
 +la fonction **get_module_liste()** : 
 +<code python> 
 +def get_module_list(version): 
 +    """ 
 +        Fetch all the modules by Name & Version then return the it as a list 
 +    """ 
 +     
 +    repo_modules = f'{settings.GITLAB_URL}/projects/{settings.PROJECT_ID}/repository/tree?ref={version}' 
 +    get_modules_req = requests.get( 
 +            repo_modules, 
 +            headers=settings.HEADERS 
 +        ).text 
 + 
 +    # GET ALL MODULES OF ELOAPPS REPOSITORY 
 +    modules_list = [] 
 +    for module in json.loads(get_modules_req): 
 +        modules_list.append(module['path']) 
 +    print(f"==== modules_list = {modules_list} ===="
 +    return modules_list 
 +</code> 
 + 
 +Après la mise à jour des modules sur le serveur module-manager et la vérification avec le dépôt Gitlab , on arrivera à l’étape de vérification du token de l'utilisateur , cette étape sera faite sur la même fonction **download_attachement()** : 
 +<code python> 
 +if user['access_token'] : 
 +    log.warning('in if token'
 +    token_id = request.env['user.token'].sudo().search_read([('id','=', user['access_token'][0])],['access_token']) 
 +    token = token_id[0]['access_token'
 +    log.warning('token {}'.format(token)) 
 + 
 +# If the user doesn t have a token create a call to the url service to create 
 +# a access token () 
 +else : 
 +    log.warning('in else token'
 +    token = request.env['res.users'].sudo().get_access(user['login'],user['access_token']).access_token 
 +log.warning("token{} ".format(token)) 
 +</code> 
 +La fonction **get_acces()** vérifie si l’utilisateur existe au niveau du serveur module-manager: 
 +  * Sur le service module-manager la vérification de l'utilisateur se fait à travers la route: http://m-m/user/exists/+mail 
 +  * Si l'utilisateur existe sur le serveur module-manager et possède d'un token sur odoo , la fonction **get_acces()** reourne le token 
 +  * Si l'utilisateur existe sur le serveur module-manager et ne possède pas un token sur odoo ; une requete sera enovoyé à la route : http://m-m/api-token-auth + data  = {'username':mail, 'password':PILOT-ALGA-ANDY} , cette requette récupere le token depuis e servaur sans creer un nouveau utilisateur 
 +  * Si l'utilisateur n'existe pas sur le serveur module-manager, une requette va creer un nouveauutilisateur su le serveur avec le mail du client de odoo , cela fait à travers la route suivante : http://m-m/user/api/register  + data  = {'username':mail, 'password':PILOT-ALGA-ANDY} et retourne le token  
 +  * Si l'utilisateur possède un token sur odoo ,le token sera récupéré sans avoir passé par le service module-manager 
 +<code python> 
 +def get_access(self, mail,token): 
 +    url_user = "http://m-m/api/user/exists/"+ mail 
 +    url     = "http://m-m/api/user/register" 
 +    url_token = "http://m-m/api-token-auth" 
 +    data = { 
 +             'username': mail, 
 +             'password': 'PILOT-ALGA-ANDY' 
 +            }  
 +    req_user =json.loads(requests.get(str(url_user)).text) 
 +    #If the user exists in the server  
 +    if req_user['exists']: 
 +       #likely never happens  
 +       if token : 
 +           return token 
 +           #fetch the token from the server and return it without creating a new user 
 +           else : 
 +               req_token = json.loads(requests.post(url_token, data=data).text) 
 +               token = self.env['user.token'].create({ 
 + 'access_token': req_token['token'], 
 + 'user_id': self.env['res.users'].search([('login','=', mail)]).id, 
 + }) 
 +               return token 
 +     #create a user in the server with mail and fetch the token 
 +     else : 
 +         req = json.loads(requests.post(url, data=data).text) 
 +         token = self.env['user.token'].create({ 
 + 'access_token': req['key'], 
 + 'user_id': self.env['res.users'].search([('login','=', mail)]).id, 
 + }) 
 +         return token 
 +</code> 
 +Après avoir terminer tous ces étapes avec succès, une requête sera envoyé à la route : http://m-m/connect/+ data + token , avec data = {la liste des attachements du client sur odoo }  
 +cette étape mettre a jour le compte du client au niveau du serveur module-manager avec la listes des pièces-jointes  
 +après il sera redirigé  vers la listes du module sur le serveur module-manager à traves la route : http://m-m/modules?token pour qu'il puisse accéder à ces pièces-jointes et les télécharger . 
 + 
 +la suite de la fonction **download_attachement()** : 
 +<code python> 
 + url_connect = f"{static_url}/connect" 
 + url_mdl = f"{static_url}/modules?token={token}" 
 + 
 + #  
 + # url = "http://192.168.1.130/api/modules/create" 
 + 
 + req = requests.put(url_connect ,json=data, headers={"Authorization": f"Token {token}"}) 
 + log.warning("req  1::: {} ".format(req)) 
 + # req = requests.post(url_update, data=json.dumps(data), headers={'Content-Type': 'application/json'}).text 
 + # log.warning("req 2::: {} ".format(req)) 
 + # log.warning(req) 
 + return redirect(url_mdl) 
 +</code> 
 + 
 + 
 + 
 +===== Résumé ===== 
 +Un client a aquis un module et souhaite le télécharger. 
 + 
 +En appuyant sur le bouton télécharger sur Odoo 
 +  - Odoo envoie une requête sur ''/api/update/modules/15.0'' (15.0 est un exemple de la version souhaitée par le client)  
 +  - Odoo envoie une requête sur ''/api/user/exists/anwar.said@gmail.com'' (anwar.said@gmail.com est un exemple du mail client) 
 +  - Odoo envoie une requête sur ''/api/user/register'' 
 +  - Odoo reçoit un token 
 +  - Odoo envoie une requête sur ''/connect'' 
 +  - Odoo redirige le client vers ''/modules'' avec comme paramètre le token reçu en (4) 
 + 
 + 
 + 
 + 
  • system_administration/automation/module_manager.1647637699.txt.gz
  • Last modified: 2022/03/18 21:08
  • by aziz