通过odoo控制器的公共请求确实会抛出错误:ValueError: Expected singleton: res.users()

问题描述 投票:0回答:1

我正在尝试在 odoo 代码中添加一个控制器,该控制器接受很少的值来创建线索。

我的控制器代码是:

@http.route('/v1/sg/book_a_demo', type='json', auth='none',  methods=['POST', 'OPTIONS'],
            cors='*', csrf=False)
def handle_book_a_demo_request(self):
    lead = request.env["crm.lead"]
    partner = request.env["res.partner"]
    data = json.loads(request.httprequest.data)
    if data:
        name = data.get('name')
        address = data.get('address')
        phone = data.get('phone')
        email = data.get('email')
        business_name = data.get('business_name')
        business_abn = data.get('business_abn')
        captcha_token = data.get('captcha_token')
        individual_vals = {
            'name': name,
            'email': email,
            'phone': phone,
            'address': address,
            'company_type': 'person',
            'total_properties': data.get('total_properties'),
            'comment': data.get('message'),
            'parent_id': company_partner.id,
        }
        individual_id = partner.sudo().create(individual_vals)

        lead_vals = {
            'name': individual_id.name,
            'partner_id': individual_id.id,
            'source_id': request.env.ref('sg_crm.demo_request_source').id,
            'type': 'lead',
            'stage_id': crm_new_stage,
            'total_properties': data.get('total_properties'),
            'description': data.get('message')
        }
        lead_id = lead.sudo().create(lead_vals)
        response = {
            'status': 200,
            'id': lead_id.id,
        }
        result_response = {
            'result': [response]
        }
        return result_response

但是当我通过邮递员点击这个控制器时:

{
    "name": "John Doe",
    "address": "123 Main Street",
    "phone": "1234567890",
    "email": "[email protected]",
    "business_name": "ABC Company",
    "business_abn": "123456789",
    "captcha_token": "your_captcha_token_here",
    "total_properties": "5",
    "message": "This is a demo request message"
}

它确实将以下回溯抛出到我的控制台: 回溯(最近一次调用最后一次): 文件“/opt/odoo/server/odoo/models.py”,第 5158 行,ensure_one _id, = self._ids ^^^^ ValueError:没有足够的值来解压(预期为 1,得到 0)

在处理上述异常的过程中,又发生了一个异常:

Traceback (most recent call last):

  File "/opt/odoo/server/odoo/api.py", line 414, in _model_create_multi
    return create(self, [arg])
           ^^^^^^^^^^^^^^^^^^^
  File "/opt/odoo/server/addons/crm_iap_enrich/models/crm_lead.py", line 43, in create
    leads = super(Lead, self).create(vals_list)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<decorator-gen-237>", line 2, in create
  File "/opt/odoo/server/odoo/api.py", line 415, in _model_create_multi
    return create(self, arg)
           ^^^^^^^^^^^^^^^^^
  File "/opt/odoo/server/addons/crm/models/crm_lead.py", line 713, in create
    leads = super(Lead, self).create(vals_list)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<decorator-gen-139>", line 2, in create
  File "/opt/odoo/server/odoo/api.py", line 415, in _model_create_multi
    return create(self, arg)
           ^^^^^^^^^^^^^^^^^
  File "/opt/odoo/server/addons/mail/models/mail_thread.py", line 284, in create
    thread.sudo().message_post(subtype_id=subtype.id, author_id=self.env.user.partner_id.id)
  File "/opt/odoo/server/addons/rating/models/mail_thread.py", line 15, in message_post
    message = super(MailThread, self).message_post(**kwargs)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/odoo/server/addons/mail/models/mail_thread.py", line 2000, in message_post
    if self.env.user._is_public() and guest:
       ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/odoo/server/odoo/addons/base/models/res_users.py", line 1053, in _is_public
    self.ensure_one()
  File "/opt/odoo/server/odoo/models.py", line 5161, in ensure_one
    raise ValueError("Expected singleton: %s" % self)
ValueError: Expected singleton: res.users()

这很尴尬。我可以确认 individual_id 合作伙伴已成功创建,但在 odoo 中创建主要对象时遇到困难。有人可以帮我吗?预先感谢

python python-3.x odoo odoo-16
1个回答
0
投票

auth
设置为
none
时,请求代码将无法访问当前用户。

来自路由文档部分:

auth (str)

身份验证方法,以下之一:

    

user
:用户必须经过身份验证,当前请求将使用用户的权限执行。

    
public
:用户可能已通过身份验证,也可能未经过身份验证。如果不是,则当前请求将使用共享的公共用户执行。

   
none
:该方法始终处于活动状态,即使没有数据库也是如此。主要由框架和身份验证模块使用。请求代码不会有任何设施来访问当前的用户。

© www.soinside.com 2019 - 2024. All rights reserved.