2017-09-06 1 views
2

Je suis actuellement en train de développer une application android pour un client qui insiste pour utiliser Odoo for API.Je n'ai aucune idée à ce sujet je ne comprends pas même après avoir référé ce link .Ils fournissent une URL, nom de la base de données , nom d'utilisateur, et mot de passe.Si quelqu'un a déjà fait Odoo avec Android, pouvez-vous donner des suggestions?Y a-t-il quelqu'un ODOO intégré avec Android?

+2

vous pouvez consulter ce document https://media.readthedocs.org/pdf/odoo-mobile-doc/latest/odoo-mobile-doc.pdf ou https://github.com/Odoo-mobile/framework –

+0

vous faites n'importe quel odoo backend api? – Noufal

+0

Pour quelle version de odoo vous posez cette question? –

Répondre

2

Ceci est juste un exemple a des contacts d'accès/partenaires de Odoo:

#!/usr/bin/env python 

import csv 
from xmlrpclib import ServerProxy 

SERVER = 'http://localhost:8069' 
DATABASE = 'testcompany' 
USERNAME = 'admin' 
PASSWORD = 'password' 

FILE_PATH = 'ODOO_clientsMain2_test.csv' 

server = ServerProxy('http://localhost:8069/xmlrpc/common') 
user_id = server.login(DATABASE, USERNAME, PASSWORD) 

server = ServerProxy('http://localhost:8069/xmlrpc/object') 

def search(list, key): 
    for item in list: 
     return item[key] 

reader = csv.reader(open(FILE_PATH,'rb')) 

for row in reader: 
    #print row 
    partner_template = { 
     'name': row[0], 
     #'company_id': row[1], 
    } 
    if row[2] is not None and row[2]<>'': 
     partner_template.update({'email': row[2]}) 
    if row[5] is not None and row[5]<>'': 
     partner_template.update({'tin': row[5]}) 
    if row[6] is not None and row[6]<>'': 
     partner_template.update({'ref': row[6]}) 
    if row[8] is not None and row[8]<>'': 
     partner_template.update({'phone': row[8]}) 
    if row[9] is not None and row[9]<>'': 
     partner_template.update({'mobile': row[9]}) 

    print partner_template 

    partner_id = server.execute_kw(DATABASE, user_id, PASSWORD, 'res.partner', 'create', [partner_template]) 

    #create External ID 

    external_ids = { 
     'model': 'res.partner', 
     'name': row[11], 
     'res_id': partner_id, 
    } 
    external_id = server.execute_kw(DATABASE, user_id, PASSWORD, 'ir.model.data', 'create', [external_ids]) 

    # update related fields 

    if row[7] is not None and row[7]<>'': 
     #look up and update payment term 

     payment_term_id = server.execute_kw(DATABASE, user_id, PASSWORD, 'account.payment.term', 'search_read', [[['name','=',row[7]],['active', '=', True]]],{'fields': ['id'], 'limit': 1}) 
     if payment_term_id is not None: 
      id = server.execute_kw(DATABASE, user_id, PASSWORD, 'res.partner', 'write', [[partner_id],{'property_payment_term': search(payment_term_id,'id')}]) 

    if row[10] is not None and row[10]<>'': 
     #look up and update pricelist 

     pricelist_id = server.execute_kw(DATABASE, user_id, PASSWORD, 'product.pricelist', 'search_read', [[['name','=',row[10]],['active', '=', True]]],{'fields': ['id'], 'limit': 1}) 

     if pricelist_id is not None: 
      id = server.execute_kw(DATABASE, user_id, PASSWORD, 'res.partner', 'write', [[partner_id],{'property_product_pricelist': search(pricelist_id,'id')}]) 
+0

Ce que je veux c'est pour Android.Je pense que c'est pour phython.Right ?? – Noufal

+1

oui ici j'ai utilisé xmlrpc en utilisant python, vous pouvez l'adapter –

3

Il y a beaucoup de façons de se connecter à Android Odoo. Ici, ils sont:

  1. JSON-RPC
  2. XML-RPC (en particulier aXMLRPC, ce que je me sers)
  3. Il est aussi un cadre appelé Odoo Mobile Framework. J'ai essayé mais j'ai trouvé beaucoup de problèmes et je n'ai pas réussi à le faire fonctionner correctement. Vous pouvez trouver la documentation here.

Odoo a un Web Service API qui est disponible pour Python, Ruby, PHP et Java. Je recommande fortement de jeter un coup d'oeil.

Pour mon cas, j'ai cloné le référentiel aXMLRPC git, créé un package dans mon projet et adapté le nom du package d'origine. Mais récemment, j'ai trouvé this sur Stack Overflow expliquant comment ajouter aXMLRPC à votre projet Android en utilisant Gradle (je ne l'ai pas encore essayé).

Odoo avait mis à disposition trois critères d'évaluation:

  1. xmlrpc/2/db pour obtenir la liste des bases de données disponibles sur votre serveur, il ne nécessite pas d'être authentifié;
  2. xmlrpc/2/common pour se connecter au serveur, il ne nécessite pas d'être authentifié;
  3. xmlrpc/2/object, est utilisé pour appeler des méthodes de modèles odoo via la fonction RPC execute_kw.

    public class OdooConnect { 
        String url; 
        private XMLRPCClient client; 
    
        public OdooConnect(String serverAddress, String path) { 
         url = serverAddress + "/xmlrpc/2/" + path; 
         client = new XMLRPCClient(url); 
        } 
    
        public Object login(String db, String username, String password) { 
         Object object; 
         try { 
          object = client.call("login", db, username, password); 
          return object; 
         } catch (XMLRPCException e) { 
          e.printStackTrace(); 
         } 
         return null; 
        } 
    
        public Object checkServer() { 
         Object object; 
         try { 
          object = client.call("list", new Object[]{}); 
          return object; 
         } catch (XMLRPCException e) { 
          e.printStackTrace(); 
         } 
         return null; 
        } 
    
    } 
    

