Skip to Content
Odoo Menu
  • Prijavi
  • Try it free
  • Aplikacije
    Finance
    • Knjigovodstvo
    • Obračun
    • Stroški
    • Spreadsheet (BI)
    • Dokumenti
    • Podpisovanje
    Prodaja
    • CRM
    • Prodaja
    • POS Shop
    • POS Restaurant
    • Naročnine
    • Najem
    Spletne strani
    • Website Builder
    • Spletna trgovina
    • Blog
    • Forum
    • Pogovor v živo
    • eUčenje
    Dobavna veriga
    • Zaloga
    • Proizvodnja
    • PLM
    • Nabava
    • Vzdrževanje
    • Kakovost
    Kadri
    • Kadri
    • Kadrovanje
    • Odsotnost
    • Ocenjevanja
    • Priporočila
    • Vozni park
    Marketing
    • Družbeno Trženje
    • Email Marketing
    • SMS Marketing
    • Dogodki
    • Avtomatizacija trženja
    • Ankete
    Storitve
    • Projekt
    • Časovnice
    • Storitve na terenu
    • Služba za pomoč
    • Načrtovanje
    • Termini
    Produktivnost
    • Razprave
    • Odobritve
    • IoT
    • Voip
    • Znanje
    • WhatsApp
    Third party apps Odoo Studio Odoo Cloud Platform
  • Industrije
    Trgovina na drobno
    • Book Store
    • Trgovina z oblačili
    • Trgovina s pohištvom
    • Grocery Store
    • Trgovina s strojno opremo računalnikov
    • Trgovina z igračami
    Food & Hospitality
    • Bar and Pub
    • Restavracija
    • Hitra hrana
    • Guest House
    • Beverage Distributor
    • Hotel
    Nepremičnine
    • Real Estate Agency
    • Arhitekturno podjetje
    • Gradbeništvo
    • Estate Management
    • Vrtnarjenje
    • Združenje lastnikov nepremičnin
    Svetovanje
    • Računovodsko podjetje
    • Odoo Partner
    • Marketinška agencija
    • Law firm
    • Pridobivanje talentov
    • Audit & Certification
    Proizvodnja
    • Tekstil
    • Metal
    • Pohištvo
    • Hrana
    • Brewery
    • Poslovna darila
    Health & Fitness
    • Športni klub
    • Trgovina z očali
    • Fitnes center
    • Wellness Practitioners
    • Lekarna
    • Frizerski salon
    Trades
    • Handyman
    • IT Hardware & Support
    • Sistemi sončne energije
    • Izdelovalec čevljev
    • Čistilne storitve
    • HVAC Services
    Ostali
    • Neprofitna organizacija
    • Agencija za okolje
    • Najem oglasnih panojev
    • Fotografija
    • Najem koles
    • Prodajalec programske opreme
    Browse all Industries
  • Skupnost
    Learn
    • Tutorials
    • Dokumentacija
    • Certifikati
    • Šolanje
    • Blog
    • Podcast
    Empower Education
    • Education Program
    • Scale Up! Business Game
    • Visit Odoo
    Get the Software
    • Prenesi
    • Compare Editions
    • Releases
    Collaborate
    • Github
    • Forum
    • Dogodki
    • Prevodi
    • Become a Partner
    • Services for Partners
    • Register your Accounting Firm
    Get Services
    • Find a Partner
    • Find an Accountant
    • Meet an advisor
    • Implementation Services
    • Sklici kupca
    • Podpora
    • Upgrades
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +1 (650) 691-3277
    Get a demo
  • Določanje cen
  • Pomoč

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

  • CRM
  • e-Commerce
  • Knjigovodstvo
  • Zaloga
  • PoS
  • Projekt
  • MRP
All apps
You need to be registered to interact with the community.
All Posts People Badges
Ključne besede (View all)
odoo accounting v14 pos v15
About this forum
You need to be registered to interact with the community.
All Posts People Badges
Ključne besede (View all)
odoo accounting v14 pos v15
About this forum
Pomoč

XML-RPC Fetching Records by External ID

Naroči se

Get notified when there's activity on this post

This question has been flagged
xmlrpcexternalid
8 Odgovori
22645 Prikazi
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
Opusti
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
Avtor

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
Avtor

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
Avtor

@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
Opusti
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
Opusti
Jason Judge
Avtor

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
Avtor

`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
Opusti
Enjoying the discussion? Don't just read, join in!

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

Prijavi
Related Posts Odgovori Prikazi Aktivnost
xmlrpc Error when attempting to connect to my local instance Solved
xmlrpc
Avatar
Avatar
Avatar
3
jul. 25
4178
Cannot marshal None unless allow_none is enabled
xmlrpc
Avatar
1
okt. 24
3036
[SOLVED] Odoo-16 ValueError: External ID not found in the system
externalid
Avatar
Avatar
Avatar
Avatar
3
jul. 24
11259
How to run a method from external api as the superuser
xmlrpc
Avatar
Avatar
1
apr. 24
3102
<methodName>execute</methodName>
xmlrpc
Avatar
0
sep. 23
2418
Community
  • Tutorials
  • Dokumentacija
  • Forum
Open Source
  • Prenesi
  • Github
  • Runbot
  • Prevodi
Services
  • Odoo.sh Hosting
  • Podpora
  • Nadgradnja
  • Custom Developments
  • Izobraževanje
  • Find an Accountant
  • Find a Partner
  • Become a Partner
About us
  • Our company
  • Sredstva blagovne znamke
  • Kontakt
  • Zaposlitve
  • Dogodki
  • Podcast
  • Blog
  • Stranke
  • Pravno • Zasebnost
  • Varnost
الْعَرَبيّة 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 is a suite of open source business apps that cover all your company needs: CRM, eCommerce, accounting, inventory, point of sale, project management, etc.

Odoo's unique value proposition is to be at the same time very easy to use and fully integrated.

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