summaryrefslogtreecommitdiff
path: root/odoo
diff options
context:
space:
mode:
authorAdrian Torres <adt@odoo.com>2018-07-11 13:06:00 +0200
committerGitHub <noreply@github.com>2018-07-11 13:06:00 +0200
commitc002e2eb379e8a3db90b45269f8ff2b7e246c8b2 (patch)
treec4f737ce584d60d73cceadbc7e21ab06ab9c3997 /odoo
parent5bf5d45b7d1ac381a1419c010352e56b79515599 (diff)
[IMP] allow installing demo data post db init
Intended for demo / throwaway databases only Task-ID: 1856493
Diffstat (limited to 'odoo')
-rw-r--r--odoo/addons/base/__manifest__.py1
-rw-r--r--odoo/addons/base/data/ir_demo_data.xml23
-rw-r--r--odoo/addons/base/models/__init__.py3
-rw-r--r--odoo/addons/base/models/ir_demo.py15
-rw-r--r--odoo/modules/loading.py121
5 files changed, 117 insertions, 46 deletions
diff --git a/odoo/addons/base/__manifest__.py b/odoo/addons/base/__manifest__.py
index 9caa89917c1..99f634350e2 100644
--- a/odoo/addons/base/__manifest__.py
+++ b/odoo/addons/base/__manifest__.py
@@ -20,6 +20,7 @@ The kernel of Odoo, needed for all installation.
'data/report_paperformat_data.xml',
'data/res_currency_data.xml',
'data/res_country_data.xml',
+ 'data/ir_demo_data.xml',
'security/base_groups.xml',
'security/base_security.xml',
'views/base_menus.xml',
diff --git a/odoo/addons/base/data/ir_demo_data.xml b/odoo/addons/base/data/ir_demo_data.xml
new file mode 100644
index 00000000000..e108590147a
--- /dev/null
+++ b/odoo/addons/base/data/ir_demo_data.xml
@@ -0,0 +1,23 @@
+<odoo>
+ <record model="ir.actions.act_window" id="demo_force_install_action">
+ <field name="name">Load demo data</field>
+ <field name="res_model">ir.demo</field>
+ <field name="view_mode">form</field>
+ <field name="target">new</field>
+ </record>
+
+ <record model="ir.ui.view" id="demo_force_install_form">
+ <field name="name">ir.demo.form</field>
+ <field name="model">ir.demo</field>
+ <field name="arch" type="xml">
+ <form>
+ <p>Demo data should only be used on test databases. Once they are loaded, they cannot be removed.</p>
+ <p>Are you sure you want to load demo data?</p>
+ <footer>
+ <button name="install_demo" string="Load demo data" type="object" class="btn-primary"/>
+ <button special="cancel" string="Discard" class="btn-default"/>
+ </footer>
+ </form>
+ </field>
+ </record>
+</odoo>
diff --git a/odoo/addons/base/models/__init__.py b/odoo/addons/base/models/__init__.py
index 59d125ab30e..4506929a5c5 100644
--- a/odoo/addons/base/models/__init__.py
+++ b/odoo/addons/base/models/__init__.py
@@ -27,6 +27,7 @@ from . import ir_http
from . import ir_logging
from . import ir_property
from . import ir_module
+from . import ir_demo
from . import report_paperformat
from . import res_country
from . import res_lang
@@ -35,4 +36,4 @@ from . import res_bank
from . import res_config
from . import res_currency
from . import res_company
-from . import res_users \ No newline at end of file
+from . import res_users
diff --git a/odoo/addons/base/models/ir_demo.py b/odoo/addons/base/models/ir_demo.py
new file mode 100644
index 00000000000..34e4292be28
--- /dev/null
+++ b/odoo/addons/base/models/ir_demo.py
@@ -0,0 +1,15 @@
+from odoo import models
+from odoo.modules.loading import force_demo
+
+
+class IrDemo(models.TransientModel):
+
+ _name = 'ir.demo'
+
+ def install_demo(self):
+ force_demo(self.env.cr)
+ return {
+ 'type': 'ir.actions.act_url',
+ 'target': 'self',
+ 'url': '/web',
+ }
diff --git a/odoo/modules/loading.py b/odoo/modules/loading.py
index 6e123324635..d8ff0812866 100644
--- a/odoo/modules/loading.py
+++ b/odoo/modules/loading.py
@@ -25,30 +25,15 @@ _logger = logging.getLogger(__name__)
_test_logger = logging.getLogger('odoo.tests')
-def load_module_graph(cr, graph, status=None, perform_checks=True,
- skip_modules=None, report=None, models_to_check=None):
- """Migrates+Updates or Installs all module nodes from ``graph``
- :param graph: graph of module nodes to load
- :param status: deprecated parameter, unused, left to avoid changing signature in 8.0
- :param perform_checks: whether module descriptors should be checked for validity (prints warnings
- for same cases)
- :param skip_modules: optional list of module names (packages) which have previously been loaded and can be skipped
- :return: list of modules that were installed or updated
+def load_data(cr, idref, mode, kind, package, report):
"""
- def load_test(module_name, idref, mode):
- cr.commit()
- try:
- _load_data(cr, module_name, idref, mode, 'test')
- return True
- except Exception:
- _test_logger.exception(
- 'module %s: an exception occurred in a test', module_name)
- return False
- finally:
- cr.rollback()
- # avoid keeping stale xml_id, etc. in cache
- odoo.registry(cr.dbname).clear_caches()
+ kind: data, demo, test, init_xml, update_xml, demo_xml.
+
+ noupdate is False, unless it is demo data or it is csv data in
+ init mode.
+
+ """
def _get_files_of_kind(kind):
if kind == 'demo':
@@ -72,27 +57,74 @@ def load_module_graph(cr, graph, status=None, perform_checks=True,
)
return files
- def _load_data(cr, module_name, idref, mode, kind):
- """
+ try:
+ if kind in ('demo', 'test'):
+ threading.currentThread().testing = True
+ for filename in _get_files_of_kind(kind):
+ _logger.info("loading %s/%s", package.name, filename)
+ noupdate = False
+ if kind in ('demo', 'demo_xml') or (filename.endswith('.csv') and kind in ('init', 'init_xml')):
+ noupdate = True
+ tools.convert_file(cr, package.name, filename, idref, mode, noupdate, kind, report)
+ finally:
+ if kind in ('demo', 'test'):
+ threading.currentThread().testing = False
+
- kind: data, demo, test, init_xml, update_xml, demo_xml.
+def load_demo(cr, package, idref, mode, report=None):
+ """
+ Loads demo data for the specified package.
+ """
+ has_demo = hasattr(package, 'demo') or (package.dbdemo and package.state != 'installed')
+ if has_demo:
+ load_data(cr, idref, mode, kind='demo', package=package, report=report)
+ return has_demo
+
+
+def force_demo(cr):
+ """
+ Forces the `demo` flag on all modules, and installs demo data for all installed modules.
+ """
+ graph = odoo.modules.graph.Graph()
+ cr.execute(
+ "SELECT name FROM ir_module_module WHERE state IN ('installed', 'to upgrade', 'to remove')"
+ )
+ module_list = [name for (name,) in cr.fetchall()]
+ graph.add_modules(cr, module_list, ['demo'])
+
+ for package in graph:
+ load_demo(cr, package, {}, 'init')
+
+ cr.execute('update ir_module_module set demo=%s', (True,))
+ env = api.Environment(cr, SUPERUSER_ID, {})
+ env['ir.module.module'].invalidate_cache(['demo'])
+ cr.commit()
- noupdate is False, unless it is demo data or it is csv data in
- init mode.
- """
+def load_module_graph(cr, graph, status=None, perform_checks=True,
+ skip_modules=None, report=None, models_to_check=None):
+ """Migrates+Updates or Installs all module nodes from ``graph``
+ :param graph: graph of module nodes to load
+ :param status: deprecated parameter, unused, left to avoid changing signature in 8.0
+ :param perform_checks: whether module descriptors should be checked for validity (prints warnings
+ for same cases)
+ :param skip_modules: optional list of module names (packages) which have previously been loaded and can be skipped
+ :return: list of modules that were installed or updated
+ """
+ def load_test(idref, mode):
+ nonlocal package
+ cr.commit()
try:
- if kind in ('demo', 'test'):
- threading.currentThread().testing = True
- for filename in _get_files_of_kind(kind):
- _logger.info("loading %s/%s", module_name, filename)
- noupdate = False
- if kind in ('demo', 'demo_xml') or (filename.endswith('.csv') and kind in ('init', 'init_xml')):
- noupdate = True
- tools.convert_file(cr, module_name, filename, idref, mode, noupdate, kind, report)
+ load_data(cr, idref, mode, 'test', package, report)
+ return True
+ except Exception:
+ _test_logger.exception(
+ 'module %s: an exception occurred in a test', package.name)
+ return False
finally:
- if kind in ('demo', 'test'):
- threading.currentThread().testing = False
+ cr.rollback()
+ # avoid keeping stale xml_id, etc. in cache
+ odoo.registry(cr.dbname).clear_caches()
if models_to_check is None:
models_to_check = set()
@@ -172,13 +204,12 @@ def load_module_graph(cr, graph, status=None, perform_checks=True,
if perform_checks:
module._check()
- if package.state=='to upgrade':
+ if package.state == 'to upgrade':
# upgrading the module information
module.write(module.get_values_from_terp(package.data))
- _load_data(cr, module_name, idref, mode, kind='data')
- has_demo = hasattr(package, 'demo') or (package.dbdemo and package.state != 'installed')
- if has_demo:
- _load_data(cr, module_name, idref, mode, kind='demo')
+ load_data(cr, idref, mode, kind='data', package=package, report=report)
+ demo_loaded = load_demo(cr, package, idref, mode, report)
+ if demo_loaded:
cr.execute('update ir_module_module set demo=%s where id=%s', (True, module_id))
module.invalidate_cache(['demo'])
@@ -199,11 +230,11 @@ def load_module_graph(cr, graph, status=None, perform_checks=True,
# validate all the views at a whole
env['ir.ui.view']._validate_module_views(module_name)
- if has_demo:
+ if demo_loaded:
# launch tests only in demo mode, allowing tests to use demo data.
if tools.config.options['test_enable']:
# Yamel test
- report.record_result(load_test(module_name, idref, mode))
+ report.record_result(load_test(idref, mode))
# Python tests
env['ir.http']._clear_routing_map() # force routing map to be rebuilt
report.record_result(odoo.modules.module.run_unit_tests(module_name, cr.dbname))