Dans cette classe, le constructeur comme arguments l'adresse du serveur (il peut être http(s)://your_ip_address:the_port_number) et le path ('db', 'common' or 'object').

La méthode checkServer renvoie un objet qui est en fait un tableau contenant la liste des bases de données disponibles.

La connexion mehtod renvoie un entier qui est l'identifiant de l'utilisateur authentifié. Pour les méthodes d'Odoo CRUD (search_read, search_count, rechercher, écrire, créer, dissocier) vous pouvez jeter un oeil au code Java Odoo Web Service API correspondant à la méthode que vous voulez.

Voici un exemple de la méthode search_read. Je suppose que vous avez un client nommé XMLRPCClient.

public Object search_read(String db, int user_id, String password, String object, List conditions, Map<String, List> fields) { 
    Object result = null; 
    try { 
     result = client.call("execute_kw", db, user_id, password, object, "search_read", conditions, fields); 
    } catch (XMLRPCException e) { 
     e.printStackTrace(); 
    } 
    return result; 
} 

  1. objet est un modèle Odoo par exemple "res.partner"
  2. conditions
  3. est le domaine (filtre) quelque chose comme ceci: Collections.singletonList(Collections.singletonList(Arrays.asList("supplier", "=", true)));
  4. champs, les champs que vous souhaitez obtenir,

    fields = new HashMap() {{put("fields", Arrays.asList("id","name","is_company","street")); }};

Vous devez convertir le résultat de la méthode en Objet [] qui vous donnera un tableau contenant une liste d'objets représentant chacun un enregistrement.

Object[] objects = (Object[]) result; 
if (objects.length > 0) { 
    for (Object object : objects) { 
     String name= OdooUtil.getString((Map<String, Object>) object, "name"); 
     boolean is_company= OdooUtil.getBoolean((Map<String, Object>) object, "is_company"); 
     String street = OdooUtil.getString((Map<String, Object>) object, "street"); 
     int id= OdooUtil.getInteger((Map<String, Object>) object, "id"); 
    } 
} 

Ici, la classe OdooUtil

public class OdooUtil { 

    public static String getString(Map<String, Object> map, String fieldName) { 
     String res = ""; 
     if (map.get(fieldName) instanceof String) { 
      res = (String) map.get(fieldName); 
     } 
     return res; 
    } 

    public static Integer getInteger(Map<String, Object> map, String fieldName) { 
     Integer res = 0; 
     if (map.get(fieldName) instanceof Integer) { 
      res = (Integer) map.get(fieldName); 
     } 
     return res; 
    } 

    public static Double getDouble(Map<String, Object> map, String fieldName) { 
     Double res = 0.0; 
     if (map.get(fieldName) instanceof Double) { 
      res = (Double) map.get(fieldName); 
     } 
     return res; 
    } 

    public static Boolean getBoolean(Map<String, Object> map, String fieldName) { 
     Boolean res = false; 
     if (map.get(fieldName) instanceof Boolean) { 
      res = (Boolean) map.get(fieldName); 
     } 
     return res; 
    } 


    public static Float getFloat(Map<String, Object> map, String fieldName) { 
     Float res = 0f; 
     if (map.get(fieldName) instanceof Float) { 
      res = (Float) map.get(fieldName); 
     } 
     return res; 
    } 
} 

Si vous avez un champ de many2one vous avez seulement accès à l'identifiant et le nom de l'enregistrement lié. Vous pouvez utiliser la classe suivante pour obtenir l'identifiant et le nom de l'enregistrement many2one.

public class Many2One { 
    private int id; 
    private String name; 

    public Many2One() { 
    } 

    public static Many2One getMany2One(Map<String, Object> stringObjectMap, String fieldName) { 
     Integer fieldId = 0; 
     String fieldValue = ""; 

     Many2One res = new Many2One(); 
     if (stringObjectMap.get(fieldName) instanceof Object[]) { 
      Object[] field = (Object[]) stringObjectMap.get(fieldName); 

      if (field.length > 0) { 
       fieldId = (Integer) field[0]; 
       fieldValue = (String) field[1]; 
      } 
     } 

     res.id = fieldId; 
     res.name = fieldValue; 

     return res; 
    } 

    public int getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 
} 

Exemple d'utilisation de Many2One classe

String partner_name= Many2One.getMany2One((Map<String, Object>) object, "partner_id").getName(); 
    int partner_id= Many2One.getMany2One((Map<String, Object>) object, "partner_id").getId(); 

Pour d'autres méthodes CRUD restantes, vous pouvez facilement trouver un moyen comment ils fonctionnent en lisant le Odoo Web Service API documentation.

J'espère que cela vous donne quelques idées.

+0

@Noufal laissez-moi savoir si cela fonctionne. – guidev224

1

Si vous créez votre application extensible et seulement nécessaire API Android pour Odoo, voici API open-source https://github.com/oogbox/odoo-mobile-api (Odoo android api)

Pour utiliser dans Android, ajoutez d'abord la dépendance suivante à votre niveau d'application build.gradle

compile 'com.oogbox.api:odoo:1.0.0'

Documentation: https://github.com/oogbox/odoo-mobile-api#getting-started

Merci

+0

vraiment un bon effort .. Puis-je savoir que nous devons passer le jeton CSRF lors de la connexion? Parce que la version Odoo 10 a une sécurité de jeton CSRF lors de la connexion. Nous devons passer le jeton CSRF ou pas besoin lors de la connexion? –