# HG changeset patch
# User Vincent Hatakeyama <vincent.hatakeyama@xcg-consulting.fr>
# Date 1655989743 -7200
#      Thu Jun 23 15:09:03 2022 +0200
# Branch 15.0
# Node ID d4aff7c4e681dd6baa2b4b3afe03bf5e40eaea6c
# Parent  77996d1a76d6bf88d6a8a818c7a9e354f59fa6bb
✨ migration to Odoo v15

diff --git a/.badges/maturity.svg b/.badges/maturity.svg
--- a/.badges/maturity.svg
+++ b/.badges/maturity.svg
@@ -1,16 +1,16 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<svg xmlns="http://www.w3.org/2000/svg" width="177" height="20">
+<svg xmlns="http://www.w3.org/2000/svg" width="97" height="20">
   <linearGradient id="b" x2="0" y2="100%">
     <stop offset="0" stop-color="#bbb" stop-opacity=".1" />
     <stop offset="1" stop-opacity=".1" />
   </linearGradient>
   <mask id="anybadge_1">
-    <rect width="177" height="20" rx="3" fill="#fff" />
+    <rect width="97" height="20" rx="3" fill="#fff" />
   </mask>
   <g mask="url(#anybadge_1)">
     <path fill="#555" d="M0 0h61v20H0z" />
-    <path fill="#4c1" d="M61 0h116v20H61z" />
-    <path fill="url(#b)" d="M0 0h177v20H0z" />
+    <path fill="#dfb317" d="M61 0h36v20H61z" />
+    <path fill="url(#b)" d="M0 0h97v20H0z" />
   </g>
   <g
     fill="#fff"
@@ -27,7 +27,7 @@
     font-family="DejaVu Sans,Verdana,Geneva,sans-serif"
     font-size="11"
   >
-    <text x="120.0" y="15" fill="#010101" fill-opacity=".3">Production/Stable</text>
-    <text x="119.0" y="14">Production/Stable</text>
+    <text x="80.0" y="15" fill="#010101" fill-opacity=".3">Beta</text>
+    <text x="79.0" y="14">Beta</text>
   </g>
 </svg>
diff --git a/.flake8 b/.flake8
new file mode 100644
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,2 @@
+[flake8]
+max-line-length = 88
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,3 +1,3 @@
 include:
   - project: xcg/ci-templates
-    file: /odoo/13.0/gitlab-ci.yaml
+    file: /odoo/15.0/gitlab-ci.yaml
diff --git a/NEWS.rst b/NEWS.rst
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -1,44 +1,7 @@
 Changelog
 =========
 
-13.0.3.0.0
-----------
-
-Removed previously deprecated send_items method.
-
-13.0.2.0.3
-----------
-
-Update to latest template version and change tests to use TransactionCase whenever possible.
-
-forward port of 11.0
-~~~~~~~~~~~~~~~~~~~~
-
-Indicate clearly that send_items only send a unique item, unlike what the documentation indicated before and the name implied.
-
-Corrected the "export" method for Xbus emissions for "One2many" exports contents.
-
-13.0.2.0.2
+15.0.1.0.0
 ----------
 
-Remove header and body from job view as they are not base64 encoded and incompatible with what Odoo expects.
-
-13.0.2.0.1
-----------
-
-Corrected the translations of cardinality incompatibilities.
-
-13.0.2.0.0 (2021-08-25)
------------------------
-
-Change chunking to be automatic by default.
-
-Add new method to send data, mainly for sending files.
-
-13.0.1.0.0 (2020-06-23)
------------------------
-
-* Migrate to Odoo 13.0.1.0
-    * remove @api.multi, returns
-    * remove view_type form
-
+Port to Odoo 15 from 13.0.3.0.0.
diff --git a/README.rst b/README.rst
--- a/README.rst
+++ b/README.rst
@@ -4,11 +4,11 @@
 
 .. Update the path to the module bellow and to the branch
 .. |coverage| image:: .badges/coverage.svg
-    :target: https://orus.io/xcg/odoo-modules/xbus_emitter/-/pipelines?ref=branch/13.0
+    :target: https://orus.io/xcg/odoo-modules/xbus_emitter/-/pipelines?ref=branch/15.0
     :alt: Coverage report
 .. the image is updated by the CI when building the documentation
 .. |pylint| image:: .badges/pylint.svg
