diff --git a/odoo/addons/base/models/assetsbundle.py b/odoo/addons/base/models/assetsbundle.py index 77ace9a9a01..c6e483d372b 100644 --- a/odoo/addons/base/models/assetsbundle.py +++ b/odoo/addons/base/models/assetsbundle.py @@ -118,7 +118,7 @@ class AssetsBundle(object): css_attachments = self.css(is_minified=not self.is_debug_assets) or [] for attachment in css_attachments: if self.is_debug_assets: - href = self.get_debug_asset_url(extra='rtl' if self.rtl else 'ltr', + href = self.get_debug_asset_url(extra=self.extra('css'), name=css_attachments.name, extension='') else: @@ -189,7 +189,15 @@ class AssetsBundle(object): for fpath in to_delete: attachments._file_delete(fpath) - def clean_attachments(self, extension, keep_url): + def extra(self, extension): + if self.is_css(extension): + return 'rtl' if self.rtl else 'ltr' + return '-' + + def is_css(self, extension): + return extension in ['css', 'min.css', 'css.map'] + + def clean_attachments(self, extension, keep_url, extra): """ Takes care of deleting any outdated ir.attachment records associated to a bundle before saving a fresh one. @@ -200,15 +208,16 @@ class AssetsBundle(object): must exclude the current bundle. """ ira = self.env['ir.attachment'] - is_css = extension in ['css', 'min.css', 'css.map'] to_clean_pattern = self.get_asset_url( - extra='rtl' if is_css and self.rtl else 'ltr' if is_css else '-', + unique='%', + extra=extra, name=self.name, extension=extension, ) domain = [ ('url', '=like', to_clean_pattern), - ('url', '!=', keep_url) + ('url', '!=', keep_url), + ('public', '=', True), ] attachments = ira.sudo().search(domain) # avoid to invalidate cache if it's already empty (mainly useful for test) @@ -233,9 +242,8 @@ class AssetsBundle(object): else: the url contains a version equal to that of the self.get_version(type) => web/assets/self.get_version(type)/name.extension. """ - is_css = extension in ['css', 'min.css', 'css.map'] - unique = "%" if ignore_version else self.get_version('css' if is_css else 'js') - extra = 'rtl' if is_css and self.rtl else 'ltr' if is_css else '-' + unique = "%" if ignore_version else self.get_version('css' if self.is_css(extension) else 'js') + extra = self.extra(extension) url_pattern = self.get_asset_url( unique=unique, extra=extra, # not sure about css.map @@ -318,16 +326,17 @@ class AssetsBundle(object): # and allow to only clear the current direction bundle # (this applies to css bundles only) fname = '%s.%s' % (self.name, extension) - is_css = extension in ['css', 'min.css', 'css.map'] mimetype = ( 'text/css' if extension in ['css', 'min.css'] else 'text/xml' if extension in ['xml', 'min.xml'] else 'application/json' if extension in ['js.map', 'css.map'] else 'application/javascript' ) + extra = self.extra(extension) + unique = self.get_version('css' if self.is_css(extension) else 'js') url = self.get_asset_url( - unique=self.get_version('css' if is_css else 'js'), - extra='rtl' if is_css and self.rtl else 'ltr' if is_css else '-', + unique=unique, + extra=extra, name=self.name, extension=extension, ) @@ -347,7 +356,7 @@ class AssetsBundle(object): if self.env.context.get('commit_assetsbundle') is True: self.env.cr.commit() - self.clean_attachments(extension, url) + self.clean_attachments(extension, url, extra) # For end-user assets (common and backend), send a message on the bus # to invite the user to refresh their browser @@ -355,7 +364,7 @@ class AssetsBundle(object): self.env['bus.bus']._sendone('broadcast', 'bundle_changed', { 'server_version': release.version # Needs to be dynamically imported }) - _logger.debug('Asset Changed: bundle: %s -- version: %s', self.name, self.get_version('css' if is_css else 'js')) + _logger.debug('Asset Changed: bundle: %s -- version: %s', self.name, unique) return attachment @@ -599,7 +608,7 @@ class AssetsBundle(object): sourcemap_attachment = self.get_attachments('css.map') \ or self.save_attachment('css.map', '') debug_asset_url = self.get_debug_asset_url(name=self.name, - extra='rtl' if self.rtl else 'ltr') + extra=self.extra('css')) generator = SourceMapGenerator( source_root="/".join( [".." for i in range(0, len(debug_asset_url.split("/")) - 2)] @@ -767,7 +776,6 @@ class AssetsBundle(object): class WebAsset(object): - html_url_format = '%s' _content = None _filename = None _ir_attach = None @@ -778,7 +786,6 @@ class WebAsset(object): self.inline = inline self._filename = filename self.url = url - self.html_url_args = url self._last_modified = last_modified if not inline and not url: raise Exception("An asset should either be inlined or url linked, defined in bundle '%s'" % bundle.name) @@ -796,10 +803,6 @@ class WebAsset(object): def name(self): return '' if self.inline else self.url - @property - def html_url(self): - return self.html_url_format % self.html_url_args - def stat(self): if not (self.inline or self._filename or self._ir_attach): try: @@ -966,10 +969,6 @@ class StylesheetAsset(WebAsset): def __init__(self, *args, rtl=False, **kw): self.rtl = rtl super().__init__(*args, **kw) - if self.rtl and self.url: - self.html_url_args = self.url.rsplit('.', 1) - self.html_url_format = '%%s/%s/%s.%%s' % ('rtl', self.bundle.name) - self.html_url_args = tuple(self.html_url_args) @property def bundle_version(self): @@ -1024,11 +1023,6 @@ class StylesheetAsset(WebAsset): class PreprocessedCSS(StylesheetAsset): rx_import = None - def __init__(self, *args, **kw): - super().__init__(*args, **kw) - self.html_url_args = tuple(self.url.rsplit('/', 1)) - self.html_url_format = '%%s/%s%s/%%s.css' % ('rtl' if self.rtl else 'ltr', self.bundle.name) - def get_command(self): raise NotImplementedError