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é
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)
Aussi elle vérifie la pièce jointe (attachement) sur le module product.template
# 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)
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
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'] })
Au niveau du serveur Module-manager: La fonction update_module_list() fait appel à la fonction module_populator():
def update_module_list(request, version): utils.modules_populator(Module, str(version)) return JsonResponse({'status': 200, 'date':" DATE "})
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
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 )
la fonction get_module_liste() :
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
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() :
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))
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
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
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() :
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)
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)