Python 2.7 and >=3.5
Parsers OpenObjectes queries like:
import pyscopg2
from oopgrade.oopgrade import get_foreign_keys
from ooquery import OOQuery
conn = psycopg2.connect("dbname=test user=postgres")
with conn.cursor() as cursor:
def fk_function(table, field):
fks = get_foreign_keys(cursor, table)
return fks[field]
q = OOQuery('account_invoice', fk_function)
sql = q.select(['number', 'state']).where([
('state', '=', 'open'),
('partner_id.name', '=', 'Pepito')
])
cursor.execute(*sql)Support for reading from joined tables
q = OOQuery('account_invoice', fk_function)
sql = q.select(['number', 'partner_id.name', 'partner_id.vat']).where([
('state', '=', 'open')
])Convert OpenERP/Odoo domains to JSON format:
from ooquery import convert_from_domain
import json
# Simple domain
domain = [('name', '=', 'John'), ('age', '>', 18)]
result = convert_from_domain(domain)
print(json.dumps(result, indent=2))
# {
# "combinator": "and",
# "rules": [
# {"field": "name", "operator": "=", "value": "John"},
# {"field": "age", "operator": ">", "value": 18}
# ]
# }
# OR conditions
domain = ['|', ('state', '=', 'open'), ('state', '=', 'draft')]
result = convert_from_domain(domain)
# {
# "combinator": "or",
# "rules": [
# {"field": "state", "operator": "=", "value": "open"},
# {"field": "state", "operator": "=", "value": "draft"}
# ]
# }Convert JSON format back to OpenERP/Odoo domains:
from ooquery import convert_to_domain
# Simple AND query
query = {
'combinator': 'and',
'rules': [
{'field': 'name', 'operator': '=', 'value': 'John'},
{'field': 'age', 'operator': '>', 'value': 18}
]
}
domain = convert_to_domain(query)
# [('name', '=', 'John'), ('age', '>', 18)]
# OR query with binary expression
query = {
'combinator': 'or',
'rules': [
{'field': 'state', 'operator': '=', 'value': 'open'},
{'field': 'state', 'operator': '=', 'value': 'draft'}
]
}
domain = convert_to_domain(query)
# ['|', ('state', '=', 'open'), ('state', '=', 'draft')]
# Round-trip conversion
original_domain = ['|', ('name', 'ilike', 'john%'), ('email', 'ilike', 'john%')]
json_query = convert_from_domain(original_domain)
back_to_domain = convert_to_domain(json_query)
# back_to_domain == original_domain