同时创建多个记录时,Odoo崩溃
我创建了一个方法,在该方法中,我导入一个csv文件,并使用其中包含的数据创建新记录。该方法使用大约1000行的csv。(该方法可以创建大约1000条新记录),但当csv文件超过1200行时,Odoo服务器崩溃,我必须重新启动服务器。这是我的方法和odoo日志同时创建多个记录时,Odoo崩溃,odoo,Odoo,我创建了一个方法,在该方法中,我导入一个csv文件,并使用其中包含的数据创建新记录。该方法使用大约1000行的csv。(该方法可以创建大约1000条新记录),但当csv文件超过1200行时,Odoo服务器崩溃,我必须重新启动服务器。这是我的方法和odoo日志 @api.multi @profile def action_import_csv(self): cuenta = 0 self._chequear_extension_csv(self
@api.multi
@profile
def action_import_csv(self):
cuenta = 0
self._chequear_extension_csv(self.archivo_filename)
res = base64.b64decode(self.archivo)
text = res.decode("UTF-8")
reader = csv.DictReader(io.StringIO(text))
brigadista = self.env['utepda_brigadas.brigadista']
brigada = self.env['utepda_brigadas.brigada']
brigada_cr = self.env.cr
brigadista_brigada = self.env['utepda_brigadas.brigadista_brigada']
count = 0
campos = [
'BRIGADA', 'NOMBRE', 'CEDULA', 'CARGO', 'JORNALES', 'COSTO_JORNADA'
]
rows = list(reader)
totalrows = len(rows)
print("La cantidad de filas es {}".format(totalrows))
for index,row in enumerate(rows):
print("Index -> {} -> {}".format(index,row))
if count == 0:
count = 1
self._chequear_campos_csv(campos, row.keys())
else:
codigo_brigada = row['BRIGADA']
nombre = row['NOMBRE']
cedula = row['CEDULA'].replace('-', '')
cargo = row['CARGO']
dias_trabajados = row['JORNALES']
total_jornada = row['COSTO_JORNADA']
fecha = self.fecha
total = int(dias_trabajados) * int(total_jornada)
existe_brigadista = brigadista.search([['cedula', '=', cedula]],limit=1)
brigada_actual = brigada.search([['codigo', '=', codigo_brigada]],limit=1)
#brigada_cr.execute(
# "SELECT id FROM public.utepda_brigada_brigada WHERE codigo=%s"
# % codigo_brigada)
#res = brigada_cr.fetchone()
#brigada_actual = brigada.search([['codigo', '=', codigo_brigada]],
#limit=1)
#brigada_actual = res[0]
if not existe_brigadista.id:
new = {
'name':
nombre,
'cedula':
cedula,
'cargo':
cargo,
'estado':
"nuevo",
'brigada_ids': [(0, _, {
'fecha': fecha,
'dias_trabajados': dias_trabajados,
'total': total,
'brigada_id': brigada_actual.id
})]
}
nuevo_brigadista = brigadista.create(new)
if nuevo_brigadista.id:
cuenta = cuenta+1
print("""{} Se ha insertado el brigadista {} con nombre {}""".format(cuenta,nuevo_brigadista.id,
nuevo_brigadista.name))
#existe_brigadista = existe_brigadista[0]
else:
existe_brigadista.write({
'estado':
"reportado",
'brigada_ids': [(0, _, {
'fecha': fecha,
'dias_trabajados': dias_trabajados,
'total': total,
'brigada_id': brigada_actual.id
})]
})
fecha_format = datetime.strftime(self.fecha, '%m/%Y')
no_reportados = brigadista.search(
[['fecha_ultimo_reporte', '!=', fecha_format]])
no_reportados.write({'estado': "no_reportado"})
return {
'type': 'ir.actions.client',
'tag': 'reload',
}
这是奥多日志
2020-11-04 11:44:23,285 15044 WARNING odoo odoo.service.server: Thread <Thread(odoo.service.http.request.140355723687680, started 140355723687680)> virtual real time limit (152/120s) reached.
2020-11-04 11:44:23,289 15044 INFO odoo odoo.service.server: Dumping stacktrace of limit exceeding threads before reloading
2020-11-04 11:44:23,520 15044 INFO odoo odoo.tools.misc:
# Thread: <Thread(odoo.service.http.request.140355723687680, started 140355723687680)> (db:odoo) (uid:2) (url:http://localhost:8069/web/dataset/call_button)
File: "/home/ernesto/.vscode/extensions/ms-python.python-2020.5.86806/pythonFiles/lib/python/debugpy/no_wheels/debugpy/_vendored/pydevd/_pydev_bundle/pydev_monkey.py", line 823, in __call__
ret = self.original_func(*self.args, **self.kwargs)
File: "/usr/lib/python3.6/threading.py", line 884, in _bootstrap
self._bootstrap_inner()
File: "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
self.run()
File: "/usr/lib/python3.6/threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File: "/usr/lib/python3.6/socketserver.py", line 654, in process_request_thread
self.finish_request(request, client_address)
File: "/usr/lib/python3.6/socketserver.py", line 364, in finish_request
self.RequestHandlerClass(request, client_address, self)
File: "/usr/lib/python3.6/socketserver.py", line 724, in __init__
self.handle()
File: "/usr/local/lib/python3.6/dist-packages/werkzeug/serving.py", line 228, in handle
rv = BaseHTTPRequestHandler.handle(self)
File: "/usr/lib/python3.6/http/server.py", line 418, in handle
self.handle_one_request()
File: "/usr/local/lib/python3.6/dist-packages/werkzeug/serving.py", line 263, in handle_one_request
return self.run_wsgi()
File: "/usr/local/lib/python3.6/dist-packages/werkzeug/serving.py", line 205, in run_wsgi
execute(self.server.app)
File: "/usr/local/lib/python3.6/dist-packages/werkzeug/serving.py", line 193, in execute
application_iter = app(environ, start_response)
File: "/home/ernesto/odoo12/odoo/service/server.py", line 434, in app
return self.app(e, s)
File: "/home/ernesto/odoo12/odoo/service/wsgi_server.py", line 142, in application
return application_unproxied(environ, start_response)
File: "/home/ernesto/odoo12/odoo/service/wsgi_server.py", line 117, in application_unproxied
result = odoo.http.root(environ, start_response)
File: "/home/ernesto/odoo12/odoo/http.py", line 1320, in __call__
return self.dispatch(environ, start_response)
File: "/home/ernesto/odoo12/odoo/http.py", line 1293, in __call__
return self.app(environ, start_wrapped)
File: "/usr/local/lib/python3.6/dist-packages/werkzeug/wsgi.py", line 599, in __call__
return self.app(environ, start_response)
File: "/home/ernesto/odoo12/odoo/http.py", line 1488, in dispatch
result = ir_http._dispatch()
File: "/home/ernesto/odoo12/addons/auth_signup/models/ir_http.py", line 19, in _dispatch
return super(Http, cls)._dispatch()
File: "/home/ernesto/odoo12/addons/web_editor/models/ir_http.py", line 22, in _dispatch
return super(IrHttp, cls)._dispatch()
File: "/home/ernesto/odoo12/odoo/addons/base/models/ir_http.py", line 203, in _dispatch
result = request.dispatch()
File: "/home/ernesto/odoo12/odoo/http.py", line 698, in dispatch
result = self._call_function(**self.params)
File: "/home/ernesto/odoo12/odoo/http.py", line 346, in _call_function
return checked_call(self.db, *args, **kwargs)
File: "/home/ernesto/odoo12/odoo/service/model.py", line 98, in wrapper
return f(dbname, *args, **kwargs)
File: "/home/ernesto/odoo12/odoo/http.py", line 339, in checked_call
result = self.endpoint(*a, **kw)
File: "/home/ernesto/odoo12/odoo/http.py", line 941, in __call__
return self.method(*args, **kw)
File: "/home/ernesto/odoo12/odoo/http.py", line 519, in response_wrap
response = f(*args, **kw)
File: "/home/ernesto/odoo12/addons/web/controllers/main.py", line 966, in call_button
action = self._call_kw(model, method, args, {})
File: "/home/ernesto/odoo12/addons/web/controllers/main.py", line 954, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File: "/home/ernesto/odoo12/odoo/api.py", line 759, in call_kw
return _call_kw_multi(method, model, args, kwargs)
File: "/home/ernesto/odoo12/odoo/api.py", line 746, in _call_kw_multi
result = method(recs, *args, **kwargs)
File: "<decorator-gen-127>", line 2, in action_import_csv
File: "/home/ernesto/odoo12/odoo/tools/profiler.py", line 128, in _odooProfile
result = method(*args, **kwargs)
File: "/home/ernesto/odoo12/extra_addons/utepda_brigadas/models/model_wizard.py", line 81, in action_import_csv
nuevo_brigadista = brigadista.create(new)
File: "<decorator-gen-111>", line 2, in create
File: "/home/ernesto/odoo12/odoo/api.py", line 461, in _model_create_multi
return create(self, [arg])
File: "/home/ernesto/odoo12/addons/mail/models/mail_thread.py", line 278, in create
thread._message_log(body=_('%s created') % doc_name)
File: "/home/ernesto/odoo12/addons/mail/models/mail_thread.py", line 2230, in _message_log
message = self.env['mail.message'].sudo().create(message_values)
File: "<decorator-gen-107>", line 2, in create
File: "/home/ernesto/odoo12/odoo/api.py", line 440, in _model_create_single
return create(self, arg)
File: "/home/ernesto/odoo12/addons/mail/models/mail_message.py", line 990, in create
message = super(Message, self).create(values)
File: "<decorator-gen-3>", line 2, in create
File: "/home/ernesto/odoo12/odoo/api.py", line 461, in _model_create_multi
return create(self, [arg])
File: "/home/ernesto/odoo12/odoo/models.py", line 3583, in create
records = self._create(data_list)
File: "/home/ernesto/odoo12/odoo/models.py", line 3669, in _create
col_val = field.convert_to_column(val, self, stored)
File: "/home/ernesto/odoo12/odoo/fields.py", line 1555, in convert_to_column
strip_classes=self.strip_classes)
File: "/home/ernesto/odoo12/odoo/tools/mail.py", line 227, in html_sanitize
cleaned = cleaner.clean_html(src)
File: "/usr/local/lib/python3.6/dist-packages/lxml/html/clean.py", line 517, in clean_html
doc = fromstring(html)
File: "/usr/local/lib/python3.6/dist-packages/lxml/html/__init__.py", line 876, in fromstring
doc = document_fromstring(html, parser=parser, base_url=base_url, **kw)
File: "/usr/local/lib/python3.6/dist-packages/lxml/html/__init__.py", line 762, in document_fromstring
value = etree.fromstring(html, parser, **kw)
2020-11-04 11:44:23,522 15044 INFO odoo odoo.service.server: Initiating server reload
2020-11-04 11:44:23285 15044警告odoo.service.server:已达到线程虚拟实时限制(152/120s)。
2020-11-04 11:44:23289 15044信息odoo odoo.service.server:在重新加载之前转储超过限制线程的堆栈跟踪
2020-11-04 11:44:23520 15044信息odoo.tools.misc:
#线程:(db:odoo)(uid:2)(url:http://localhost:8069/web/dataset/call_button)
文件:“/home/ernesto/.vscode/extensions/ms python.python-2020.5.86806/pythonFiles/lib/python/debugpy/no\u wheels/debugpy/\u vendored/pydev/\u pydev\u bundle/pydev\u monkey.py”,第823行,在调用中__
ret=self.original_func(*self.args,**self.kwargs)
文件:“/usr/lib/python3.6/threading.py”,第884行,在_bootstrap中
self.\u bootstrap\u inner()
文件:“/usr/lib/python3.6/threading.py”,第916行,在bootstrap\u内部
self.run()
文件:“/usr/lib/python3.6/threading.py”,第864行,正在运行
自我目标(*自我参数,**自我参数)
文件:“/usr/lib/python3.6/socketserver.py”,第654行,进程中\u请求\u线程
自我完成请求(请求、客户地址)
文件:“/usr/lib/python3.6/socketserver.py”,第364行,在finish_请求中
self.RequestHandlerClass(请求、客户端地址、self)
文件:“/usr/lib/python3.6/socketserver.py”,第724行,在__
self.handle()
文件:“/usr/local/lib/python3.6/dist packages/werkzeug/service.py”,第228行,在handle中
rv=BaseHTTPRequestHandler.handle(自)
文件:“/usr/lib/python3.6/http/server.py”,第418行,在handle中
self.handle_one_请求()
文件:“/usr/local/lib/python3.6/dist packages/werkzeug/service.py”,第263行,在handle\u one\u请求中
返回self.run_wsgi()
文件:“/usr/local/lib/python3.6/dist-packages/werkzeug/service.py”,第205行,在run\u wsgi中
执行(self.server.app)
文件:“/usr/local/lib/python3.6/dist packages/werkzeug/serving.py”,执行中第193行
应用程序=应用程序(环境,启动响应)
文件:“/home/ernesto/odoo12/odoo/service/server.py”,第434行,在应用程序中
返回self.app(e,s)
文件:“/home/ernesto/odoo12/odoo/service/wsgi_server.py”,第142行,在应用程序中
返回应用程序\u未经验证(环境、启动\u响应)
文件:“/home/ernesto/odoo12/odoo/service/wsgi_server.py”,第117行,在应用程序中
结果=odoo.http.root(环境,启动\u响应)
文件:“/home/ernesto/odoo12/odoo/http.py”,第1320行,在调用中__
返回自调度(环境、启动和响应)
文件:“/home/ernesto/odoo12/odoo/http.py”,第1293行,在调用中__
返回self.app(环境,开始)
文件:“/usr/local/lib/python3.6/dist-packages/werkzeug/wsgi.py”,第599行,在__
返回self.app(环境、启动和响应)
文件:“/home/ernesto/odoo12/odoo/http.py”,第1488行,在调度中
结果=ir\u http.\u dispatch()
文件:“/home/ernesto/odoo12/addons/auth_signup/models/ir_http.py”,第19行,在调度中
返回super(Http,cls)。\u dispatch()
文件:“/home/ernesto/odoo12/addons/web_editor/models/ir_http.py”,第22行,在调度中
返回超级(IrHttp,cls)。\u dispatch()
文件:“/home/ernesto/odoo12/odoo/addons/base/models/ir_http.py”,第203行,在
结果=request.dispatch()
文件:“/home/ernesto/odoo12/odoo/http.py”,第698行,在调度中
结果=self.\u调用函数(**self.params)
文件:“/home/ernesto/odoo12/odoo/http.py”,第346行,在调用函数中
返回选中的\u调用(self.db、*args、**kwargs)
文件:“/home/ernesto/odoo12/odoo/service/model.py”,第98行,在包装器中
返回f(数据库名,*args,**kwargs)
文件:“/home/ernesto/odoo12/odoo/http.py”,第339行,在checked_调用中
结果=自身终点(*a,**kw)
文件:“/home/ernesto/odoo12/odoo/http.py”,第941行,在调用中__
返回自方法(*参数,**kw)
文件:“/home/ernesto/odoo12/odoo/http.py”,第519行,作为响应
响应=f(*参数,**kw)
文件:“/home/ernesto/odoo12/addons/web/controllers/main.py”,第966行,在call_按钮中
action=self.\u调用\u kw(模型、方法、参数,{})
文件:“/home/ernesto/odoo12/addons/web/controllers/main.py”,第954行,单位为kw
返回调用(request.env[model],方法,args,kwargs)
文件:“/home/ernesto/odoo12/odoo/api.py”,第759行,在call\u-kw中
return\u call\u kw\u multi(方法、模型、参数、kwargs)
文件:“/home/ernesto/odoo12/odoo/api.py”,第746行,在调用中
结果=方法(recs、*args、**kwargs)
文件:“”,第2行,正在运行\u导入\u csv
文件:“/home/ernesto/odoo12/odoo/tools/profiler.py”,第128行,在odooProfile中
结果=方法(*args,**kwargs)
文件:“/home/ernesto/odoo12/extra\u addons/utepda\u brigadas/models/model\u wizard.py”,第81行,在操作中\u导入\u csv
新锐旅=创建旅(新)
文件:“”,第2行,在创建中
文件:“/home/ernesto/odoo12/odoo/api.py”,第461行,在“model\u create\u multi”中
返回创建(self,[arg])
文件:“/home/ernesto/odoo12/addons/mail/models/mail_thread.py”,第278行,在create中
线程。\消息\日志(正文=\创建了“%s”)%doc\u名称)
文件:“/home/ernesto/odoo12/addons/mail/models/mail\u thread.py”,第2230行,在消息日志中
message=self.env['mail.message'].sudo().create(message_值)
文件:“”,第2行,在创建中
文件:“/home/ernesto/odoo12/odoo/api.py”,第440行,在“model\u create\u single”中
返回创建(self,arg)
文件:“/home/ernesto/odoo12/addons/mail/models/mail_message.py”,第990行,在create中
消息=超级(消息,自我)。创建(值)
文件:“”,第2行,在创建中
文件:“/home/ernesto/odoo12/odoo/api.py”,第461行,在“model\u create\u multi”中
返回创建(self,[arg])
文件:“/home/ernesto/odoo12/odoo/models.py”,第3583行,在create中
记录=自创建(数据列表)
文件:“/home/ernesto/odoo12/odoo/models.py”,第3669行,在创建
col_val=字段。将_转换为_列(val、self、storage)
文件:“/home”
--limit-time-real 10000
limit_time_real = 480