有没有人用Android整合ODOO?

问题描述:

我目前正在为坚持使用Odoo for API的客户开发一个Android应用程序。我没有任何关于它的任何想法即使在提及link之后,我仍然没有收到它。他们提供了一个URL,数据库名称,用户名和密码。如果任何人之前使用Android做过Odoo,你能提出什么建议吗?有没有人用Android整合ODOO?

+2

你可以参考这个文档https://media.readthedocs.org/pdf/odoo-mobile-doc/latest/odoo-mobile-doc.pdf或https://github.com/Odoo-mobile/framework –

+0

Did你做任何odoo fr后端api? – Noufal

+0

对于哪个版本的odoo你问这个问题? –

这仅仅是一个例子做访问联系人/合作伙伴从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

我想要的是Android.I认为这是为phython.Right? – Noufal

+1

是的,我在这里使用Python的xmlrpc,你可以适应它 –

有很多的方式将Android连接到Odoo。在这里,他们是:

  1. JSON-RPC
  2. XML-RPC(尤其是aXMLRPC,这是我在用的)
  3. 还有一个叫Odoo Mobile Framework框架。我尝试过但发现了很多问题,但无法正常工作。你可以找到文档here

Odoo的Web Service API可用于Python,Ruby,PHP和Java。我强烈建议去看看。

对于我的情况,我克隆了aXMLRPC git存储库,在我的项目中创建了一个包并调整了原始包名。但最近我发现Stack Overflow的this解释了如何使用Gradle将AMLMLPC添加到您的Android项目中(我还没有尝试过)。

Odoo已经提供三个端点:

  1. xmlrpc/2/db让你的服务器上可用的数据库列表,它不需要进行身份验证;
  2. xmlrpc/2/common登录到服务器,它不需要进行身份验证;
  3. xmlrpc/2/object,用于通过execute_kw RPC函数调用odoo模型的方法。

    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; 
        } 
    
    } 
    

在这个类中,构造函数作为参数服务器地址(也可以是http(s)://your_ip_address:the_port_number)和path ('db', 'common' or 'object')

checkServer方法返回一个实际上是包含可用数据库列表的数组的对象。

登录mehtod返回一个Integer,它是经过身份验证的用户的Id。

对于Odoo CRUD方法(search_read,search_count,search,write,create,unlink),您可以看看与您想要的方法匹配的Odoo Web Service API Java代码。

这是search_read方法的一个例子。我假设你有一个名为client的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. 对象是例如"res.partner"
  2. 条件的Odoo模型域(过滤器)是这样的:Collections.singletonList(Collections.singletonList(Arrays.asList("supplier", "=", true)));
  3. 领域,你想要得到的领域,

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

您必须将方法的结果转换为Object [],它将为您提供一个数组,其中包含一个表示记录的对象列表。

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"); 
    } 
} 

这里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; 
    } 
} 

如果你有many2one场,你只能访问ID和相关记录的名称。您可以使用以下类来获取many2one记录的id和名称。

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; 
    } 
} 

Many2One类

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

对于其他剩余的CRUD方法的使用示例,你可以很容易地找到一个方式,他们通过阅读Odoo Web Service API documentation是如何工作的。

我希望这能给你一些见解。

+0

@Noufal让我知道它是否工作。 – guidev224

如果要创建从拉伸你的应用程序,只在需要的Android API的Odoo,这里是开源的API https://github.com/oogbox/odoo-mobile-api(Odoo的Android API)

要在Android上使用,首先添加以下依赖于你的应用水平build.gradle

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

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

感谢

+0

真的很好努力..我可以知道我们需要通过登录时通过CSRF令牌吗?由于Odoo 10版本在登录时具有CSRF令牌安全性。我们需要在登录时通过CSRF令牌或不需要? –