Skip to Content
Odoo Menu
  • Prihlásiť sa
  • Vyskúšajte zadarmo
  • Aplikácie
    Financie
    • Účtovníctvo
    • Fakturácia
    • Výdavky
    • Tabuľka (BI)
    • Dokumenty
    • Podpis
    Predaj
    • CRM
    • Predaj
    • POS Shop
    • POS Restaurant
    • Manažment odberu
    • Požičovňa
    Webstránky
    • Tvorca webstránok
    • eShop
    • Blog
    • Fórum
    • Živý chat
    • eLearning
    Supply Chain
    • Sklad
    • Výroba
    • Správa životného cyklu produktu
    • Nákup
    • Údržba
    • Manažment kvality
    Ľudské zdroje
    • Zamestnanci
    • Nábor zamestnancov
    • Voľné dni
    • Hodnotenia
    • Odporúčania
    • Vozový park
    Marketing
    • Marketing sociálnych sietí
    • Email marketing
    • SMS marketing
    • Eventy
    • Marketingová automatizácia
    • Prieskumy
    Služby
    • Projektové riadenie
    • Pracovné výkazy
    • Práca v teréne
    • Helpdesk
    • Plánovanie
    • Schôdzky
    Produktivita
    • Tímová komunikácia
    • Schvalovania
    • IoT
    • VoIP
    • Znalosti
    • WhatsApp
    Third party apps Odoo Studio Odoo Cloud Platform
  • Priemyselné odvetvia
    Retail
    • Book Store
    • Clothing Store
    • Furniture Store
    • Grocery Store
    • Hardware Store
    • Toy Store
    Food & Hospitality
    • Bar and Pub
    • Reštaurácia
    • Fast Food
    • Guest House
    • Beverage distributor
    • Hotel
    Reality
    • Real Estate Agency
    • Architecture Firm
    • Konštrukcia
    • Estate Managament
    • Gardening
    • Property Owner Association
    Poradenstvo
    • Accounting Firm
    • Odoo Partner
    • Marketing Agency
    • Law firm
    • Talent Acquisition
    • Audit & Certification
    Výroba
    • Textile
    • Metal
    • Furnitures
    • Jedlo
    • Brewery
    • Corporate Gifts
    Health & Fitness
    • Sports Club
    • Eyewear Store
    • Fitness Center
    • Wellness Practitioners
    • Pharmacy
    • Hair Salon
    Trades
    • Handyman
    • IT Hardware and Support
    • Solar Energy Systems
    • Shoe Maker
    • Cleaning Services
    • HVAC Services
    Iní
    • Nonprofit Organization
    • Environmental Agency
    • Billboard Rental
    • Photography
    • Bike Leasing
    • Software Reseller
    Browse all Industries
  • Komunita
    Vzdelávanie
    • Tutoriály
    • Dokumentácia
    • Certifikácie
    • Školenie
    • Blog
    • Podcast
    Empower Education
    • Vzdelávací program
    • Scale Up! Business Game
    • Visit Odoo
    Softvér
    • Stiahnuť
    • Porovnanie Community a Enterprise vierzie
    • Releases
    Spolupráca
    • Github
    • Fórum
    • Eventy
    • Preklady
    • Staň sa partnerom
    • Services for Partners
    • Register your Accounting Firm
    Služby
    • Nájdite partnera
    • Nájdite účtovníka
    • Meet an advisor
    • Implementation Services
    • Zákaznícke referencie
    • Podpora
    • Upgrades
    ​Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +1 (650) 691-3277
    Získajte demo
  • Cenník
  • Pomoc

Odoo is the world's easiest all-in-one management software.
It includes hundreds of business apps:

  • CRM
  • e-Commerce
  • Účtovníctvo
  • Sklady
  • PoS
  • Projektové riadenie
  • MRP
All apps
You need to be registered to interact with the community.
All Posts People Badges
Tagy (View all)
odoo accounting v14 pos v15
About this forum
You need to be registered to interact with the community.
All Posts People Badges
Tagy (View all)
odoo accounting v14 pos v15
About this forum
Pomoc