-    :target: https://orus.io/xcg/odoo-modules/xbus_emitter/-/pipelines?ref=branch/13.0
+    :target: https://orus.io/xcg/odoo-modules/xbus_emitter/-/pipelines?ref=branch/15.0
     :alt: pylint score
 .. Update the badge bellow depending on status
 .. |maturity| image:: .badges/maturity.svg
diff --git a/__manifest__.py b/__manifest__.py
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -21,7 +21,7 @@
     "name": "Xbus Emitter",
     "license": "AGPL-3",
     "summary": "Emit messages from Odoo to Xbus",
-    "version": "13.0.3.0.0",
+    "version": "15.0.1.0.0",
     "category": "Technical",
     "author": "XCG Consulting",
     "website": "https://odoo.consulting/",
@@ -30,10 +30,12 @@
         "security/ir.model.access.csv",
         "data/xbus.emitter.csv",
         "menu.xml",
-        "views/assets.xml",
         "views/xbus_emitter.xml",
         "views/xbus_emitter_job.xml",
     ],
-    "qweb": ["static/src/xml/debug_manager.xml"],
+    "assets": {
+        "web.assets_backend": ["/xbus_emitter/static/src/js/debug_manager_xbus.js"],
+        "web.assets_qweb": ["/xbus_emitter/static/src/xml/debug_manager.xml"],
+    },
     "installable": True,
 }
diff --git a/doc/autotodo.py b/doc/autotodo.py
--- a/doc/autotodo.py
+++ b/doc/autotodo.py
@@ -22,6 +22,7 @@
 import os
 import os.path
 import sys
+from typing import Dict, Mapping, Tuple
 
 
 def main():
@@ -33,13 +34,14 @@
     exts = sys.argv[2].split(",")
     tags = sys.argv[3].split(",")
     todolist = {tag: [] for tag in tags}
+    path_file_length: Mapping[str, int] = {}
 
     for root, _dirs, files in os.walk(folder):
-        scan_folder((exts, tags, todolist), root, files)
-    create_autotodo(folder, todolist)
+        scan_folder((exts, tags, todolist, path_file_length), root, files)
+    create_autotodo(folder, todolist, path_file_length)
 
 
-def write_info(f, infos, folder):
+def write_info(f, infos, folder, path_file_length: Mapping[str, int]):
     # Check sphinx version for lineno-start support
 
     import sphinx
@@ -52,10 +54,8 @@
     for i in infos:
         path = i[0]
         line = i[1]
-        lines = (line - 3, line + 4)
-        class_name = ":class:`%s`" % os.path.basename(
-            os.path.splitext(path)[0]
-        )
+        lines = (line - 3, min(line + 4, path_file_length[path]))
+        class_name = ":class:`%s`" % os.path.basename(os.path.splitext(path)[0])
         f.write(
             "%s\n"
             "%s\n\n"
@@ -71,7 +71,7 @@
                 path,
                 lines[0],
                 lines[1],
-                line,
+                4,
             )
         )
         if lineno_start:
@@ -79,33 +79,34 @@
         f.write("\n")
 
 
-def create_autotodo(folder, todolist):
+def create_autotodo(folder, todolist, path_file_length: Mapping[str, int]):
     with open("autotodo", "w+") as f:
         for tag, info in list(todolist.items()):
             f.write("%s\n%s\n\n" % (tag, "=" * len(tag)))
-            write_info(f, info, folder)
+            write_info(f, info, folder, path_file_length)
 
 
 def scan_folder(data_tuple, dirname, names):
-    (exts, tags, res) = data_tuple
-    file_info = {}
+    (exts, tags, res, path_file_length) = data_tuple
     for name in names:
         (root, ext) = os.path.splitext(name)
         if ext in exts:
-            file_info = scan_file(os.path.join(dirname, name), tags)
+            path = os.path.join(dirname, name)
+            file_info, length = scan_file(path, tags)
+            path_file_length[path] = length
             for tag, info in list(file_info.items()):
                 if info:
                     res[tag].extend(info)
 
 
