2017-09-06 5 views
2

私は現在、APIのためにOdooを使用することを主張するクライアントのためのアンドロイドアプリケーションを開発しています。私はそれについて何も考えていません。linkを参照してもそれを取得していません。 、ユーザー名、パスワードを入力してください。もし誰かが以前に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

あなたはodoo fr backend 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用です。これはphython用です。右? – Noufal

+1

はいここで私はPythonを使用してxmlrpcを使用しました。それを適応させることができます –

3

をOdooにアンドロイドを接続する方法はたくさんあります。ここで彼らは、次のとおりです。

  1. JSON-RPC
  2. XML-RPC(特にaXMLRPC、これは私が使っているものです)
  3. Odoo Mobile Frameworkと呼ばれるフレームワークでもあります。私はそれを試してみましたが、多くの問題を発見し、正しく動作させることができませんでした。文書hereがあります。

OdooにはWeb Service APIがあり、Python、Ruby、PHP、Javaで利用できます。私は強くお勧めします。

私の場合、私はaXMLRPC gitリポジトリをクローンし、プロジェクトにパッケージを作成し、元のパッケージ名を適合させました。しかし、最近、私はthisをスタックオーバーフローで見つけました。あなたはGradleを使ってAndroidプロジェクトにaXMLRPCを追加する方法を説明しました(まだ試してみませんでした)。

Odooは、3つのエンドポイント利用可能になった:

  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メソッドは、実際に使用可能なデータベースのリストを含む配列であるオブジェクトを返します。

login mehtodは、認証されたユーザーのIDであるIntegerを返します。

Odoo CRUD mehtods(search_read、search_count、search、write、create、unlink)は、希望するメソッドに一致するOdoo Web Service API Javaコードを調べることができます。

次に、search_readメソッドの例を示します。私は、あなたがclientという名前のXMLRPCClientを持っていると仮定します。Collections.singletonList(Collections.singletonList(Arrays.asList("supplier", "=", true)));

  • フィールド、あなたが取得したいフィールド:例えばOdooモデル"res.partner"

  • 条件はドメイン(フィルター)のようなものです

    1. オブジェクト

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

      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と名前を取得できます。他の残りのCRUDメソッドの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(); 
    

    の使用の

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

    例は、あなたが簡単に彼らはOdoo Web Service API documentationを読み取ることにより、どのように動作するかの方法を見つけることができます。

    私はこれがあなたにいくつかの洞察を与えることを望みます。

  • +0

    @Noufalそれが動作するかどうか教えてください。 – guidev224

    1

    あなたはストレッチやOdooのためだけに必要なAndroidのAPIからアプリケーションを作成する場合は、ここではオープンソースのAPI https://github.com/oogbox/odoo-mobile-api(OdooアンドロイドAPI)

    が最初にアプリのレベルに次の依存関係を追加し、アンドロイドで使用することです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トークンを渡す必要がありますか、ログインする必要はありませんか? –

    関連する問題