XML-RPC Fetching Records by External ID

Odoberať

Get notified when there's activity on this post

This question has been flagged
xmlrpcexternalid
8 Replies
22664 Zobrazenia
Avatar
Jason Judge

I would like to fetch records over the API using the external ID of those records. Is there a simple way to do this that I am overlooking, because my current approach seems very convoluted.

Given complete names 'l10n_uk.state_uk_99' and 'l10n_uk.state_uk_98', I would like to fetch the two states they represent.

First I need to split the complete names into modules and names. This gives me module "l10n_uk" and names "state_uk_99" and "state_uk_98". If there are several modules involved, then that is another pain point to work around, but let's assume there is just one.

Now I need to search ir.modules.data for these external IDs using this criteria:

    array(
        array("model", "=", "res.country.state"),
        array("module", "=", "l10n_uk"),
        array("name", "in", array("state_uk_99", "state_uk_98")),
    )

This returns me the two IR model IDs. Then I need to fetch those IR model records - I just want the res_id field:

    $my_api->read('ir.modules.data', array(5310, 5311), array('res_id'));

That gives me an array of two arrays. I need to loop through them to find and collect the res_id IDs.

Now I have those IDs, I can fetch the underlying records:

    $my_api->read('res.country.states', $res_ids);

That gives me the underlying two states behind those original external IDs. BUT those records don't contain the external IDs, so I must make sure I keep the external_id:res_id lookup or distribute the external IDs over the state records I have retrieved.

What a faff! Are there any short cuts? Can I search states directly and somehow include the ir.module.data in the search criteria? When reading the states, can I include the external IDs in the retrived columns?

I realise the relationship between the states and the external IDs will be 1:1 only in context (e.g. for my locale) and may not be 1:1 at the database level, so this probably can't be done any other way. But I do need to ask...

Thanks :-)

0
Avatar
Zrušiť
Ray Carnes

I think your approach can benefit from a rethink if your goal is an approach that works widely and not just on a specific database. The purpose of an External ID is to allow integration with external business systems. They are not created when records are entered via the UI, only when imported via CSV or via XML. All of our customers use a global modules for Country and State/Province, so your approach would fail on all of their systems, would fail on systems that use a module other than the 'l10n_uk' module, would fail on systems that renamed that module, and would also fail if people entered in their own 'states'. Perhaps backup and outline the business problem you are trying to solve?

Jason Judge
Autor

The business process is simple: there are country states in the ERP, imported from various sources. Each state has an external ID. They have been imported from various sources, and have different IDs in different formats. The external ID is a string. We make no assumptions as to what that string is - it is just a series of characters. We are maintaining the states on another system. On that system, against each state, we are storing the external ID of the matching state on the ERP. States that are added to that external system are given a external ID, then exported to the ERP via a CSV file, where they are imported automatically. This keeps them all in sync, which is in one direction - TO the ERP. And that's it. We have data on another system - the main system - and we push updates to OpenERP. We also have legacy external IDs to deal with, which have been generated by whatever import processes have been used in the past. So my question above is: how do I get at this data through the API? Of course, how this data works is a big game of guesswork without a decent set of documentation, which seems to have been the missing element on this project for a long time. I can only assume that what is there is in the ERP system now, is what is supposed to be there.

Jason Judge
Autor

Also we must not forget that the simple action of *exporting* records will create system-generated external IDs for those records that don't have any. My external system cannot __export__.control that, but it still needs to be able to scan and reference and potentially update those records. External IDs can easily become a mish-mash of different formats from different sources, unfortunately.

Jason Judge
Autor

@Bole that's useful for fetching a single model name and database ID for a record, based on its complete external ID. It can be done in one API call rather than several, as I described above, which can help performance when only one conversion is needed.

Avatar
Bole
Best Answer

To fetch a record by external id, try this method:

some_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, module_name, xml_id)
in your case that would be like:
some_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, l10n_uk, state_uk_99)

and you will have current id for the record..

1
Avatar
Zrušiť
Matt Taylor

This answer does not use XML-RPC, as described in the question.

Ray Carnes