-def scan_file(filename, tags):
+def scan_file(filename, tags) -> Tuple[Dict[str, Tuple[str, int, str]], int]:
     res = {tag: [] for tag in tags}
     with open(filename, "r") as f:
         for line_num, line in enumerate(f):
             for tag in tags:
                 if tag in line:
                     res[tag].append((filename, line_num, line[:-1].strip()))
-    return res
+    return res, line_num
 
 
 if __name__ == "__main__":
diff --git a/doc/conf.py b/doc/conf.py
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -12,9 +12,9 @@
 import os
 import sys
 
-import odoo
+from odoo_scripts.config import Configuration
 
-from odoo_scripts.config import Configuration
+import odoo
 
 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
@@ -121,9 +121,7 @@
 
 # One entry per manual page. List of tuples
 # (source start file, name, description, authors, manual section).
-man_pages = [
-    (master_doc, module_lowercase, "%s Documentation" % project, [author], 1)
-]
+man_pages = [(master_doc, module_lowercase, "%s Documentation" % project, [author], 1)]
 
 # -- Options for Texinfo output -------------------------------------------
 
@@ -157,9 +155,7 @@
 )
 sphinxodoo_addons = [this_module]
 # sphinxodoo_root_path : Path of the Odoo root directory
-sphinxodoo_root_path = os.path.dirname(
-    os.path.dirname(os.path.abspath(odoo.__file__))
-)
+sphinxodoo_root_path = os.path.dirname(os.path.dirname(os.path.abspath(odoo.__file__)))
 # sphinxodoo_addons_path : List of paths were Odoo addons to load are located
 c = None
 # find setup file of superproject, if any
@@ -189,9 +185,7 @@
         sphinxodoo_addons_path.append(os.path.join(directory, line))
 else:
     # add this directory top dir
-    sphinxodoo_addons_path.append(
-        os.path.dirname(os.path.dirname(os.getenv("PWD")))
-    )
+    sphinxodoo_addons_path.append(os.path.dirname(os.path.dirname(os.getenv("PWD"))))
     other_addons = os.getenv("ODOO_ADDONS_PATH", default=None)
     if other_addons:
         for addon_path in other_addons.split(","):
diff --git a/doc/index.rst b/doc/index.rst
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -3,7 +3,7 @@
 Contents:
 
 .. toctree::
-   :maxdepth: 2
+   :maxdepth: 4
 
    modules
    NEWS
