diff --git a/dev/pylint/pre-commit b/dev/pylint/pre-commit index 905edc7c..19be55ef 100755 --- a/dev/pylint/pre-commit +++ b/dev/pylint/pre-commit @@ -1,2 +1,2 @@ #!/usr/bin/env bash -git-pylint-commit-hook --suppress-report --ignore=^dev --ignore=^setup --ignore=^config --ignore=^dmi --ignore=^ext/odoo --ignore=^ext/enterprise-addons --ignore=^ext/3rd-party-addons --ignore=/tests/ --always-show-violations +git-pylint-commit-hook --suppress-report --ignore=^ext/clarico-addons --ignore=^dev --ignore=^setup --ignore=^config --ignore=^dmi --ignore=^ext/odoo --ignore=^ext/enterprise-addons --ignore=^ext/3rd-party-addons --ignore=/tests/ --always-show-violations diff --git a/ext/3rd-party-addons/ir_rule_website/README.rst b/ext/3rd-party-addons/ir_rule_website/README.rst index b55252ef..60a00b41 100644 --- a/ext/3rd-party-addons/ir_rule_website/README.rst +++ b/ext/3rd-party-addons/ir_rule_website/README.rst @@ -8,12 +8,17 @@ Allows to use ``website_id`` (current website) in ``domain_force`` field of Reco * ``[('website_id', '=', website_id)]`` -Example of usage: +Example of usage: * Show a blog on specific websites only (TODO: add link to the module) * Show an event on specific websites only (TODO: add link to the module) * Show a product on specific websites only (TODO: add link to the module) +Known issues +============ + +* This module redefines ``ir.rule`` ``_compute_domain`` base method and may be not compatible with others that redefine the method too. + Odoo 12.0+ ========== diff --git a/ext/3rd-party-addons/ir_rule_website/__init__.py b/ext/3rd-party-addons/ir_rule_website/__init__.py index a0fdc10f..0650744f 100644 --- a/ext/3rd-party-addons/ir_rule_website/__init__.py +++ b/ext/3rd-party-addons/ir_rule_website/__init__.py @@ -1,2 +1 @@ -# -*- coding: utf-8 -*- from . import models diff --git a/ext/3rd-party-addons/ir_rule_website/__manifest__.py b/ext/3rd-party-addons/ir_rule_website/__manifest__.py index 05ec03fb..83c9cf90 100644 --- a/ext/3rd-party-addons/ir_rule_website/__manifest__.py +++ b/ext/3rd-party-addons/ir_rule_website/__manifest__.py @@ -1,11 +1,10 @@ -# -*- coding: utf-8 -*- { "name": """Multi-website support in Security Rules""", "summary": """Provide access depending on current website""", "category": "Access", # "live_test_url": "", "images": [], - "version": "1.0.0", + "version": "11.0.1.1.0", "application": False, "author": "IT-Projects LLC, Ildar Nasyrov", @@ -15,11 +14,13 @@ "price": 20.00, "currency": "EUR", + "" "depends": [ "base", ], "external_dependencies": {"python": [], "bin": []}, "data": [ + "views/ir_rule_views.xml", ], "qweb": [ ], diff --git a/ext/3rd-party-addons/ir_rule_website/doc/changelog.rst b/ext/3rd-party-addons/ir_rule_website/doc/changelog.rst index 9ee2b48b..19ea1ad2 100644 --- a/ext/3rd-party-addons/ir_rule_website/doc/changelog.rst +++ b/ext/3rd-party-addons/ir_rule_website/doc/changelog.rst @@ -1,3 +1,8 @@ +`1.1.0` +------- + +[ADD] - New setting in ``ir.rule`` model - to bypass website rules when working from backend + `1.0.0` ------- diff --git a/ext/3rd-party-addons/ir_rule_website/doc/index.rst b/ext/3rd-party-addons/ir_rule_website/doc/index.rst index 1a61c813..d62bfb4a 100644 --- a/ext/3rd-party-addons/ir_rule_website/doc/index.rst +++ b/ext/3rd-party-addons/ir_rule_website/doc/index.rst @@ -10,7 +10,30 @@ Installation Configuration ============= -This is a core technical module - no configurations are needed +* There is a new setting in each rule now - it is relevant only for website rules with special ``website_id`` parameter in them +* As usual open ``[[ Settings ]] >> Technical >> Security >> Record Rules`` to create a new rule or edit existing one +* You should see on rule form a new group named ``Multi-website extension`` with the ``Backend behaviour`` setting in it +* Leave this field empty if your rule has nothing to do with websites +* Select ``Grant access`` if you want to give access to model from backend, or ``Deny access`` - if you want to restrict +* Note: if you leave this fields empty for a rule that is using ``website_id`` parameter - you may have this kind of error when trying to configure your product's **website_ids** field from odoo backend: + +:: + + The requested operation cannot be completed due to security restrictions. Please contact your system administrator. + + (Document type: product.template, Operation: read) + +from web-interface, or + +:: + + INFO rw odoo.models: The requested operation cannot be completed due to record rules: Document type: product.template, Operation: read, Records: 47, User: 5 + +in odoo logs + +This is so because in backend rules work in non-website context. +In other words the setting is mandatory for website rules. + Usage ===== @@ -26,5 +49,6 @@ Usage Blogs available only for specifed websites [('website_ids', 'in', [website_id])] + true diff --git a/ext/3rd-party-addons/ir_rule_website/models/__init__.py b/ext/3rd-party-addons/ir_rule_website/models/__init__.py index 3605b081..fc1cd7bf 100644 --- a/ext/3rd-party-addons/ir_rule_website/models/__init__.py +++ b/ext/3rd-party-addons/ir_rule_website/models/__init__.py @@ -1,2 +1 @@ -# -*- coding: utf-8 -*- from . import ir_rule diff --git a/ext/3rd-party-addons/ir_rule_website/models/ir_rule.py b/ext/3rd-party-addons/ir_rule_website/models/ir_rule.py index f9626568..125d2edd 100644 --- a/ext/3rd-party-addons/ir_rule_website/models/ir_rule.py +++ b/ext/3rd-party-addons/ir_rule_website/models/ir_rule.py @@ -1,12 +1,20 @@ -# -*- coding: utf-8 -*- -from odoo import api, models, tools -from odoo.addons.base.ir.ir_rule import IrRule as IrRuleOriginal +from odoo import api, fields, models, tools, SUPERUSER_ID +from odoo.osv import expression +from odoo.tools.safe_eval import safe_eval class IrRule(models.Model): _inherit = 'ir.rule' + backend_behaviour = fields.Selection([ + ("true", "Grant access"), + ("false", "Deny access"), + ], string='Backend behaviour', + help="""This is bypass for main rule definition. + When working from backend there is usually no 'website_id' value in the rule evaluation context + and rules that using 'website_id' evaluated as False which is not always desirable""") + @api.model def _eval_context(self): context = super(IrRule, self)._eval_context() @@ -16,4 +24,44 @@ class IrRule(models.Model): @api.model @tools.ormcache_context('self._uid', 'model_name', 'mode', keys=["website_id"]) def _compute_domain(self, model_name, mode="read"): - return IrRuleOriginal._compute_domain.__wrapped__(self, model_name, mode=mode) + if mode not in self._MODES: + raise ValueError('Invalid mode: %r' % (mode,)) + + if self._uid == SUPERUSER_ID: + return None + + query = """ SELECT r.id FROM ir_rule r JOIN ir_model m ON (r.model_id=m.id) + WHERE m.model=%s AND r.active AND r.perm_{mode} + AND (r.id IN (SELECT rule_group_id FROM rule_group_rel rg + JOIN res_groups_users_rel gu ON (rg.group_id=gu.gid) + WHERE gu.uid=%s) + OR r.global) + """.format(mode=mode) + self._cr.execute(query, (model_name, self._uid)) + rule_ids = [row[0] for row in self._cr.fetchall()] + if not rule_ids: + return [] + + # browse user and rules as SUPERUSER_ID to avoid access errors! + eval_context = self._eval_context() + user_groups = self.env.user.groups_id + global_domains = [] # list of domains + group_domains = [] # list of domains + for rule in self.browse(rule_ids).sudo(): + # BEGIN redefined part of original _compute_domain of odoo/base/addons/ir/ir_rule. + # have to redefine all method to take in account new ir.rule ``backend_behaviour`` setting + dom = [] + if not eval_context.get('website_id') and rule.backend_behaviour: + dom = [(1, '=', 1)] if rule.backend_behaviour == 'true' else [(0, '=', 1)] + else: + # evaluate the domain for the current user + dom = safe_eval(rule.domain_force, eval_context) if rule.domain_force else [] + dom = expression.normalize_domain(dom) + # END redefined part of original _compute_domain + if not rule.groups: + global_domains.append(dom) + elif rule.groups & user_groups: + group_domains.append(dom) + + # combine global domains and group domains + return expression.AND(global_domains + [expression.OR(group_domains)]) diff --git a/ext/3rd-party-addons/ir_rule_website/tests/__init__.py b/ext/3rd-party-addons/ir_rule_website/tests/__init__.py index e254f1d6..4b916598 100644 --- a/ext/3rd-party-addons/ir_rule_website/tests/__init__.py +++ b/ext/3rd-party-addons/ir_rule_website/tests/__init__.py @@ -1,2 +1 @@ -# -*- coding: utf-8 -*- from . import test_compute_domain diff --git a/ext/3rd-party-addons/ir_rule_website/tests/test_compute_domain.py b/ext/3rd-party-addons/ir_rule_website/tests/test_compute_domain.py index 7a4ae46a..9622cdbc 100644 --- a/ext/3rd-party-addons/ir_rule_website/tests/test_compute_domain.py +++ b/ext/3rd-party-addons/ir_rule_website/tests/test_compute_domain.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from openerp.tests.common import TransactionCase diff --git a/ext/3rd-party-addons/ir_rule_website/views/ir_rule_views.xml b/ext/3rd-party-addons/ir_rule_website/views/ir_rule_views.xml new file mode 100644 index 00000000..ea3a462e --- /dev/null +++ b/ext/3rd-party-addons/ir_rule_website/views/ir_rule_views.xml @@ -0,0 +1,15 @@ + + + + ir.rule.form.inherit.ir_rule_website + ir.rule + + + + + + + + + + diff --git a/ext/3rd-party-addons/website_multi_company/README.rst b/ext/3rd-party-addons/website_multi_company/README.rst index a6e27455..a87912ed 100644 --- a/ext/3rd-party-addons/website_multi_company/README.rst +++ b/ext/3rd-party-addons/website_multi_company/README.rst @@ -39,10 +39,6 @@ Multi-Theme Roadmap ======= -* Currently, all websites share the same footer. Posible solution: add field to ``res.company`` or ``website`` model and use that in template, e.g.:: - -
- * TODO: Create website.theme record automatically after theme installation (probably via inheriting ``button_install`` method) Credits diff --git a/ext/3rd-party-addons/website_multi_company/__manifest__.py b/ext/3rd-party-addons/website_multi_company/__manifest__.py index e1bd7f54..6a09836a 100644 --- a/ext/3rd-party-addons/website_multi_company/__manifest__.py +++ b/ext/3rd-party-addons/website_multi_company/__manifest__.py @@ -1,11 +1,12 @@ -# -*- coding: utf-8 -*- +# Copyright 2017-2018 Ivan Yelizariev +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). { "name": """Real Multi Website""", "summary": """Yes, you can set up multi-company, multi-website, multi-theme, multi-eCommerce on a single database!""", "category": "eCommerce", "live_test_url": "http://apps.it-projects.info/shop/product/website-multi-company?version=11.0", "images": ['images/website_multi_company_main.png'], - "version": "1.2.3", + "version": "11.0.1.2.4", "application": False, "author": "IT-Projects LLC, Ivan Yelizariev, Nicolas JEUDY", diff --git a/ext/3rd-party-addons/website_multi_company/controllers/main.py b/ext/3rd-party-addons/website_multi_company/controllers/main.py index 3fe6be09..ac37a0ed 100644 --- a/ext/3rd-party-addons/website_multi_company/controllers/main.py +++ b/ext/3rd-party-addons/website_multi_company/controllers/main.py @@ -1,4 +1,6 @@ -# -*- coding: utf-8 -*- +# Copyright 2018 Ivan Yelizariev +# Copyright 2018 Ildar Nasyrov +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from odoo.http import request from odoo.addons.website_sale.controllers.main import WebsiteSale @@ -10,4 +12,4 @@ class WebsiteSaleExtended(WebsiteSale): company = request.website.company_id if not company: return domain - return [('company_id', '=', company.id)] + domain + return ['|', ('company_id', '=', company.id), ('company_id', '=', False)] + domain diff --git a/ext/3rd-party-addons/website_multi_company/doc/changelog.rst b/ext/3rd-party-addons/website_multi_company/doc/changelog.rst index 4835ca98..7a2ac249 100644 --- a/ext/3rd-party-addons/website_multi_company/doc/changelog.rst +++ b/ext/3rd-party-addons/website_multi_company/doc/changelog.rst @@ -1,3 +1,8 @@ +`1.2.4` +------- + +- **ADD:** Product with no company defined is allowed for all websites + `1.2.3` ------- diff --git a/ext/3rd-party-addons/website_multi_company/doc/index.rst b/ext/3rd-party-addons/website_multi_company/doc/index.rst index f872838a..2b4d456d 100644 --- a/ext/3rd-party-addons/website_multi_company/doc/index.rst +++ b/ext/3rd-party-addons/website_multi_company/doc/index.rst @@ -2,6 +2,9 @@ Real Multi Website ==================== +.. contents:: + :local: + Installation ============ @@ -64,7 +67,7 @@ session information. There are two ways to do it: In the latter case ``dbfilter`` is usually used, though it's not flexible enough. -using dbfilter parameter +Using dbfilter parameter ~~~~~~~~~~~~~~~~~~~~~~~~ For TESTING purpose you can use the following configuration: @@ -77,7 +80,7 @@ For TESTING purpose you can use the following configuration: * example.shop2.local * example.shop3.local -patching http.py +Patching http.py ~~~~~~~~~~~~~~~~ For PRODUCTION deployment with websites on subdomains you can use following patch. You need to update odoo/http.py file as following:: @@ -112,7 +115,7 @@ Then you can use following configuration * shop2.example.org * shop3.example.org -using dbfilter_from_header module +Using dbfilter_from_header module ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Most flexible way to deploy multi-database system is using `dbfilter_from_header `__ (check module description for installation instruction). @@ -181,6 +184,16 @@ Example (we use top level domain ``.example`` due to copyright issues, but it co } } +Odoo.sh deployment +------------------ + +In the manager of your domain name registrar you need to add CNAME records for your domains (subdomains), for example: + +* Create a CNAME record ``shop1.example.org`` pointing to .odoo.com +* Create a CNAME record ``shop2.example.org`` pointing to .odoo.com +* Create a CNAME record ``example.com`` pointing to .odoo.com + +Similar for dev and staging database, but use corresponding domain in odoo.com, e.g. ``mywebsite-master-staging-12345689.dev.odoo.com`` Apache:: @@ -214,7 +227,6 @@ Apache:: - Configuration ============= @@ -246,6 +258,13 @@ After installing theme, navigate to ``[[ Website ]] >> Configuration >> Multi-Th If you get error *The style compilation failed*, add modules to **Dependencies** field. It allows to attach theme-like dependencies to corresponding theme and prevent themes compatibility problems. +Note: themes that depend on ``theme_common`` don't work in demo installation. To avoid this, you have to create database without demo data or comment out demo files in ``__manifest__.py`` file of ``theme_common`` module like this:: + + 'demo': [ + # 'demo/demo.xml', + ], + + Usage ===== @@ -275,7 +294,7 @@ Steps for eCommerce * use ``[Action] -> Duplicate`` button * don't forget to click ``[Unpublished On Website]`` button to activate it -* open ``[[ Sales ]] >> Products`` and create product per each company if they don't exist +* open ``[[ Sales ]] >> Products`` and create product per each company if they don't exist. If a product doesn't belong to any company (i.e. "Company" field is empty), this product will be available on each website you created. * open HOST1/shop, make order, open backend -- created order belongs to COMPANY1 * open HOST2/shop, make order, open backend -- created order belongs to COMPANY2 diff --git a/ext/3rd-party-addons/website_multi_company/models/mail_template.py b/ext/3rd-party-addons/website_multi_company/models/mail_template.py index cc61a4d5..05200a2d 100644 --- a/ext/3rd-party-addons/website_multi_company/models/mail_template.py +++ b/ext/3rd-party-addons/website_multi_company/models/mail_template.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- import logging from odoo import models, api diff --git a/ext/3rd-party-addons/website_multi_company/models/module.py b/ext/3rd-party-addons/website_multi_company/models/module.py index 7be68f50..78c6ac87 100644 --- a/ext/3rd-party-addons/website_multi_company/models/module.py +++ b/ext/3rd-party-addons/website_multi_company/models/module.py @@ -1,5 +1,9 @@ +# Copyright 2018 Ivan Yelizariev +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + from odoo import models, api + BASE_MODULES = ['website_blog', 'website_sale_comparison', 'website_sale_wishlist', 'web_settings_dashboard', 'website_crm', 'website_animate', 'website_mass_mailing', 'contacts', 'fetchmail', 'resource', 'calendar', 'snippet_google_map'] @@ -14,16 +18,16 @@ class Module(models.Model): return super(Module, self)._search(args, offset, limit, order, count, access_rights_uid) @api.model - def _theme_dependencies_domain(self, theme_name): - """Computes domain for dependencies of the theme, but without built-in dependencies""" + def _search_theme_dependencies(self, theme_name): + """Search dependencies of the theme, but without built-in dependencies""" if not theme_name: - return [] + return self self = self.with_context(search_theme_dependencies=False) theme = self.search([('name', '=', theme_name)]) if not theme: - return [] + return self deps = theme.upstream_dependencies(exclude_states=('to remove')) base_modules = self.search([('name', 'in', BASE_MODULES)]) @@ -31,4 +35,4 @@ class Module(models.Model): deps -= base_modules deps -= base_deps - return [('id', 'in', deps.ids)] + return self.search([('id', 'in', deps.ids)]) diff --git a/ext/3rd-party-addons/website_multi_company/models/res_users.py b/ext/3rd-party-addons/website_multi_company/models/res_users.py index a431cb9a..a7c12350 100644 --- a/ext/3rd-party-addons/website_multi_company/models/res_users.py +++ b/ext/3rd-party-addons/website_multi_company/models/res_users.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from odoo import models, api diff --git a/ext/3rd-party-addons/website_multi_company/models/website.py b/ext/3rd-party-addons/website_multi_company/models/website.py index 2cfb6298..2f417f3e 100644 --- a/ext/3rd-party-addons/website_multi_company/models/website.py +++ b/ext/3rd-party-addons/website_multi_company/models/website.py @@ -1,7 +1,9 @@ -# -*- coding: utf-8 -*- +# Copyright 2017 Ivan Yelizariev +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + import logging -from odoo import models +from odoo import models, api _logger = logging.getLogger(__name__) @@ -9,5 +11,23 @@ _logger = logging.getLogger(__name__) class Website(models.Model): _inherit = "website" + @api.multi def multi_theme_reload(self): - self.env['res.config.settings'].multi_theme_reload() + self.ensure_one() + + # convert_assets and copy views for current website + self._multi_theme_activate() + + @api.multi + def multi_theme_reload_list(self): + # only reloads list + self.env["website.theme"].search([])._convert_assets() + + @api.multi + def _multi_theme_activate(self): + if not self.env.context.get('skip_converting_assets'): + # reload dependencies before activating + self.mapped('multi_theme_id')\ + .upstream_dependencies()\ + ._convert_assets() + return super(Website, self)._multi_theme_activate() diff --git a/ext/3rd-party-addons/website_multi_company/models/website_menu.py b/ext/3rd-party-addons/website_multi_company/models/website_menu.py index ce671eb0..61d1d934 100644 --- a/ext/3rd-party-addons/website_multi_company/models/website_menu.py +++ b/ext/3rd-party-addons/website_multi_company/models/website_menu.py @@ -1,4 +1,5 @@ -# -*- coding: utf-8 -*- +# Copyright 2017 Ivan Yelizariev +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from odoo import models, api diff --git a/ext/3rd-party-addons/website_multi_company/models/website_theme.py b/ext/3rd-party-addons/website_multi_company/models/website_theme.py index da9a619d..f80b6dea 100644 --- a/ext/3rd-party-addons/website_multi_company/models/website_theme.py +++ b/ext/3rd-party-addons/website_multi_company/models/website_theme.py @@ -1,5 +1,9 @@ +# Copyright 2018 Ivan Yelizariev +# Copyright 2018 Ildar Nasyrov +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). + import logging -from odoo import models, fields +from odoo import models, fields, api _logger = logging.getLogger(__name__) @@ -12,59 +16,44 @@ class WebsiteTheme(models.Model): string="Theme's technical name", help="") - dependency_ids = fields.Many2many( - 'ir.module.module', - string="Dependencies", - help='Theme-like dependencies. Add modules here if you got error "The style compilation failed".') - + @api.multi def _convert_assets(self): """Generate assets for converted themes""" - Asset = self.env["website.theme.asset"] - for one in self.filtered("converted_theme_addon"): - # Get all views owned by the converted theme addon - refs = self.env["ir.model.data"].search([ - ("module", "in", [one.converted_theme_addon] + one.dependency_ids.mapped('name')), - ("model", "=", "ir.ui.view"), - ]) - existing = frozenset(one.mapped("asset_ids.name")) - expected = frozenset(refs.mapped("complete_name")) - dangling = tuple(existing - expected) - # Create a new asset for each theme view - for ref in expected - existing: - view = self.env.ref(ref, raise_if_not_found=False) - if view and (view.type != 'qweb' or not view.inherit_id): - # Skip non-qweb (backend) views + for one in self: + assets_before = one.asset_ids + super(WebsiteTheme, one)._convert_assets() + assets_after = one.asset_ids + if not assets_before and assets_after: + # new theme: update dependencies + one.write(one._autofill_deps()) - # Skip views without inherit_id, because those have new - # template definition only and after appliying multi-theme - # for several websites it will be copied and then it leads - # to error on compilation when any template with -- expected singleton - continue + @api.multi + def _autofill_deps(self): + self.ensure_one() + modules = self\ + .env['ir.module.module']\ + ._search_theme_dependencies( + self.converted_theme_addon + ).mapped('name') - _logger.debug("Creating asset %s for theme %s", ref, one.name) + existing_themes = self.search([ + ('converted_theme_addon', 'in', modules) + ]).mapped('converted_theme_addon') + new_themes = set(modules) - set(existing_themes) + for converted_theme_addon in new_themes: + self.create({ + 'name': converted_theme_addon, + 'converted_theme_addon': converted_theme_addon, + }) + themes = self.search([('converted_theme_addon', 'in', modules)]) + try: + themes |= self.env.ref('website_multi_theme.theme_default') + except: + pass + return { + 'dependency_ids': [(6, 0, themes.ids)], + } - priority = 10 - if view.model_data_id.module == one.converted_theme_addon: - # make less priority to apply views after all deps - priority = 100 - - one.asset_ids |= Asset.new({ - "name": ref, - 'priority': priority, - }) - # Delete all dangling assets - if dangling: - _logger.debug( - "Removing dangling assets for theme %s: %s", - one.name, dangling) - Asset.search([("name", "in", dangling)]).unlink() - # Turn all assets multiwebsite-only - Asset._find_and_deactivate_views() - - -class WebsiteThemeAsset(models.Model): - _inherit = "website.theme.asset" - _order = 'priority,id' - - priority = fields.Integer() + @api.onchange('converted_theme_addon') + def onchange_converted_theme_addon(self): + self.update(self._autofill_deps()) diff --git a/ext/3rd-party-addons/website_multi_company/views/res_config_views.xml b/ext/3rd-party-addons/website_multi_company/views/res_config_views.xml index fc57445b..0ca50713 100644 --- a/ext/3rd-party-addons/website_multi_company/views/res_config_views.xml +++ b/ext/3rd-party-addons/website_multi_company/views/res_config_views.xml @@ -6,10 +6,11 @@ - 1 + - - Default Website + + Reload Theme List & Update all websites + {'skip_converting_assets': True} diff --git a/ext/3rd-party-addons/website_multi_company/views/website_theme_views.xml b/ext/3rd-party-addons/website_multi_company/views/website_theme_views.xml index 666b70ea..90815155 100644 --- a/ext/3rd-party-addons/website_multi_company/views/website_theme_views.xml +++ b/ext/3rd-party-addons/website_multi_company/views/website_theme_views.xml @@ -9,8 +9,14 @@ - - + + + @@ -21,7 +27,7 @@ website.theme.tree website.theme - + diff --git a/ext/3rd-party-addons/website_multi_company/views/website_views.xml b/ext/3rd-party-addons/website_multi_company/views/website_views.xml index 8062e8e0..8305aedf 100644 --- a/ext/3rd-party-addons/website_multi_company/views/website_views.xml +++ b/ext/3rd-party-addons/website_multi_company/views/website_views.xml @@ -10,12 +10,21 @@