some_id = sock.execute(dbname, uid, pwd, 'ir.model.data', 'get_object_reference', 'l10n_uk','state_uk_99'))

Ray Carnes (ray)

You can now do self.env.ref('external.identifier')

Avatar
Jerome Guerriat
Best Answer

It may be a bit late, but for future reference, i encountered the same problem and i solved it with the following:

odoo = odoorpc.ODOO(server, port=port)

odoo.login(db, username, password)

country_id = odoo.env['ir.model.data'].get_object_reference('base',country)


where "country" was "ca", "be", "us",...

0
Avatar
Zrušiť
Jason Judge
Autor

It's never too late when a thread is left hanging :-)

I needed to access these records via XML-RPC from PHP, so local calls (within the Odoo app) like this are no so useful, though do add to the understanding. In the end I created a small package to access the API, and wrapped up the fetches that I detailed in the original post into a single function call, as can be seen here: https://github.com/academe/openerpapi#examples It is as simple for me to use as `$partner = $object->readExternal('res.partner', 'base.my_foo');` and has been happily running for a couple of years now, creating customers, invoices, paying invoices etc. for an expedition booking system.

Jason Judge
Autor

`get_object_reference` may also be exposed in the API now. It wasn't back in 2014, so far as I could tell.

Avatar
Guenter Bartsch
Best Answer

In Odoo 8 using xmlrpc try something along these lines:

 sock2 = xmlrpclib.ServerProxy("http://127.0.0.1:8069/xmlrpc/2/object")
 res = sock2.execute_kw(dbname, uid, pwd, 'ir.model.data', 'get_object_reference', ['purchase', 'route_warehouse0_buy'], {})


0
Avatar
Zrušiť
Enjoying the discussion? Don't just read, join in!

Create an account today to enjoy exclusive features and engage with our awesome community!

Registrácia
Related Posts Replies Zobrazenia Aktivita
xmlrpc Error when attempting to connect to my local instance Solved
xmlrpc
Avatar
Avatar
Avatar
3
júl 25
4188
Cannot marshal None unless allow_none is enabled
xmlrpc
Avatar
1
okt 24
3046
[SOLVED] Odoo-16 ValueError: External ID not found in the system
externalid
Avatar
Avatar
Avatar
Avatar
3
júl 24
11293
How to run a method from external api as the superuser
xmlrpc
Avatar
Avatar
1
apr 24
3112
<methodName>execute</methodName>
xmlrpc
Avatar
0
sep 23
2421
Komunita
  • Tutoriály
  • Dokumentácia
  • Fórum
Open Source
  • Stiahnuť
  • Github
  • Runbot
  • Preklady
Služby
  • Odoo.sh hosting
  • Podpora
  • Vyššia verzia
  • Custom Developments
  • Vzdelávanie
  • Nájdite účtovníka
  • Nájdite partnera
  • Staň sa partnerom
O nás
  • Naša spoločnosť
  • Majetok značky
  • Kontaktujte nás
  • Pracovné ponuky
  • Eventy
  • Podcast
  • Blog
  • Zákazníci
  • Právne dokumenty • Súkromie
  • Bezpečnosť
الْعَرَبيّة Català 简体中文 繁體中文 (台灣) Čeština Dansk Nederlands English Suomi Français Deutsch हिंदी Bahasa Indonesia Italiano 日本語 한국어 (KR) Lietuvių kalba Język polski Português (BR) română русский язык Slovenský jazyk slovenščina Español (América Latina) Español ภาษาไทย Türkçe українська Tiếng Việt

Odoo je sada podnikových aplikácií s otvoreným zdrojovým kódom, ktoré pokrývajú všetky potreby vašej spoločnosti: CRM, e-shop, účtovníctvo, skladové hospodárstvo, miesto predaja, projektový manažment atď.

Odoo prináša vysokú pridanú hodnotu v jednoduchom použití a súčasne plne integrovanými biznis aplikáciami.

Website made with

Odoo Experience on YouTube

1. Use the live chat to ask your questions.
2. The operator answers within a few minutes.

Live support on Youtube
Watch now