diff --git a/doc/modules.rst b/doc/modules.rst
new file mode 100644
--- /dev/null
+++ b/doc/modules.rst
@@ -0,0 +1,7 @@
+xbus_emitter
+============
+
+.. toctree::
+   :maxdepth: 4
+
+   xbus_emitter
diff --git a/doc/xbus_emitter.models.rst b/doc/xbus_emitter.models.rst
new file mode 100644
--- /dev/null
+++ b/doc/xbus_emitter.models.rst
@@ -0,0 +1,37 @@
+odoo.addons.xbus\_emitter.models package
+========================================
+
+Submodules
+----------
+
+odoo.addons.xbus\_emitter.models.ir\_autovacuum module
+------------------------------------------------------
+
+.. automodule:: odoo.addons.xbus_emitter.models.ir_autovacuum
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+odoo.addons.xbus\_emitter.models.xbus\_emitter module
+-----------------------------------------------------
+
+.. automodule:: odoo.addons.xbus_emitter.models.xbus_emitter
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+odoo.addons.xbus\_emitter.models.xbus\_emitter\_job module
+----------------------------------------------------------
+
+.. automodule:: odoo.addons.xbus_emitter.models.xbus_emitter_job
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: odoo.addons.xbus_emitter.models
+   :members:
+   :undoc-members:
+   :show-inheritance:
diff --git a/doc/xbus_emitter.rst b/doc/xbus_emitter.rst
new file mode 100644
--- /dev/null
+++ b/doc/xbus_emitter.rst
@@ -0,0 +1,30 @@
+odoo.addons.xbus\_emitter package
+=================================
+
+Subpackages
+-----------
+
+.. toctree::
+   :maxdepth: 4
+
+   xbus_emitter.models
+   xbus_emitter.tests
+
+Submodules
+----------
+
+odoo.addons.xbus\_emitter.export module
+---------------------------------------
+
+.. automodule:: odoo.addons.xbus_emitter.export
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: odoo.addons.xbus_emitter
+   :members:
+   :undoc-members:
+   :show-inheritance:
diff --git a/doc/xbus_emitter.tests.rst b/doc/xbus_emitter.tests.rst
new file mode 100644
--- /dev/null
+++ b/doc/xbus_emitter.tests.rst
@@ -0,0 +1,37 @@
+odoo.addons.xbus\_emitter.tests package
+=======================================
+
+Submodules
+----------
+
+odoo.addons.xbus\_emitter.tests.test\_export module
+---------------------------------------------------
+
+.. automodule:: odoo.addons.xbus_emitter.tests.test_export
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+odoo.addons.xbus\_emitter.tests.test\_xbus\_emitter module
+----------------------------------------------------------
+
+.. automodule:: odoo.addons.xbus_emitter.tests.test_xbus_emitter
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+odoo.addons.xbus\_emitter.tests.test\_xbus\_emitter\_job module
+---------------------------------------------------------------
+
+.. automodule:: odoo.addons.xbus_emitter.tests.test_xbus_emitter_job
+   :members:
+   :undoc-members:
+   :show-inheritance:
+
+Module contents
+---------------
+
+.. automodule:: odoo.addons.xbus_emitter.tests
+   :members:
+   :undoc-members:
+   :show-inheritance:
diff --git a/export.py b/export.py
--- a/export.py
+++ b/export.py
@@ -8,11 +8,10 @@
 def sql_map(query_result, psql_mapping):
     """Extract the data from a PostgreSQL query for export.
 
-    :param query_result: the result dictionary of the executed PostgreSQL
-    query.
+    :param query_result: the result dictionary of the executed PostgreSQL query.
     :param psql_mapping: the dictionary, mapping the way data must be extracted
-    from the PostgreSQL query result to return an output dictionary for
-    export.
+        from the PostgreSQL query result to return an output dictionary for
+        export.
     """
 
     if not query_result:
@@ -46,6 +45,7 @@
     ``custom`` option is set, the key is used as the ``source``.
 
     The field options are:
+
     - ``source``: name of the odoo object to copy. If the name contains dots
       ("."), it is used as a path to navigate on relation fields.
     - ``custom``: a function that takes the value found in the 'source' field,
@@ -153,10 +153,7 @@
                     if i != len(path) - 1:
                         value = value[0]
 
-                if (
-                    value_datatype in ("char", "text", "html")
-                    and value is False
-                ):
+                if value_datatype in ("char", "text", "html") and value is False:
                     value = None
                     break
 
@@ -179,11 +176,7 @@
                 islist = True
 
             if islist:
-                value = (
-                    [export(item, submapping) for item in value]
-                    if value
-                    else []
-                )
+                value = [export(item, submapping) for item in value] if value else []
             else:
                 if value is not None:
                     value = export(value, submapping)
diff --git a/i18n/fr.po b/i18n/fr.po
--- a/i18n/fr.po
+++ b/i18n/fr.po
@@ -5,10 +5,10 @@
 # Vincent Hatakeyama <vincent.hatakeyama@xcg-consulting.fr>, 2021.
 msgid ""
 msgstr ""
-"Project-Id-Version: Odoo Server 13.0\n"
+"Project-Id-Version: Odoo Server 15.0\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2022-06-23 10:18+0000\n"
-"PO-Revision-Date: 2022-06-23 12:23+0200\n"
+"PO-Revision-Date: 2022-06-23 14:56+0200\n"
 "Last-Translator: Vincent Hatakeyama <vincent.hatakeyama@xcg-consulting.fr>\n"
 "Language-Team: XCG Consulting\n"
 "Language: fr\n"
diff --git a/models/xbus_emitter.py b/models/xbus_emitter.py
--- a/models/xbus_emitter.py
+++ b/models/xbus_emitter.py
@@ -27,8 +27,7 @@
 
 
 class XbusEmitter(models.Model):
-    """Configuration profile to emit Xbus messages from Odoo.
-    """
+    """Configuration profile to emit Xbus messages from Odoo."""
 
     _name = "xbus.emitter"
     _description = "Xbus Emitter Profile"
