Intechnity-com / OdooJsonRpcClient

Odoo Client Json Rpc
MIT License
67 stars 29 forks source link

ChildOf filter issue #85

Open Cednac opened 10 months ago

Cednac commented 10 months ago

When attempting to use the filter function ChildOf in combination with other filters, I am encountering an error. This error prevents the filter from working as expected. If I am using other filter queries, like EqualsTo, filter is applied without failure and received object is correctly parsed.

My Code

Filter:

var filter = OdooFilter.Create().ChildOf("order_partner_id", "123");

var repository = new OdooRepository<LicenseDataContract>(_portaCapenaConfig);
var products = await repository.Query()
               .Where(filter)
               .FirstOrDefaultAsync();

LicenseDataContract:

[OdooTableName("sale.order.line")]
[JsonConverter(typeof(OdooModelConverter))]
[DataContract]
public class LicenseDataContract : IOdooModel
{
    [DataMember(Name = "id")]
    public long Id { get; set; }

    [DataMember(Name = "order_id")]
    public object[] OrderId { get; set; } 

    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "product_uom_qty")]
    public double ProductUomQty { get; set; }

    [DataMember(Name = "x_studio_product_tags")]
    public string XStudioProductTags { get; set; }
}

I have tried to alter the library ChildOf implementation like this, but receiving the same error: OdooFilter:

 public OdooFilter ChildOf(string fieldName, string values)
 {
     var field = new object[] { fieldName, OdooOperator.ChildOf.Description(), values };
     Add(field);
     return this;
 }

OdooFilterOft:

 public OdooFilter<T> ChildOf(Expression<Func<T, object>> expression, string values)
 {
     ChildOf(OdooExpresionMapper.GetOdooPropertyName(expression), values);
     return this;
 }

Error message:

{Odoo Server Error, too many values to unpack (expected 3)}
Traceback (most recent call last):
  File "/home/odoo/src/odoo/saas-16.3/odoo/http.py", line 1704, in _serve_db
    return service_model.retrying(self._serve_ir_http, self.env)
  File "/home/odoo/src/odoo/saas-16.3/odoo/service/model.py", line 133, in retrying
    result = func()
  File "/home/odoo/src/odoo/saas-16.3/odoo/http.py", line 1731, in _serve_ir_http
    response = self.dispatcher.dispatch(rule.endpoint, args)
  File "/home/odoo/src/odoo/saas-16.3/odoo/http.py", line 1932, in dispatch
    result = self.request.registry['ir.http']._dispatch(endpoint)
  File "/home/odoo/src/odoo/saas-16.3/addons/website/models/ir_http.py", line 236, in _dispatch
    response = super()._dispatch(endpoint)
  File "/home/odoo/src/odoo/saas-16.3/odoo/addons/base/models/ir_http.py", line 190, in _dispatch
    result = endpoint(**request.params)
  File "/home/odoo/src/odoo/saas-16.3/odoo/http.py", line 716, in route_wrapper
    result = endpoint(self, *args, **params_ok)
  File "/home/odoo/src/custom/trial/saas_trial/controllers/main.py", line 309, in jsonrpc
    res = super(OdooRPC, self).jsonrpc(service, method, args)
  File "/home/odoo/src/odoo/saas-16.3/odoo/http.py", line 716, in route_wrapper
    result = endpoint(self, *args, **params_ok)
  File "/home/odoo/src/odoo/saas-16.3/odoo/addons/base/controllers/rpc.py", line 158, in jsonrpc
    return dispatch_rpc(service, method, args)
  File "/home/odoo/src/odoo/saas-16.3/odoo/http.py", line 385, in dispatch_rpc
    return dispatch(method, params)
  File "/home/odoo/src/odoo/saas-16.3/odoo/service/model.py", line 37, in dispatch
    res = execute_kw(db, uid, *params[3:])
  File "/home/odoo/src/odoo/saas-16.3/odoo/service/model.py", line 59, in execute_kw
    return execute(db, uid, obj, method, *args, **kw or {})
  File "/home/odoo/src/odoo/saas-16.3/odoo/service/model.py", line 65, in execute
    res = execute_cr(cr, uid, obj, method, *args, **kw)
  File "/home/odoo/src/odoo/saas-16.3/odoo/service/model.py", line 50, in execute_cr
    result = retrying(partial(odoo.api.call_kw, recs, method, args, kw), env)
  File "/home/odoo/src/odoo/saas-16.3/odoo/service/model.py", line 133, in retrying
    result = func()
  File "/home/odoo/src/odoo/saas-16.3/odoo/api.py", line 462, in call_kw
    result = _call_kw_model(method, model, args, kwargs)
  File "/home/odoo/src/odoo/saas-16.3/odoo/api.py", line 435, in _call_kw_model
    result = method(recs, *args, **kwargs)
  File "/home/odoo/src/odoo/saas-16.3/odoo/models.py", line 5303, in search_read
    records = self.search_fetch(domain or [], fields, offset=offset, limit=limit, order=order)
  File "/home/odoo/src/odoo/saas-16.3/odoo/models.py", line 1593, in search_fetch
    query = self._search(domain, offset=offset, limit=limit, order=order or self._order)
  File "/home/odoo/src/odoo/saas-16.3/addons/analytic/models/analytic_mixin.py", line 68, in _search
    return super()._search(domain, offset, limit, order, access_rights_uid)
  File "/home/odoo/src/odoo/saas-16.3/odoo/models.py", line 4984, in _search
    query = self._where_calc(domain)
  File "/home/odoo/src/odoo/saas-16.3/odoo/models.py", line 4725, in _where_calc
    return expression.expression(domain, self).query
  File "/home/odoo/src/odoo/saas-16.3/odoo/osv/expression.py", line 771, in __init__
    self.expression = domain_combine_anies(domain, model)
  File "/home/odoo/src/odoo/saas-16.3/odoo/osv/expression.py", line 577, in domain_combine_anies
    domain_any = _anyfy_leaves(domain, model)
  File "/home/odoo/src/odoo/saas-16.3/odoo/osv/expression.py", line 351, in _anyfy_leaves
    left, operator, right = item = tuple(item)
ValueError: too many values to unpack (expected 3)
patricoos commented 10 months ago

Have you tried change values type from string to string[] ?

EmaHrobarova commented 10 months ago

When we tried changing the values type to string[], we got an Error message saying:

{"Method not found: 'PortaCapena.OdooJsonRpcClient.Request.OdooFilter PortaCapena.OdooJsonRpcClient.Request.OdooFilter.ChildOf(System.String, System.String[])'."}

OdooFilter:

   public OdooFilter ChildOf(string fieldName, string[] values)
   {
       var field = new object[] { fieldName, OdooOperator.ChildOf.Description(), values };
       Add(field);
       return this;
   }

OdooFilterOft:

   public OdooFilter<T> ChildOf(Expression<Func<T, object>> expression, string[] values)
   {
       ChildOf(OdooExpresionMapper.GetOdooPropertyName(expression), values);
       return this;
   }
patricoos commented 10 months ago

Can you send me the parameters that I can use to reproduce it on demo data?