diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e6bfd8387..e59cbbeea 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,6 @@ exclude: | (?x) # NOT INSTALLABLE ADDONS - ^connector_importer/| # END NOT INSTALLABLE ADDONS # Files and folders generated by bots, to avoid loops ^setup/|/static/description/index\.html$| diff --git a/connector_importer/__manifest__.py b/connector_importer/__manifest__.py index cd8a5cdf8..db8ed6511 100644 --- a/connector_importer/__manifest__.py +++ b/connector_importer/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Connector Importer", "summary": """This module takes care of import sessions.""", - "version": "15.0.1.4.0", + "version": "16.0.1.0.0", "depends": ["connector", "queue_job"], "author": "Camptocamp, Odoo Community Association (OCA)", "license": "AGPL-3", @@ -27,5 +27,4 @@ "menuitems.xml", ], "external_dependencies": {"python": ["chardet", "pytz", "pyyaml"]}, - "installable": False, } diff --git a/connector_importer/components/odoorecord.py b/connector_importer/components/odoorecord.py index 5cf255e55..26573f320 100644 --- a/connector_importer/components/odoorecord.py +++ b/connector_importer/components/odoorecord.py @@ -218,7 +218,7 @@ def _force_value(self, record, values, fname): # pylint: disable=sql-injection query = "UPDATE {} SET {} = %s WHERE id = %s".format(record._table, fname) self.env.cr.execute(query, (values[fname], record.id)) - record.invalidate_cache([fname]) + record.invalidate_recordset([fname]) def _odoo_write_purge_values(self, odoo_record, values): # remove non fields values diff --git a/connector_importer/models/import_type.py b/connector_importer/models/import_type.py index ab9f40408..9f82de2c1 100644 --- a/connector_importer/models/import_type.py +++ b/connector_importer/models/import_type.py @@ -85,8 +85,8 @@ class ImportType(models.Model): def _check_options(self): no_options = self.browse() for rec in self: - if not rec.options and not rec.settings: - no_options.append(rec) + if not rec.options: + no_options += rec # TODO: validate yaml schema (maybe w/ Cerberus?) if no_options: raise exceptions.UserError( diff --git a/connector_importer/models/recordset.py b/connector_importer/models/recordset.py index d0ff8069b..71d8255b4 100644 --- a/connector_importer/models/recordset.py +++ b/connector_importer/models/recordset.py @@ -153,7 +153,7 @@ def _set_serialized(self, fname, values, reset=False): # In order to streamline this I invalidate cache right away so the # values are converted right away # TL/DR integer dict keys will always be converted to strings, beware - self.invalidate_cache((fname,)) + self.invalidate_recordset((fname,)) def set_report(self, values, reset=False): """Update import report values.""" @@ -186,7 +186,7 @@ def _prepare_for_import_session(self, start=True): "shared_data": {}, } self.write(values) - self.invalidate_cache(tuple(values.keys())) + self.invalidate_recordset(tuple(values.keys())) def _get_report_html_data(self): """Prepare data for HTML report. diff --git a/connector_importer/models/sources/source_mixin.py b/connector_importer/models/sources/source_mixin.py index 0fed3e947..b4e3f8216 100644 --- a/connector_importer/models/sources/source_mixin.py +++ b/connector_importer/models/sources/source_mixin.py @@ -59,9 +59,10 @@ def _compute_config_summary(self): just override `_config_summary_fields`. They'll be automatically included in the summary. """ - template = self.env.ref(self._config_summary_template) + tmpl_xid = self._config_summary_template + qweb = self.env["ir.qweb"].sudo() for item in self: - item.config_summary = template._render(item._config_summary_data()) + item.config_summary = qweb._render(tmpl_xid, item._config_summary_data()) def _config_summary_data(self): """Collect data for summary.""" @@ -71,10 +72,11 @@ def _config_summary_data(self): "fields_info": self.fields_get(self._config_summary_fields), } + # TODO: check if still needed + use create multi @api.model def create(self, vals): - """Override to update reference to source on the consumer.""" res = super().create(vals) + # Override to update reference to source on the consumer if self.env.context.get("active_model"): # update reference on consumer self.env[self.env.context["active_model"]].browse( diff --git a/connector_importer/tests/test_event_listeners.py b/connector_importer/tests/test_event_listeners.py index 17bfb4112..c00bbc39a 100644 --- a/connector_importer/tests/test_event_listeners.py +++ b/connector_importer/tests/test_event_listeners.py @@ -2,7 +2,8 @@ # Copyright 2023 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -import mock +from unittest import mock + from odoo_test_helper import FakeModelLoader from odoo.tools import mute_logger @@ -56,7 +57,8 @@ def setUpClass(cls): { "options": f""" - model: res.partner - importer: fake.partner.importer + importer: + name: fake.partner.importer - model: {FakeImportedModel._name} options: record_handler: diff --git a/connector_importer/tests/test_import_type.py b/connector_importer/tests/test_import_type.py index 9b9a2a650..312208dc9 100644 --- a/connector_importer/tests/test_import_type.py +++ b/connector_importer/tests/test_import_type.py @@ -64,16 +64,20 @@ def test_available_importers_defaults(self): def test_available_importers(self): options = """ - model: res.partner - importer: partner.importer + importer: + name: fake.partner.importer - model: res.users - importer: user.importer + importer: + name: + user.importer options: importer: baz: True record_handler: bar: False - model: another.one - importer: import.withspaces + importer: + name: import.withspaces context: foo: True """ @@ -81,7 +85,9 @@ def test_available_importers(self): importers = tuple(itype.available_importers()) expected = ( { - "importer": "partner.importer", + "importer": { + "name": "fake.partner.importer", + }, "model": "res.partner", "is_last_importer": False, "context": {}, @@ -93,7 +99,9 @@ def test_available_importers(self): }, }, { - "importer": "user.importer", + "importer": { + "name": "user.importer", + }, "model": "res.users", "is_last_importer": False, "context": {}, @@ -105,7 +113,9 @@ def test_available_importers(self): }, }, { - "importer": "import.withspaces", + "importer": { + "name": "import.withspaces", + }, "model": "another.one", "is_last_importer": True, "context": {"foo": 1}, diff --git a/connector_importer/tests/test_recordset.py b/connector_importer/tests/test_recordset.py index c97e89c79..723c95682 100644 --- a/connector_importer/tests/test_recordset.py +++ b/connector_importer/tests/test_recordset.py @@ -30,7 +30,8 @@ def _create_type(cls): "key": "ok", "options": """ - model: res.partner - importer: partner.importer + importer: + name: partner.importer """, } ) @@ -93,16 +94,13 @@ def test_get_report_html(self): self.assertEqual(key.model, "res.partner") self.assertTrue(isinstance(self.recordset.report_html, Markup)) - def test_docs_html(self): - # No registry loaded here, nothing to render - self.assertFalse(self.recordset.docs_html) - def test_importable_models(self): self.itype.write( { "options": """ - model: res.partner - importer: partner.importer + importer: + name: partner.importer - model: res.partner.category - model: res.lang """ diff --git a/connector_importer/tests/test_recordset_importer.py b/connector_importer/tests/test_recordset_importer.py index 49b5801ae..15033530c 100644 --- a/connector_importer/tests/test_recordset_importer.py +++ b/connector_importer/tests/test_recordset_importer.py @@ -2,7 +2,7 @@ # Copyright 2018 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -import mock +from unittest import mock from markupsafe import Markup diff --git a/connector_importer/tests/test_source.py b/connector_importer/tests/test_source.py index 49d877dc9..b96d03f69 100644 --- a/connector_importer/tests/test_source.py +++ b/connector_importer/tests/test_source.py @@ -3,7 +3,8 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -import mock +from unittest import mock + from odoo_test_helper import FakeModelLoader from .common import BaseTestCase diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 000000000..8f95dda53 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +# generated from manifests external_dependencies +chardet +pytz +pyyaml diff --git a/setup/connector_importer/odoo/addons/connector_importer b/setup/connector_importer/odoo/addons/connector_importer new file mode 120000 index 000000000..c0091fe0d --- /dev/null +++ b/setup/connector_importer/odoo/addons/connector_importer @@ -0,0 +1 @@ +../../../../connector_importer \ No newline at end of file diff --git a/setup/connector_importer/setup.py b/setup/connector_importer/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/connector_importer/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 000000000..4ad8e0ece --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1 @@ +odoo-test-helper