@@ -116,9 +115,7 @@
         # factorized method used by the various send_ methods
         job_values["event_type"] = event_type
         if record:
-            job_values.update(
-                {"record_id": record.id, "record_model": record._name}
-            )
+            job_values.update({"record_id": record.id, "record_model": record._name})
         # Remove default value fillers from the context. This can be called
         # from various places so safer / easier right here than upstream.
         emitter_context = self.get_clean_context()
diff --git a/models/xbus_emitter_job.py b/models/xbus_emitter_job.py
--- a/models/xbus_emitter_job.py
+++ b/models/xbus_emitter_job.py
@@ -1,7 +1,7 @@
 ##############################################################################
 #
 #    Xbus emitter for Odoo
-#    Copyright (C) 2015, 2020 XCG Consulting <https://xcg-consulting.fr>
+#    Copyright (C) 2015, 2020, 2022 XCG Consulting <https://xcg-consulting.fr>
 #
 #    This program is free software: you can redistribute it and/or modify
 #    it under the terms of the GNU Affero General Public License as
@@ -33,8 +33,7 @@
 
 
 class XbusEmitterJob(models.Model):
-    """Message to be emitted (or already emitted) to Xbus.
-    """
+    """Message to be emitted (or already emitted) to Xbus."""
 
     _name = "xbus.emitter.job"
     _description = "Xbus Emitter Job"
@@ -101,7 +100,6 @@
         ],
         string="State",
         required=True,
-        track_visibility="onchange",
         default="to_send",
         index=True,
     )
@@ -115,7 +113,6 @@
         string="Chunking",
         required=True,
         help="Specify how the item can or cannot be chunked.",
-        track_visibility="onchange",
         default="auto",
     )
 
@@ -128,14 +125,11 @@
 
     process_id = fields.Char(
         string="Process ID",
-        help="The ID of the process that was created by the sending of the "
-        "envelope",
+        help="The ID of the process that was created by the sending of the " "envelope",
     )
 
     date_sent = fields.Datetime(string="Envelope Sending Date", readonly=True)
-    date_done = fields.Datetime(
-        string="Process Termination Date", readonly=True
-    )
+    date_done = fields.Datetime(string="Process Termination Date", readonly=True)
 
     _sql_constraints = (
         (
@@ -146,26 +140,24 @@
         ),
         (
             "header_body",
-            "CHECK((header IS NULL AND items IS NOT NULL) OR "
-            "body IS NOT NULL)",
+            "CHECK((header IS NULL AND items IS NOT NULL) OR body IS NOT NULL)",
             "Header can only be used with body",
         ),
         (
             "body_chunking_auto",
-            "CHECK(body IS NULL OR chunking = '{}')".format(
-                SELECTION_CHUNKING_AUTO
-            ),
+            "CHECK(body IS NULL OR chunking = '{}')".format(SELECTION_CHUNKING_AUTO),
             "Chunking must be automatic when using body",
         ),
     )
 
+    # id is used but Odoo does not want a depends on it. as it does not change
+    # it is not added in the :meth:depends
+    @api.depends("event_type")
     def name_get(self):
         # nicer name than the default
         result = []
         for record in self:
-            result.append(
-                (record.id, "%s: %d" % (record.event_type, record.id))
-            )
+            result.append((record.id, "%s: %d" % (record.event_type, record.id)))
         return result
 
     @api.model
