PyOdoo 0.7.2__tar.gz → 0.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. {pyodoo-0.7.2 → pyodoo-0.8.0}/PKG-INFO +9 -3
  2. {pyodoo-0.7.2 → pyodoo-0.8.0}/PyOdoo.egg-info/PKG-INFO +9 -3
  3. {pyodoo-0.7.2 → pyodoo-0.8.0}/PyOdoo.egg-info/SOURCES.txt +5 -4
  4. {pyodoo-0.7.2 → pyodoo-0.8.0}/README.md +7 -2
  5. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/__init__.py +6 -1
  6. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/active_status_choice.py +1 -1
  7. {pyodoo-0.7.2/pyodoo/v12 → pyodoo-0.8.0/pyodoo}/api.py +76 -17
  8. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/boolean_operator.py +1 -1
  9. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/compare_type.py +1 -1
  10. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/constants.py +3 -3
  11. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/filter.py +2 -2
  12. pyodoo-0.8.0/pyodoo/implementation.py +26 -0
  13. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/message_subtype.py +1 -1
  14. {pyodoo-0.7.2/pyodoo/v12 → pyodoo-0.8.0/pyodoo}/model.py +40 -36
  15. {pyodoo-0.7.2/pyodoo/v12 → pyodoo-0.8.0/pyodoo}/python_code.py +20 -13
  16. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/samples/awaitable.py +1 -1
  17. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/samples/contacts.py +7 -7
  18. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/samples/contacts_async.py +8 -7
  19. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/samples/python_code.py +11 -8
  20. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/samples/sql_excel_query.py +11 -8
  21. {pyodoo-0.7.2/pyodoo/v12 → pyodoo-0.8.0/pyodoo}/sql_excel_query.py +40 -18
  22. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/v12/__init__.py +9 -5
  23. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyproject.toml +1 -0
  24. {pyodoo-0.7.2 → pyodoo-0.8.0}/tests/test_compare_types.py +120 -101
  25. {pyodoo-0.7.2 → pyodoo-0.8.0}/tests/test_contacts.py +34 -15
  26. {pyodoo-0.7.2 → pyodoo-0.8.0}/tests/test_python_code.py +59 -27
  27. {pyodoo-0.7.2 → pyodoo-0.8.0}/tests/test_sql_excel_query.py +92 -38
  28. {pyodoo-0.7.2 → pyodoo-0.8.0}/LICENSE +0 -0
  29. {pyodoo-0.7.2 → pyodoo-0.8.0}/PyOdoo.egg-info/dependency_links.txt +0 -0
  30. {pyodoo-0.7.2 → pyodoo-0.8.0}/PyOdoo.egg-info/requires.txt +0 -0
  31. {pyodoo-0.7.2 → pyodoo-0.8.0}/PyOdoo.egg-info/top_level.txt +0 -0
  32. {pyodoo-0.7.2 → pyodoo-0.8.0}/pyodoo/samples/__init__.py +0 -0
  33. {pyodoo-0.7.2 → pyodoo-0.8.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyOdoo
3
- Version: 0.7.2
3
+ Version: 0.8.0
4
4
  Summary: API for Odoo
5
5
  Author-email: Fabio Castelli <muflone@muflone.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
19
20
  Description-Content-Type: text/markdown
20
21
  License-File: LICENSE
21
22
  Requires-Dist: xlrd~=2.0
@@ -31,12 +32,13 @@ Dynamic: license-file
31
32
  [![Python 3.11](https://github.com/muflone/pyodoo/actions/workflows/python-3.11.yml/badge.svg)](https://github.com/muflone/pyodoo/actions/workflows/python-3.11.yml)
32
33
  [![Python 3.12](https://github.com/muflone/pyodoo/actions/workflows/python-3.12.yml/badge.svg)](https://github.com/muflone/pyodoo/actions/workflows/python-3.12.yml)
33
34
  [![Python 3.13](https://github.com/muflone/pyodoo/actions/workflows/python-3.13.yml/badge.svg)](https://github.com/muflone/pyodoo/actions/workflows/python-3.13.yml)
35
+ [![Python 3.14](https://github.com/muflone/pyodoo/actions/workflows/python-3.14.yml/badge.svg)](https://github.com/muflone/pyodoo/actions/workflows/python-3.14.yml)
34
36
  [![PyPI - Version](https://img.shields.io/pypi/v/PyOdoo.svg)](https://pypi.org/project/PyOdoo/)
35
37
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/PyOdoo.svg)](https://pypi.org/project/PyOdoo/)
36
38
 
37
39
  **Description:** API for Odoo
38
40
 
39
- **Copyright:** 2021-2025 Fabio Castelli (Muflone) <muflone@muflone.com>
41
+ **Copyright:** 2021-2026 Fabio Castelli (Muflone) <muflone@muflone.com>
40
42
 
41
43
  **License:** GPL-3+
42
44
 
@@ -48,7 +50,11 @@ Dynamic: license-file
48
50
 
49
51
  PyOdoo is an attempt to build a common API to interact with any
50
52
  [**Odoo**](https://www.odoo.com/) server in order to operate using
51
- its XML RPC API.
53
+ its APIs.
54
+
55
+ Currently the following implementations are provided:
56
+ - XML-RPC
57
+ - JSON-RPC
52
58
 
53
59
  # System Requirements
54
60
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyOdoo
3
- Version: 0.7.2
3
+ Version: 0.8.0
4
4
  Summary: API for Odoo
5
5
  Author-email: Fabio Castelli <muflone@muflone.com>
6
6
  License-Expression: GPL-3.0-or-later
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
19
20
  Description-Content-Type: text/markdown
20
21
  License-File: LICENSE
21
22
  Requires-Dist: xlrd~=2.0
@@ -31,12 +32,13 @@ Dynamic: license-file
31
32
  [![Python 3.11](https://github.com/muflone/pyodoo/actions/workflows/python-3.11.yml/badge.svg)](https://github.com/muflone/pyodoo/actions/workflows/python-3.11.yml)
32
33
  [![Python 3.12](https://github.com/muflone/pyodoo/actions/workflows/python-3.12.yml/badge.svg)](https://github.com/muflone/pyodoo/actions/workflows/python-3.12.yml)
33
34
  [![Python 3.13](https://github.com/muflone/pyodoo/actions/workflows/python-3.13.yml/badge.svg)](https://github.com/muflone/pyodoo/actions/workflows/python-3.13.yml)
35
+ [![Python 3.14](https://github.com/muflone/pyodoo/actions/workflows/python-3.14.yml/badge.svg)](https://github.com/muflone/pyodoo/actions/workflows/python-3.14.yml)
34
36
  [![PyPI - Version](https://img.shields.io/pypi/v/PyOdoo.svg)](https://pypi.org/project/PyOdoo/)
35
37
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/PyOdoo.svg)](https://pypi.org/project/PyOdoo/)
36
38
 
37
39
  **Description:** API for Odoo
38
40
 
39
- **Copyright:** 2021-2025 Fabio Castelli (Muflone) <muflone@muflone.com>
41
+ **Copyright:** 2021-2026 Fabio Castelli (Muflone) <muflone@muflone.com>
40
42
 
41
43
  **License:** GPL-3+
42
44
 
@@ -48,7 +50,11 @@ Dynamic: license-file
48
50
 
49
51
  PyOdoo is an attempt to build a common API to interact with any
50
52
  [**Odoo**](https://www.odoo.com/) server in order to operate using
51
- its XML RPC API.
53
+ its APIs.
54
+
55
+ Currently the following implementations are provided:
56
+ - XML-RPC
57
+ - JSON-RPC
52
58
 
53
59
  # System Requirements
54
60
 
@@ -8,11 +8,16 @@ PyOdoo.egg-info/requires.txt
8
8
  PyOdoo.egg-info/top_level.txt
9
9
  pyodoo/__init__.py
10
10
  pyodoo/active_status_choice.py
11
+ pyodoo/api.py
11
12
  pyodoo/boolean_operator.py
12
13
  pyodoo/compare_type.py
13
14
  pyodoo/constants.py
14
15
  pyodoo/filter.py
16
+ pyodoo/implementation.py
15
17
  pyodoo/message_subtype.py
18
+ pyodoo/model.py
19
+ pyodoo/python_code.py
20
+ pyodoo/sql_excel_query.py
16
21
  pyodoo/samples/__init__.py
17
22
  pyodoo/samples/awaitable.py
18
23
  pyodoo/samples/contacts.py
@@ -20,10 +25,6 @@ pyodoo/samples/contacts_async.py
20
25
  pyodoo/samples/python_code.py
21
26
  pyodoo/samples/sql_excel_query.py
22
27
  pyodoo/v12/__init__.py
23
- pyodoo/v12/api.py
24
- pyodoo/v12/model.py
25
- pyodoo/v12/python_code.py
26
- pyodoo/v12/sql_excel_query.py
27
28
  tests/test_compare_types.py
28
29
  tests/test_contacts.py
29
30
  tests/test_python_code.py
@@ -7,12 +7,13 @@
7
7
  [![Python 3.11](https://github.com/muflone/pyodoo/actions/workflows/python-3.11.yml/badge.svg)](https://github.com/muflone/pyodoo/actions/workflows/python-3.11.yml)
8
8
  [![Python 3.12](https://github.com/muflone/pyodoo/actions/workflows/python-3.12.yml/badge.svg)](https://github.com/muflone/pyodoo/actions/workflows/python-3.12.yml)
9
9
  [![Python 3.13](https://github.com/muflone/pyodoo/actions/workflows/python-3.13.yml/badge.svg)](https://github.com/muflone/pyodoo/actions/workflows/python-3.13.yml)
10
+ [![Python 3.14](https://github.com/muflone/pyodoo/actions/workflows/python-3.14.yml/badge.svg)](https://github.com/muflone/pyodoo/actions/workflows/python-3.14.yml)
10
11
  [![PyPI - Version](https://img.shields.io/pypi/v/PyOdoo.svg)](https://pypi.org/project/PyOdoo/)
11
12
  [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/PyOdoo.svg)](https://pypi.org/project/PyOdoo/)
12
13
 
13
14
  **Description:** API for Odoo
14
15
 
15
- **Copyright:** 2021-2025 Fabio Castelli (Muflone) <muflone@muflone.com>
16
+ **Copyright:** 2021-2026 Fabio Castelli (Muflone) <muflone@muflone.com>
16
17
 
17
18
  **License:** GPL-3+
18
19
 
@@ -24,7 +25,11 @@
24
25
 
25
26
  PyOdoo is an attempt to build a common API to interact with any
26
27
  [**Odoo**](https://www.odoo.com/) server in order to operate using
27
- its XML RPC API.
28
+ its APIs.
29
+
30
+ Currently the following implementations are provided:
31
+ - XML-RPC
32
+ - JSON-RPC
28
33
 
29
34
  # System Requirements
30
35
 
@@ -2,7 +2,7 @@
2
2
  # Project: PyOdoo
3
3
  # Description: API for Odoo
4
4
  # Author: Fabio Castelli (Muflone) <muflone@muflone.com>
5
- # Copyright: 2021-2025 Fabio Castelli
5
+ # Copyright: 2021-2026 Fabio Castelli
6
6
  # License: GPL-3+
7
7
  # This program is free software: you can redistribute it and/or modify
8
8
  # it under the terms of the GNU General Public License as published by
@@ -19,8 +19,13 @@
19
19
  ##
20
20
 
21
21
  from .active_status_choice import ActiveStatusChoice # noqa: F401
22
+ from .api import Api # noqa: F401
22
23
  from .boolean_operator import BooleanOperator # noqa: F401
23
24
  from .compare_type import CompareType # noqa: F401
24
25
  from .constants import APP_VERSION as __version__ # noqa: F401
25
26
  from .filter import Filter # noqa: F401
27
+ from .implementation import Implementation # noqa: F401
26
28
  from .message_subtype import MessageSubType # noqa: F401
29
+ from .model import Model # noqa: F401
30
+ from .python_code import PythonCode # noqa: F401
31
+ from .sql_excel_query import SqlExcelQuery # noqa: F401
@@ -2,7 +2,7 @@
2
2
  # Project: PyOdoo
3
3
  # Description: API for Odoo
4
4
  # Author: Fabio Castelli (Muflone) <muflone@muflone.com>
5
- # Copyright: 2021-2025 Fabio Castelli
5
+ # Copyright: 2021-2026 Fabio Castelli
6
6
  # License: GPL-3+
7
7
  # This program is free software: you can redistribute it and/or modify
8
8
  # it under the terms of the GNU General Public License as published by
@@ -2,7 +2,7 @@
2
2
  # Project: PyOdoo
3
3
  # Description: API for Odoo
4
4
  # Author: Fabio Castelli (Muflone) <muflone@muflone.com>
5
- # Copyright: 2021-2025 Fabio Castelli
5
+ # Copyright: 2021-2026 Fabio Castelli
6
6
  # License: GPL-3+
7
7
  # This program is free software: you can redistribute it and/or modify
8
8
  # it under the terms of the GNU General Public License as published by
@@ -21,12 +21,17 @@
21
21
  from typing import Any, Optional, Union
22
22
  from xmlrpc.client import ServerProxy
23
23
 
24
- from pyodoo import BooleanOperator, Filter
24
+ import requests
25
+ import requests.auth
26
+
27
+ from .boolean_operator import BooleanOperator
28
+ from .filter import Filter
29
+ from .implementation import Implementation
25
30
 
26
31
 
27
32
  class Api(object):
28
33
  """
29
- Odoo v12 XML-RPC API
34
+ Odoo base API
30
35
  """
31
36
  def __init__(self,
32
37
  model_name: str,
@@ -34,7 +39,8 @@ class Api(object):
34
39
  database: str,
35
40
  username: str,
36
41
  password: str,
37
- language: str = None
42
+ language: str = None,
43
+ implementation: Implementation = Implementation.XMLRPC
38
44
  ) -> None:
39
45
  # Associate model
40
46
  if not model_name:
@@ -46,9 +52,13 @@ class Api(object):
46
52
  self.password = password
47
53
  self.language = language
48
54
  self.uid = None
55
+ self.implementation = implementation
49
56
  # Remove trailing / from endpoint
50
57
  if self.endpoint.endswith('/'):
51
58
  self.endpoint = self.endpoint[:-1]
59
+ # Specific implementations
60
+ if implementation == Implementation.JSONRPC:
61
+ self.session = requests.Session()
52
62
 
53
63
  def authenticate(self
54
64
  ) -> int:
@@ -57,11 +67,33 @@ class Api(object):
57
67
 
58
68
  :return: The user ID for the authenticated user
59
69
  """
60
- proxy = self.get_proxy(method='xmlrpc/2/common')
61
- self.uid = proxy.authenticate(self.database,
62
- self.username,
63
- self.password,
64
- {})
70
+ if self.implementation == Implementation.XMLRPC:
71
+ # Authentication for XML-RPC
72
+ proxy = self.get_proxy(method='xmlrpc/2/common')
73
+ self.uid = proxy.authenticate(self.database,
74
+ self.username,
75
+ self.password,
76
+ {})
77
+ elif self.implementation == Implementation.JSONRPC:
78
+ # Authentication for JSON-RPC
79
+ self.session.auth = requests.auth.HTTPBasicAuth(
80
+ username=self.username,
81
+ password=self.password)
82
+ response = self.session.post(
83
+ url=self.build_endpoint('web/session/authenticate'),
84
+ json={
85
+ 'jsonrpc': '2.0',
86
+ 'params': {
87
+ 'db': self.database,
88
+ 'login': self.username,
89
+ 'password': self.password
90
+ }
91
+ })
92
+ result = response.json() if response else None
93
+ self.uid = result['result']['uid'] if result else None
94
+ else:
95
+ # Invalid implementation
96
+ raise ValueError(f'Invalid implementation {self.implementation}')
65
97
  return self.uid
66
98
 
67
99
  def build_endpoint(self,
@@ -122,14 +154,41 @@ class Api(object):
122
154
  :param kwargs: arguments dict passed by keyword
123
155
  :return:
124
156
  """
125
- proxy = self.get_proxy_object()
126
- results = proxy.execute_kw(self.database,
127
- self.uid,
128
- self.password,
129
- self.model_name,
130
- method_name,
131
- args,
132
- kwargs)
157
+ if self.implementation == Implementation.XMLRPC:
158
+ # Execute for XML-RPC
159
+ proxy = self.get_proxy_object()
160
+ results = proxy.execute_kw(self.database,
161
+ self.uid,
162
+ self.password,
163
+ self.model_name,
164
+ method_name,
165
+ args,
166
+ kwargs)
167
+ elif self.implementation == Implementation.JSONRPC:
168
+ # Execute for JSON-RPC
169
+ results = self.session.post(
170
+ url=self.build_endpoint(method='jsonrpc'),
171
+ json={
172
+ 'jsonrpc': '2.0',
173
+ 'method': 'call',
174
+ 'params': {
175
+ 'service': 'object',
176
+ 'method': 'execute_kw',
177
+ 'args': [
178
+ self.database,
179
+ self.uid,
180
+ self.password,
181
+ self.model_name,
182
+ method_name,
183
+ args,
184
+ kwargs
185
+ ],
186
+ }
187
+ }
188
+ ).json().get('result')
189
+ else:
190
+ # Invalid implementation
191
+ raise ValueError(f'Invalid implementation {self.implementation}')
133
192
  return results
134
193
 
135
194
  def do_read(self,
@@ -2,7 +2,7 @@
2
2
  # Project: PyOdoo
3
3
  # Description: API for Odoo
4
4
  # Author: Fabio Castelli (Muflone) <muflone@muflone.com>
5
- # Copyright: 2021-2025 Fabio Castelli
5
+ # Copyright: 2021-2026 Fabio Castelli
6
6
  # License: GPL-3+
7
7
  # This program is free software: you can redistribute it and/or modify
8
8
  # it under the terms of the GNU General Public License as published by
@@ -2,7 +2,7 @@
2
2
  # Project: PyOdoo
3
3
  # Description: API for Odoo
4
4
  # Author: Fabio Castelli (Muflone) <muflone@muflone.com>
5
- # Copyright: 2021-2025 Fabio Castelli
5
+ # Copyright: 2021-2026 Fabio Castelli
6
6
  # License: GPL-3+
7
7
  # This program is free software: you can redistribute it and/or modify
8
8
  # it under the terms of the GNU General Public License as published by
@@ -2,7 +2,7 @@
2
2
  # Project: PyOdoo
3
3
  # Description: API for Odoo
4
4
  # Author: Fabio Castelli (Muflone) <muflone@muflone.com>
5
- # Copyright: 2021-2025 Fabio Castelli
5
+ # Copyright: 2021-2026 Fabio Castelli
6
6
  # License: GPL-3+
7
7
  # This program is free software: you can redistribute it and/or modify
8
8
  # it under the terms of the GNU General Public License as published by
@@ -19,13 +19,13 @@
19
19
  ##
20
20
 
21
21
  APP_NAME = 'PyOdoo'
22
- APP_VERSION = '0.7.2'
22
+ APP_VERSION = '0.8.0'
23
23
  APP_DESCRIPTION = 'API for Odoo'
24
24
  APP_DOMAIN = 'pyodoo'
25
25
  APP_ID = f'{APP_DOMAIN}.muflone.com'
26
26
  APP_AUTHOR = 'Fabio Castelli'
27
27
  APP_AUTHOR_EMAIL = 'muflone@muflone.com'
28
- APP_COPYRIGHT = f'Copyright 2021-2025 {APP_AUTHOR}'
28
+ APP_COPYRIGHT = f'Copyright 2021-2026 {APP_AUTHOR}'
29
29
  URL_AUTHOR = 'http://www.muflone.com/'
30
30
  URL_APPLICATION = f'{URL_AUTHOR}{APP_DOMAIN}/'
31
31
  URL_SOURCES = f'https://github.com/muflone/{APP_DOMAIN}/'
@@ -2,7 +2,7 @@
2
2
  # Project: PyOdoo
3
3
  # Description: API for Odoo
4
4
  # Author: Fabio Castelli (Muflone) <muflone@muflone.com>
5
- # Copyright: 2021-2025 Fabio Castelli
5
+ # Copyright: 2021-2026 Fabio Castelli
6
6
  # License: GPL-3+
7
7
  # This program is free software: you can redistribute it and/or modify
8
8
  # it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@
20
20
 
21
21
  from typing import Union
22
22
 
23
- from pyodoo import CompareType
23
+ from .compare_type import CompareType
24
24
 
25
25
 
26
26
  class Filter(object):
@@ -0,0 +1,26 @@
1
+ ##
2
+ # Project: PyOdoo
3
+ # Description: API for Odoo
4
+ # Author: Fabio Castelli (Muflone) <muflone@muflone.com>
5
+ # Copyright: 2021-2026 Fabio Castelli
6
+ # License: GPL-3+
7
+ # This program is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU General Public License as published by
9
+ # the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # This program is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License
18
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
19
+ ##
20
+
21
+ class Implementation(object):
22
+ """
23
+ Implementations used in Odoo API
24
+ """
25
+ XMLRPC = 'xmlrpc'
26
+ JSONRPC = 'jsonrpc'
@@ -2,7 +2,7 @@
2
2
  # Project: PyOdoo
3
3
  # Description: API for Odoo
4
4
  # Author: Fabio Castelli (Muflone) <muflone@muflone.com>
5
- # Copyright: 2021-2025 Fabio Castelli
5
+ # Copyright: 2021-2026 Fabio Castelli
6
6
  # License: GPL-3+
7
7
  # This program is free software: you can redistribute it and/or modify
8
8
  # it under the terms of the GNU General Public License as published by