C'è qualcuno che integra ODOO con Android?

Sto attualmente sviluppando un'applicazione android per un client che insiste nell'utilizzo di Odoo per API. Non ho alcuna idea su di esso che non lo faccio nemless dopo aver fatto riferimento a questo collegamento . Essi forniscono un URL, un nome di database, un nome utente , e password. Se qualcuno ha fatto Odoo con Android prima, puoi dare suggerimenti?

  • Fornitura di text da frammento a TextView personalizzato
  • android: eliminazione di un'image
  • Fullscreen via Javascript su Chrome per Android (compresse)
  • adb ha ottenuto due stessi numbers di serie quando è collegato a due telefoni intelligenti
  • Uso di Target in Picasso sull'adattatore
  • Tema chiaro per AlertDialog?
  • Android: Barra di azione personalizzata, Come utilizzare l'intera width?
  • Impostare la casella di controllo in modo dinamico da sqlite in un frammento
  • Layout di Android S3 vs layout Galaxy Nexus
  • Problemi trovati caricamento Plugins in Android Studio
  • Imansible generare APK Release a causa di GCM SenderId Android
  • È ansible get il context dell'applicazione in un progetto di libreria Android?
  • 2 Solutions collect form web for “C'è qualcuno che integra ODOO con Android?”

    Questo è solo un esempio fatto per accedere ai contatti / partner da 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')}]) 

    Ci sono molti modi per colbind Android a Odoo. Eccoli:

    1. JSON-RPC
    2. XML-RPC (specialmente aXMLRPC , questo è quello che sto usando)
    3. C'è anche un framework chiamato Odoo Mobile Framework . Ho provato ma ho trovato un sacco di problemi e non sono stato in grado di farlo funzionare correttamente. È ansible trovare la documentazione qui .

    Odoo ha un API Web Service disponibile per Python, Ruby, PHP e Java. Raccommand vivamente di dare un'occhiata.

    Per il mio caso, ho clonato il repository git aXMLRPC, ho creato un pacchetto nel mio progetto e ho adattato il nome del pacchetto originale. Ma di recente ho trovato questo su Overflow Stack spiegando come aggiungere aXMLRPC al tuo progetto Android utilizzando Gradle (non l'ho ancora provato).

    Odoo aveva messo a disposizione tre endpoint:

    1. xmlrpc/2/db per get l'elenco dei database disponibili sul tuo server, non richiede l'authentication;
    2. xmlrpc/2/common per accedere al server, non richiede l'authentication;
    3. xmlrpc/2/object , viene utilizzato per call i methods di templates odoo tramite la function 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; } } 

    In questa class, il constructor come argomenti l'indirizzo del server (può essere http(s)://your_ip_address:the_port_number ) e il path ('db', 'common' or 'object') .

    Il metodo checkServer restituisce un object in realtà un arrays contenente l'elenco dei database disponibili.

    Il login mehtod restituisce un integer che è l'ID dell'autenticato utente.

    Per i motori di Odoo CRUD (ricerca_copera, ricerca_count, ricerca, scrittura, creazione, unlink) è ansible dare un'occhiata al codice Java Java API di Odoo corrispondente al metodo desiderato.

    Ecco un esempio del metodo search_read. Suppongo che tu abbia un client denominato 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; } 

    Dove

    1. l'object è un model Odoo ad esempio "res.partner"
    2. le condizioni è il dominio (filter) qualcosa di simile: Collections.singletonList(Collections.singletonList(Arrays.asList("supplier", "=", true)));
    3. campi, i campi che si desidera get,

        campi = nuovo HashMap () {{put ("campi", Arrays.asList ("id", "nome", "is_company", "strada"));  }}; 

    È necessario inserire il risultato del metodo in Object [] che vi darà una matrix contenente un elenco di oggetti ciascuno che rappresenta un record.

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

    Qui la class 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; } } 

    Se si dispone di un field many2one è ansible accedere solo all'ID e al nome del record correlato. È ansible utilizzare la class seguente per get l'ID e il nome del record 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; } } 

    Esempio di utilizzo della class 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(); 

    Per altri methods CRUD rimanenti, è ansible trovare facilmente un modo in cui funzionano leggendo la documentazione API di Odoo Web Service .

    Spero che questo ti dà alcune intuizioni.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.