Skip to content
Snippets Groups Projects
Commit 814fb43e authored by Preksha Chouhan's avatar Preksha Chouhan
Browse files

[FIX] web: return updated list of fields in export template

When user access template at the time of export with deleted field.
The traceback will be generated.

To reproduce the issue(any model, here- 'account.move.line'):

- Install 'account_accountant' module
- Go to Settings > Technical > Database Structure > Fields
- Create a new field with model as 'Journal Item' and save
- Go to Accounting > Miscellaneous > Journal Items
- Select any record in list view and click on export and generate a new export
template with newly created field
- Go to 'ir.model.fields' and delete that field
- Go to 'Journal Items' and select that template while export

Error: A traceback appears: KeyError: 'tax_audit'

When a field gets deleted from 'ir.model.fields' but it does not get deleted
from export template. And selecting that template to export the records will
lead to traceback.

See -
https://github.com/odoo/odoo/blob/59669e9943158e51dcbb9ae69ad758df8f7c7976/addons/web/controllers/main.py#L1815-L1818



sentry-4331986723

closes odoo/odoo#129567

Signed-off-by: default avatarJulien Castiaux (juc) <juc@odoo.com>
parent d805521d
No related branches found
No related tags found
No related merge requests found
......@@ -7,6 +7,7 @@ from unittest.mock import patch
from odoo import http
from odoo.tests import common, tagged
from odoo.tools import mute_logger
from odoo.tools.misc import get_lang
from odoo.addons.web.controllers.main import ExportXlsxWriter
from odoo.addons.mail.tests.common import mail_new_test_user
......@@ -412,3 +413,38 @@ class TestComputedBinaryExport(XlsxCreatorCase):
['OdooBot (1)'],
["['computed value']"],
])
@mute_logger('odoo.addons.web.controllers.main')
def test_export_with_deleted_field(self):
model = self.env['ir.model']._get('res.partner')
url = '/web/export/namelist'
header = {"Content-Type": "application/json"}
custom_field = self.env['ir.model.fields'].create([{
'name': 'x_test',
'ttype': 'char',
'field_description': 'test field',
'model_id': model.id,
}])
export_template = self.env['ir.exports'].create({
'name': custom_field.name,
'export_fields': [(0, 0, {'name': custom_field.name})],
})
data = json.dumps({
'params': {
'model': model.model,
'export_id': export_template.id,
},
})
export_line_field = self.env['ir.exports.line'].search([('name', '=', export_template.name)])
self.url_open(url, data, headers=header).json()
self.assertTrue(export_line_field.exists())
custom_field.unlink()
self.url_open(url, data, headers=header).json()
self.assertFalse(export_line_field.exists())
......@@ -1807,7 +1807,15 @@ class Export(http.Controller):
def namelist(self, model, export_id):
# TODO: namelist really has no reason to be in Python (although itertools.groupby helps)
export = request.env['ir.exports'].browse([export_id]).read()[0]
export_fields_list = request.env['ir.exports.line'].browse(export['export_fields']).read()
exported_fields = request.env['ir.exports.line'].browse(export['export_fields'])
fields = self.fields_get(model)
for invalid_fields in exported_fields.filtered(lambda f: f.name not in fields):
# ir.exports.line lack a ondelete=cascade foreign key on ir.model.fields
_logger.warning("Field %r not found for saved ir.exports of model %s, deleting", invalid_fields.name, model)
invalid_fields.unlink()
export_fields_list = exported_fields.read()
fields_data = self.fields_info(
model, [f['name'] for f in export_fields_list])
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment