问题描述
我不明白:
scheduler_demo / data / sheduler_data.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data noupdate="1">
<record id="ir_cron_scheduler_demo_action" model="ir.cron">
<field name="name">Demo scheduler</field>
<field name="model_id" ref="model_scheduler_demo"></field>
<field name="state">code</field>
<field name="code">model.process_demo_scheduler_queue()</field>
<field name="active" eval="True"></field>
<field name="user_id" ref="base.user_root"></field>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
</record>
</data>
</odoo>
scheduler_demo / models / 初始 .py:
from . import scheduler_demo
scheduler_demo / models / sheduler_demo.py:
# -*- coding: utf-8 -*-
from odoo import models,fields,api
class SchedulerDemo(models.Model):
_name = 'scheduler.demo'
name = fields.Char(required=True)
number_of_updates = fields.Integer('Number of updates')
@api.model
def _process_demo_scheduler_queue(self):
# Contains all records for the model scheduler.demo
scheduler_demo_records = self.env['scheduler.demo'].search([])
# Loop over the records one by one
for demo_record in scheduler_demo_records:
number_of_updates = demo_record.number_of_updates + 1
# Update the record with the new number of updates
demo_record.write({
'number_of_updates': number_of_updates
})
scheduler_demo / security / ir.model.access.csv:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_scheduler_demo,access_scheduler_demo,model_scheduler_demo,base.group_user,1,1
scheduler_demo / views / menu.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<menuitem id="scheduler_demo_menu_root"
name="Scheduler tutorial"
sequence="98"></menuitem>
<menuitem id="menu_scheduler_demo"
name="Scheduler records"
parent="scheduler_demo_menu_root"
action="action_scheduler_demo_records"
sequence="1"></menuitem>
<record id="action_scheduler_demo_records" model="ir.actions.act_window">
<field name="name">Scheduler records</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">scheduler.demo</field>
<field name="search_view_id" ref="scheduler_demo_search_view"></field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create a new scheduler record by clicking on 'Create'.
</p>
</field>
</record>
</odoo>
scheduler_demo / scheduler_demo.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="scheduler_demo_tree_view" model="ir.ui.view">
<field name="name">scheduler.demo.tree</field>
<field name="model">scheduler.demo</field>
<field name="arch" type="xml">
<tree string="Scheduler records">
<field name="name"></field>
<field name="number_of_updates"></field>
</tree>
</field>
</record>
<record id="scheduler_demo_form_view" model="ir.ui.view">
<field name="name">scheduler.demo.form</field>
<field name="model">scheduler.demo</field>
<field name="arch" type="xml">
<form string="Scheduler record">
<sheet>
<group name="main_info">
<field name="name"></field>
<field name="number_of_updates"></field>
<field name="write_date"></field>
</group>
</sheet>
</form>
</field>
</record>
<record id="scheduler_demo_search_view" model="ir.ui.view">
<field name="name">scheduler.demo.search</field>
<field name="model">scheduler.demo</field>
<field name="arch" type="xml">
<search string="Scheduler records">
<field name="name"></field>
<field name="number_of_updates"></field>
</search>
</field>
</record>
</odoo>
scheduler_demo / __ init__py:
from . import models
scheduler_demo / 清单 .py:
{
'name': "scheduler_demo",'depends': ['base','web'],'data': [
'security/ir.model.access.csv','data/scheduler_data.xml','views/scheduler_demo.xml','views/menu.xml',],'installable': True,'application': False,'auto_install': False,}
错误:
odoo server error
psycopg2.IntegrityError: ERREUR: une valeur NULL viole la contrainte NOT NULL de la colonne « activity_user_type »
DETAIL: La ligne en échec contient (586,Demo scheduler,ir.actions.server,null,action,list,form,2020-09-25 13:32:44.223276,ir_cron,code,5,394,model.process_demo_scheduler_queue(),null)
During handling of the above exception,another exception occurred:
Traceback (most recent call last):
File "/opt/odoo/odoo/http.py",line 624,in _handle_exception
return super(JsonRequest,self)._handle_exception(exception)
File "/opt/odoo/odoo/http.py",line 310,in _handle_exception
raise pycompat.reraise(type(exception),exception,sys.exc_info()[2])
File "/opt/odoo/odoo/tools/pycompat.py",line 14,in reraise
raise value
File "/opt/odoo/odoo/http.py",line 669,in dispatch
result = self._call_function(**self.params)
File "/opt/odoo/odoo/http.py",line 350,in _call_function
return checked_call(self.db,*args,**kwargs)
File "/opt/odoo/odoo/service/model.py",line 94,in wrapper
return f(dbname,**kwargs)
File "/opt/odoo/odoo/http.py",line 339,in checked_call
result = self.endpoint(*a,**kw)
File "/opt/odoo/odoo/http.py",line 915,in __call__
return self.method(*args,line 515,in response_wrap
response = f(*args,**kw)
File "/opt/odoo/addons/web/controllers/main.py",line 1326,in call_button
action = self._call_kw(model,method,args,kwargs)
File "/opt/odoo/addons/web/controllers/main.py",line 1314,in _call_kw
return call_kw(request.env[model],kwargs)
File "/opt/odoo/odoo/api.py",line 387,in call_kw
result = _call_kw_multi(method,model,line 374,in _call_kw_multi
result = method(recs,**kwargs)
File "<decorator-gen-65>",line 2,in button_immediate_upgrade
File "/opt/odoo/odoo/addons/base/models/ir_module.py",line 72,in check_and_log
return method(self,**kwargs)
File "/opt/odoo/odoo/addons/base/models/ir_module.py",line 634,in button_immediate_upgrade
return self._button_immediate_function(type(self).button_upgrade)
File "/opt/odoo/odoo/addons/base/models/ir_module.py",line 573,in _button_immediate_function
modules.registry.Registry.new(self._cr.dbname,update_module=True)
File "/opt/odoo/odoo/modules/registry.py",line 86,in new
odoo.modules.load_modules(registry._db,force_demo,status,update_module)
File "/opt/odoo/odoo/modules/loading.py",line 419,in load_modules
force,report,loaded_modules,update_module,models_to_check)
File "/opt/odoo/odoo/modules/loading.py",line 315,in load_marked_modules
perform_checks=perform_checks,models_to_check=models_to_check
File "/opt/odoo/odoo/modules/loading.py",line 225,in load_module_graph
load_data(cr,idref,mode,kind='data',package=package,report=report)
File "/opt/odoo/odoo/modules/loading.py",line 68,in load_data
tools.convert_file(cr,package.name,filename,noupdate,kind,report)
File "/opt/odoo/odoo/tools/convert.py",line 736,in convert_file
convert_xml_import(cr,module,fp,line 803,in convert_xml_import
obj.parse(doc.getroot())
File "/opt/odoo/odoo/tools/convert.py",line 721,in parse
exc_info[2]
File "/opt/odoo/odoo/tools/pycompat.py",line 13,in reraise
raise value.with_traceback(tb)
File "/opt/odoo/odoo/tools/convert.py",line 712,in parse
self._tag_root(de)
File "/opt/odoo/odoo/tools/convert.py",line 674,in _tag_root
f(rec)
File "/opt/odoo/odoo/tools/convert.py",line 577,in _tag_record
record = model._load_records([data],self.mode == 'update')
File "/opt/odoo/odoo/models.py",line 4084,in _load_records
records = self._load_records_create([data['values'] for data in to_create])
File "/opt/odoo/odoo/models.py",line 3998,in _load_records_create
return self.create(values)
File "<decorator-gen-40>",in create
File "/opt/odoo/odoo/api.py",line 317,in _model_create_single
return self.browse().concat(*(create(self,vals) for vals in arg))
File "/opt/odoo/odoo/api.py",in <genexpr>
return self.browse().concat(*(create(self,vals) for vals in arg))
File "/opt/odoo/odoo/addons/base/models/ir_cron.py",line 71,in create
return super(ir_cron,self).create(values)
File "<decorator-gen-3>",line 335,in _model_create_multi
return create(self,[arg])
File "/opt/odoo/odoo/models.py",line 3740,in create
for data in parent_data_list
File "<decorator-gen-34>",line 336,arg)
File "/opt/odoo/odoo/addons/base/models/ir_actions.py",line 59,in create
res = super(IrActions,self).create(vals_list)
File "<decorator-gen-3>",arg)
File "/opt/odoo/odoo/models.py",line 3746,in create
records = self._create(data_list)
File "/opt/odoo/odoo/models.py",line 3832,in _create
cr.execute(query,params)
File "/opt/odoo/odoo/sql_db.py",line 168,in wrapper
return f(self,**kwargs)
File "/opt/odoo/odoo/sql_db.py",line 245,in execute
res = self._obj.execute(query,params)
odoo.tools.convert.ParseError: "ERREUR: une valeur NULL viole la contrainte NOT NULL de la colonne « activity_user_type »
DETAIL: La ligne en échec contient (586,null)
" while parsing /home/brenda/Code/app_odoo/scheduler_demo/data/scheduler_data.xml:2,near
<odoo>
<data noupdate="1">
<record id="ir_cron_scheduler_demo_action" model="ir.cron">
<field name="name">Demo scheduler</field>
<field name="model_id" ref="model_scheduler_demo"/>
<field name="state">code</field>
<field name="code">model.process_demo_scheduler_queue()</field>
<field name="active" eval="True"/>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
</record>
</data>
</odoo>
解决方法
Odoo定义了ir_actions_server_id
字段(在ir.crom
模型中),并将delegate
属性设置为True
(对应于_inherits),这意味着{{1} }字段在ir.actions.server
模型中可用。
ir.cron
字段是在mail模块中定义的(将其添加到模块依赖项)模块中,作为必填字段,默认情况下设置为activity_user_type
,因此,使用默认实现。
您可以通过继承specific
模型并更改必填字段的ir.actions.server
属性(将其设置为default
)来重现类似的错误。
以下代码将引发一个False
odoo.tools.convert.ParseError
这也可能是由于重写class IrActionsServer(models.Model):
_inherit = 'ir.actions.server'
usage = fields.Selection(default=False)
方法并将create
的值设置为另一个字段值,该值最终被评估为activity_user_type
的结果。