@@ -180,9 +172,7 @@
         """
 
         deadline = datetime.now() - timedelta(days=self._removal_interval)
-        jobs = self.search(
-            [("date_done", "<=", fields.Datetime.to_string(deadline))]
-        )
+        jobs = self.search([("date_done", "<=", fields.Datetime.to_string(deadline))])
         log.info("%s, %s", len(jobs), jobs)
         jobs.unlink()
 
diff --git a/pyproject.toml b/pyproject.toml
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,3 +1,17 @@
+[tool.isort]
+py_version = 39
+profile = "black"
+known_odoo = ['odoo']
+known_odoo_addons = ['odoo.addons']
+sections = [
+  'FUTURE',
+  'STDLIB',
+  'THIRDPARTY',
+  'ODOO',
+  'ODOO_ADDONS',
+  'FIRSTPARTY',
+  'LOCALFOLDER'
+]
+
 [tool.black]
-line-length = 79
-target = 3.8
+target = 3.9
diff --git a/tests/__init__.py b/tests/__init__.py
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,5 +1,1 @@
-from . import (  # noqa: F401
-    test_export,
-    test_xbus_emitter,
-    test_xbus_emitter_job,
-)
+from . import test_export, test_xbus_emitter, test_xbus_emitter_job  # noqa: F401
diff --git a/tests/test_export.py b/tests/test_export.py
--- a/tests/test_export.py
+++ b/tests/test_export.py
@@ -27,9 +27,7 @@
         record = self.env["res.partner"].create({"name": "my name"})
         self.assertEqual(
             {"name": "my name", "company": None},
-            export(
-                record, {"name": {}, "company": {"source": "company_name"}}
-            ),
+            export(record, {"name": {}, "company": {"source": "company_name"}}),
         )
 
     def test_export_integer_field(self):
@@ -47,21 +45,17 @@
     def test_export_text_field(self):
         record = self.env["res.partner"].create({"name": "my name"})
         self.assertEqual({"comment": None}, export(record, {"comment": {}}))
-        record.comment = "A comment"
+        record.comment = "<p>A comment</p>"
         self.assertEqual(
-            {"comment": "A comment"}, export(record, {"comment": {}})
+            {"comment": "<p>A comment</p>"}, export(record, {"comment": {}})
         )
 
     def test_export_float_field(self):
         record = self.env["res.partner"].create({"name": "my name"})
-        self.assertEqual(
-            {"credit_limit": 0.0}, export(record, {"credit_limit": {}})
-        )
+        self.assertEqual({"credit_limit": 0.0}, export(record, {"credit_limit": {}}))
         record.credit_limit = 4.5
 
-        self.assertEqual(
-            {"credit_limit": 4.5}, export(record, {"credit_limit": {}})
-        )
+        self.assertEqual({"credit_limit": 4.5}, export(record, {"credit_limit": {}}))
 
     def test_export_selection_field(self):
         record = self.env["res.partner"].create({"name": "my name"})
@@ -89,31 +83,21 @@
         )
 
     def test_export_one2many_field(self):
-        mapping = {
-            "children": {"source": "child_ids", "mapping": {"name": {}}}
-        }
+        mapping = {"children": {"source": "child_ids", "mapping": {"name": {}}}}
         parent = self.env["res.partner"].create({"name": "my parent"})
 
         self.assertEqual({"children": []}, export(parent, mapping))
 
-        self.env["res.partner"].create(
-            {"name": "Child1", "parent_id": parent.id}
-        )
-        self.assertEqual(
-            {"children": [{"name": "Child1"}]}, export(parent, mapping)
-        )
-        self.env["res.partner"].create(
-            {"name": "Child2", "parent_id": parent.id}
-        )
+        self.env["res.partner"].create({"name": "Child1", "parent_id": parent.id})
+        self.assertEqual({"children": [{"name": "Child1"}]}, export(parent, mapping))
+        self.env["res.partner"].create({"name": "Child2", "parent_id": parent.id})
         self.assertEqual(
             {"children": [{"name": "Child1"}, {"name": "Child2"}]},
             export(parent, mapping),
         )
 
     def test_export_many2many_field(self):
-        mapping = {
-            "categories": {"source": "category_id", "mapping": {"name": {}}}
-        }
+        mapping = {"categories": {"source": "category_id", "mapping": {"name": {}}}}
 
         category1 = self.env["res.partner.category"].create({"name": "cat1"})
         category2 = self.env["res.partner.category"].create({"name": "cat2"})
@@ -124,9 +108,7 @@
 
         record.category_id = [category1.id]
 
-        self.assertEqual(
-            {"categories": [{"name": "cat1"}]}, export(record, mapping)
-        )
+        self.assertEqual({"categories": [{"name": "cat1"}]}, export(record, mapping))
 
         record.category_id = [category1.id, category2.id]
 
@@ -136,7 +118,7 @@
         )
 
     def test_export_deep_relation(self):
-        m = {
+        mapping = {
             "company": {
                 "source": "partner_ids.company_id",
                 "mapping": {"name": {}},
@@ -155,9 +137,7 @@
 
         category1.partner_ids = [partner1.id]
 
-        self.assertEqual(
-            {"company": {"name": "company"}}, export(category1, m)
-        )
+        self.assertEqual({"company": {"name": "company"}}, export(category1, mapping))
 
     def test_export_custom_char(self):
         record = self.env["res.partner"].create({"name": "my name"})
@@ -202,29 +182,21 @@
         record = self.env["res.partner"].create({"name": "my name"})
         self.assertEqual(
             {"name": "my namemy name"},
-            export(
-                record, {"name": {"source": "name", "custom": lambda s: s * 2}}
-            ),
+            export(record, {"name": {"source": "name", "custom": lambda s: s * 2}}),
         )
 
     def test_export_custom_with_source_list(self):
         """Custom list built out of a field."""
 
-        mapping = {
-            "list": {"source": "child_ids", "custom": lambda user: user.id}
-        }
+        mapping = {"list": {"source": "child_ids", "custom": lambda user: user.id}}
 
         # Build 2 partners, 1 child of the other.
         record = self.env["res.partner"].create({"name": "a parent"})
-        self.env["res.partner"].create(
-            {"name": "a child", "parent_id": record.id}
-        )
+        self.env["res.partner"].create({"name": "a child", "parent_id": record.id})
         self.assertTrue(record.child_ids)
 
         # Export the record & check the child list.
-        self.assertEqual(
-            {"list": [record.child_ids.id]}, export(record, mapping)
-        )
+        self.assertEqual({"list": [record.child_ids.id]}, export(record, mapping))
 
         # Special case when the source field is empty; used to return null.
         record = self.env["res.partner"].create({"name": "my name"})
@@ -235,9 +207,7 @@
         record = self.env["res.partner"].create({"name": "my name"})
         self.assertEqual(
             {},
-            export(
-                record, {"name": {"source": "name", "custom": lambda s: SKIP}}
-            ),
+            export(record, {"name": {"source": "name", "custom": lambda s: SKIP}}),
         )
 
     def test_export_custom_with_relation_source(self):
@@ -255,9 +225,7 @@
         parent = self.env["res.partner"].create({"name": "the parent name"})
         record.parent_id = parent.id
 
-        self.assertEqual(
-            {"parent_name": "the parent name"}, export(record, mapping)
-        )
+        self.assertEqual({"parent_name": "the parent name"}, export(record, mapping))
 
     def test_export_nested_fields(self):
         mapping = {
diff --git a/tests/test_xbus_emitter_job.py b/tests/test_xbus_emitter_job.py
--- a/tests/test_xbus_emitter_job.py
+++ b/tests/test_xbus_emitter_job.py
@@ -27,9 +27,7 @@
     def test_0001_autovacuum(self):
         def past_dt(time_delta):
             return (
-                (datetime.now() - time_delta)
-                .replace(microsecond=0)
-                .isoformat(sep=" ")
+                (datetime.now() - time_delta).replace(microsecond=0).isoformat(sep=" ")
             )
 
         class_ = self.env["xbus.emitter.job"]
@@ -67,9 +65,7 @@
     def test_0002_autovacuum(self):
         def past_dt(time_delta):
             return (
-                (datetime.now() - time_delta)
-                .replace(microsecond=0)
-                .isoformat(sep=" ")
+                (datetime.now() - time_delta).replace(microsecond=0).isoformat(sep=" ")
             )
 
         class_ = self.env["xbus.emitter.job"]
diff --git a/views/assets.xml b/views/assets.xml
deleted file mode 100644
--- a/views/assets.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<odoo>
-    <!-- Include assets provided by this module. -->
-
-    <template
-        id="assets_backend"
-        name="xbus_emitter assets"
-        inherit_id="web.assets_backend"
-    >
-        <xpath expr="//script[last()]" position="after">
-            <script
-                type="text/javascript"
-                src="/xbus_emitter/static/src/js/debug_manager_xbus.js"
-            />
-        </xpath>
-    </template>
-</odoo>