有没有人用Android整合ODOO?
我目前正在为坚持使用Odoo for API的客户开发一个Android应用程序。我没有任何关于它的任何想法即使在提及link之后,我仍然没有收到它。他们提供了一个URL,数据库名称,用户名和密码。如果任何人之前使用Android做过Odoo,你能提出什么建议吗?有没有人用Android整合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')}])
我想要的是Android.I认为这是为phython.Right? – Noufal
是的,我在这里使用Python的xmlrpc,你可以适应它 –
有很多的方式将Android连接到Odoo。在这里,他们是:
- JSON-RPC
- XML-RPC(尤其是aXMLRPC,这是我在用的)
- 还有一个叫Odoo Mobile Framework框架。我尝试过但发现了很多问题,但无法正常工作。你可以找到文档here。
Odoo的Web Service API可用于Python,Ruby,PHP和Java。我强烈建议去看看。
对于我的情况,我克隆了aXMLRPC git存储库,在我的项目中创建了一个包并调整了原始包名。但最近我发现Stack Overflow的this解释了如何使用Gradle将AMLMLPC添加到您的Android项目中(我还没有尝试过)。
Odoo已经提供三个端点:
-
xmlrpc/2/db
让你的服务器上可用的数据库列表,它不需要进行身份验证; -
xmlrpc/2/common
登录到服务器,它不需要进行身份验证; -
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;
}
凡
- 对象是例如
"res.partner"
- 条件的Odoo模型域(过滤器)是这样的:
Collections.singletonList(Collections.singletonList(Arrays.asList("supplier", "=", true)));
-
领域,你想要得到的领域,
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是如何工作的。
我希望这能给你一些见解。
@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
感谢
真的很好努力..我可以知道我们需要通过登录时通过CSRF令牌吗?由于Odoo 10版本在登录时具有CSRF令牌安全性。我们需要在登录时通过CSRF令牌或不需要? –
你可以参考这个文档https://media.readthedocs.org/pdf/odoo-mobile-doc/latest/odoo-mobile-doc.pdf或https://github.com/Odoo-mobile/framework –
Did你做任何odoo fr后端api? – Noufal
对于哪个版本的odoo你问这个问题? –