Skip to content

Commit

Permalink
[Enhancement] Update fields and methods
Browse files Browse the repository at this point in the history
  • Loading branch information
fasilwdr committed May 9, 2024
1 parent b7b9ab0 commit 4c9e31c
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 22 deletions.
21 changes: 10 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,32 +53,31 @@ partner.name = 'New Partner Name'
- Execute a Method on a Record
```python
partner.action_archive()
partner.update(values={'mobile': '12345678'})
partner.update({'mobile': '12345678'})
```
- Search for Records
```python
search_check = odoo.env['res.partner'].search(domain=[('name', '=', 'Abigail Peterson')])
print("search_check", search_check)
partner_ids = odoo.env['res.partner'].search(domain=[('name', '=', 'Abigail Peterson')])
print(partner_ids)
```
- Read Records
```python
read_check = odoo.env['res.partner'].read(ids=search_check, fields=['name', 'email'])
print("read_check", read_check)
print(partner.name)
records = odoo.env['res.partner'].read(ids=search_check, fields=['name', 'email'])
print(records)
```
- Create a New Record
```python
create_check = odoo.env['res.partner'].create({'name': 'New Partner', 'email': 'new@partner.com', 'is_company': True})
print("create_check", create_check)
new_partner_id = odoo.env['res.partner'].create({'name': 'New Partner', 'email': 'new@partner.com', 'is_company': True})
print(new_partner_id)
```
- Update Records
```python
write_check = odoo.env['res.partner'].write(ids=[create_check], values={'phone': '1234567890'})
print("write_check", write_check)
odoo.env['res.partner'].write(ids=new_partner_id, values={'phone': '1234567890'})
```
- Delete Records
```python
unlink_check = odoo.env['res.partner'].unlink(ids=[create_check])
print("unlink_check", unlink_check)
odoo.env['res.partner'].unlink(ids=new_partner_id)
```
- Download a QWeb Report
```python
Expand Down
10 changes: 10 additions & 0 deletions pyodoo_connect/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
# -*- coding: utf-8 -*-
#############################################################################
# Author: Fasil
# Email: fasilwdr@hotmail.com
# WhatsApp: https://wa.me/966538952934
# Facebook: https://www.facebook.com/fasilwdr
# Instagram: https://www.instagram.com/fasilwdr
#############################################################################


from .odoo import Odoo
from .proxies import RecordProxy, ModelProxy
from .tools import Command
9 changes: 9 additions & 0 deletions pyodoo_connect/odoo.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
# -*- coding: utf-8 -*-
#############################################################################
# Author: Fasil
# Email: fasilwdr@hotmail.com
# WhatsApp: https://wa.me/966538952934
# Facebook: https://www.facebook.com/fasilwdr
# Instagram: https://www.instagram.com/fasilwdr
#############################################################################

import json
import random
import logging
Expand Down
56 changes: 45 additions & 11 deletions pyodoo_connect/proxies.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@

# -*- coding: utf-8 -*-
#############################################################################
# Author: Fasil
# Email: fasilwdr@hotmail.com
# WhatsApp: https://wa.me/966538952934
# Facebook: https://www.facebook.com/fasilwdr
# Instagram: https://www.instagram.com/fasilwdr
#############################################################################

class MethodCaller:
def __init__(self, model_proxy, record_id, method_name):
Expand All @@ -7,6 +14,13 @@ def __init__(self, model_proxy, record_id, method_name):
self.method_name = method_name

def __call__(self, *args, **kwargs):
# If there are positional arguments, assume the first is a dictionary and reformat as needed
if args and isinstance(args[0], dict):
kwargs = {'values': args[0]} # Override kwargs with values from args
elif args:
# If args are not a dictionary, raise an error or handle appropriately
raise ValueError(
"Positional arguments must be a single dictionary containing the parameters for the method.")
return self.model_proxy.odoo.execute_function(
self.model_proxy.model_name,
[self.record_id],
Expand All @@ -20,26 +34,45 @@ def __init__(self, model_proxy, record_id):
self.model_proxy = model_proxy
self.record_id = record_id
self.values = {}
self._fetch()

def _fetch(self):
fields = self.model_proxy.fields_get([], ['name']) # Fetch all fields with their names
self.values = self.model_proxy.read([self.record_id], list(fields.keys()))[0]
self.loaded_fields = set()

def __getattr__(self, name):
if name in self.values:
return self.values[name]
else:
# Treat any unknown attribute as a method call
return MethodCaller(self.model_proxy, self.record_id, name)
elif name not in self.loaded_fields:
# Attempt to fetch the field first. If not present, treat as method
try:
self.fetch_field(name)
return self.values.get(name, None)
except KeyError:
pass
# If it's not a field, treat it as a method call
return MethodCaller(self.model_proxy, self.record_id, name)

def fetch_field(self, field_name):
# Fetch single field and check if it exists
fields_info = self.model_proxy.fields_get([field_name], ['name', 'type'])
if field_name not in fields_info:
raise KeyError(f"No such field '{field_name}' on model.")
result = self.model_proxy.read([self.record_id], [field_name])
if result:
self.values.update(result[0])
self.loaded_fields.add(field_name)

def __setattr__(self, name, value):
if name in ['model_proxy', 'record_id', 'values'] or name.startswith('_'):
super(RecordProxy, self).__setattr__(name, value)
if name in ['model_proxy', 'record_id', 'values', 'loaded_fields'] or name.startswith('_'):
super().__setattr__(name, value)
else:
self.model_proxy.write(ids=[self.record_id], values={name: value})
self.values[name] = value # Update the local cache after the write operation

def _fetch_all(self):
# Optional: Method to manually fetch all fields if needed
fields = self.model_proxy.fields_get([], ['name'])
self.values = self.model_proxy.read([self.record_id], list(fields.keys()))[0]
self.loaded_fields.update(fields.keys())



class ModelProxy:
def __init__(self, odoo_instance, model_name):
Expand Down Expand Up @@ -68,6 +101,7 @@ def search_read(self, domain: list, fields: list):
return self.odoo.call("object", "execute", self.model_name, 'search_read', domain, fields)

def write(self, ids: list, values: dict):
print(values)
return self.odoo.call("object", "execute", self.model_name, 'write', ids, values)

def unlink(self, ids: list):
Expand Down
9 changes: 9 additions & 0 deletions pyodoo_connect/tools.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
# -*- coding: utf-8 -*-
#############################################################################
# Author: Fasil
# Email: fasilwdr@hotmail.com
# WhatsApp: https://wa.me/966538952934
# Facebook: https://www.facebook.com/fasilwdr
# Instagram: https://www.instagram.com/fasilwdr
#############################################################################


CREATE = 0
UPDATE = 1
Expand Down
8 changes: 8 additions & 0 deletions tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# -*- coding: utf-8 -*-
#############################################################################
# Author: Fasil
# Email: fasilwdr@hotmail.com
# WhatsApp: https://wa.me/966538952934
# Facebook: https://www.facebook.com/fasilwdr
# Instagram: https://www.instagram.com/fasilwdr
#############################################################################
8 changes: 8 additions & 0 deletions tests/test_odoo.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
# -*- coding: utf-8 -*-
#############################################################################
# Author: Fasil
# Email: fasilwdr@hotmail.com
# WhatsApp: https://wa.me/966538952934
# Facebook: https://www.facebook.com/fasilwdr
# Instagram: https://www.instagram.com/fasilwdr
#############################################################################
import json
import pytest
from unittest.mock import patch, MagicMock
Expand Down

0 comments on commit 4c9e31c

Please sign in to comment.