diff --git a/muk_utils/__manifest__.py b/muk_utils/__manifest__.py index f985f1a..2041041 100644 --- a/muk_utils/__manifest__.py +++ b/muk_utils/__manifest__.py @@ -20,7 +20,7 @@ { "name": "MuK Utils", "summary": """Utility Features""", - "version": '12.0.1.1.8', + "version": '12.0.1.1.9', "category": 'Extra Tools', "license": "AGPL-3", "author": "MuK IT", diff --git a/muk_utils/models/__init__.py b/muk_utils/models/__init__.py index 473763a..86fe98b 100644 --- a/muk_utils/models/__init__.py +++ b/muk_utils/models/__init__.py @@ -19,5 +19,6 @@ from . import mixins_groups from . import ir_attachment +from . import scss_editor from . import res_config_settings diff --git a/muk_utils/models/scss_editor.py b/muk_utils/models/scss_editor.py new file mode 100644 index 0000000..ecc2b3f --- /dev/null +++ b/muk_utils/models/scss_editor.py @@ -0,0 +1,113 @@ +################################################################################### +# +# Copyright (C) 2017 MuK IT GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +import re +import uuid +import base64 + +from odoo import models, fields, api +from odoo.modules import module + +class ScssEditor(models.AbstractModel): + + _name = 'muk_utils.scss_editor' + _description = 'Scss Editor' + + #---------------------------------------------------------- + # Helper + #---------------------------------------------------------- + + def _build_custom_url(self, url_parts, xmlid): + return "%s.custom.%s.%s" % (url_parts[0], xmlid, url_parts[1]) + + def _get_custom_url(self, url, xmlid): + return self._build_custom_url(url.rsplit(".", 1), xmlid) + + def _get_custom_attachment(self, url): + return self.env["ir.attachment"].with_context( + bin_size=False, bin_size_datas=False + ).search([("url", '=', url)]) + + def _get_variable(self, content, variable): + regex = r'{0}\:?\s(.*?);'.format(variable) + value = re.search(regex, content) + return value and value.group(1) + + def _get_variables(self, content, variables): + return {var: self._get_variable(content, var) for var in variables} + + #---------------------------------------------------------- + # Read + #---------------------------------------------------------- + + def get_value(self, url, xmlid, variables): + custom_url = self._get_custom_url(url, xmlid) + custom_attachment = self._get_custom_attachment(custom_url) + if custom_attachment.exists(): + content = str(base64.b64decode(custom_attachment.datas)) + return self._get_variables(content, variables) + else: + match = re.compile("^/(\w+)/(.+?)(\.custom\.(.+))?\.(\w+)$").match(url) + module_path = module.get_module_path(match.group(1)) + resource_path = "%s.%s" % (match.group(2), match.group(5)) + module_resource_path = module.get_resource_path(module_path, resource_path) + with open(module_resource_path, "rb") as file: + return self._get_variables(str(file.read()), variables) + + #---------------------------------------------------------- + # Write + #---------------------------------------------------------- + + def replace_content(self, url, xmlid, content): + custom_url = self._get_custom_url(url, xmlid) + custom_attachment = self._get_custom_attachment(custom_url) + datas = base64.b64encode((content or "\n").encode("utf-8")) + if custom_attachment.exists(): + custom_attachment.write({"datas": datas}) + else: + self.env["ir.attachment"].create({ + 'name': custom_url, + 'type': "binary", + 'mimetype': "text/scss", + 'datas': datas, + 'datas_fname': url.split("/")[-1], + 'url': custom_url, + }) + view_to_xpath = self.env["ir.ui.view"].get_related_views( + xmlid, bundles=True + ).filtered(lambda v: v.arch.find(url) >= 0) + self.env["ir.ui.view"].create({ + 'name': custom_url, + 'key': 'web_editor.scss_%s' % str(uuid.uuid4())[:6], + 'mode': "extension", + 'inherit_id': view_to_xpath.id, + 'arch': """ + + + %(new_url)s + + + """ % { + 'inherit_xml_id': view_to_xpath.xml_id, + 'name': custom_url, + 'url_to_replace': url, + 'new_url': custom_url, + } + }) + self.env["ir.qweb"].clear_caches() \ No newline at end of file