2017-09-06 81 views
2

我目前正在爲堅持使用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你問這個問題? –

回答

2

這僅僅是一個例子做訪問聯繫人/合作伙伴從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,你可以適應它 –

3

有很多的方式將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

1

如果要創建從拉伸你的應用程序,只在需要的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令牌或不需要? –