[ADD] Support for ir.attachments in assets bundles

bzr revid: fme@openerp.com-20140505160953-yk6688ey7eoz5579
This commit is contained in:
Fabien Meghazi 2014-05-05 18:09:53 +02:00
parent 9ca54d43ca
commit 540b753bf8
1 changed files with 30 additions and 26 deletions

View File

@ -23,9 +23,11 @@ import openerp.http
import openerp.tools import openerp.tools
import openerp.tools.func import openerp.tools.func
import openerp.tools.lru import openerp.tools.lru
from openerp.http import request
from openerp.tools.safe_eval import safe_eval as eval from openerp.tools.safe_eval import safe_eval as eval
from openerp.osv import osv, orm, fields from openerp.osv import osv, orm, fields
from openerp.tools.translate import _ from openerp.tools.translate import _
from openerp import SUPERUSER_ID
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@ -1048,7 +1050,7 @@ class AssetsBundle(object):
self.cache[key] = content self.cache[key] = content
if self.debug: if self.debug:
return "/*\n%s\n*/\n" % '\n'.join( return "/*\n%s\n*/\n" % '\n'.join(
[asset.filename for asset in self.javascripts if asset.filename]) + self.cache[key] [asset.url for asset in self.javascripts if asset.url]) + self.cache[key]
return self.cache[key] return self.cache[key]
def css(self): def css(self):
@ -1068,50 +1070,55 @@ class AssetsBundle(object):
self.cache[key] = content self.cache[key] = content
if self.debug: if self.debug:
return "/*\n%s\n*/\n" % '\n'.join( return "/*\n%s\n*/\n" % '\n'.join(
[asset.filename for asset in self.javascripts if asset.filename]) + self.cache[key] [asset.url for asset in self.javascripts if asset.url]) + self.cache[key]
return self.cache[key] return self.cache[key]
class WebAsset(object): class WebAsset(object):
def __init__(self, source=None, url=None): def __init__(self, source=None, url=None):
self.source = source self.source = source
self.url = url self.url = url
self._filename = None self._irattach = None
self._content = None self._content = None
self.filename = None
@property self.last_modified = None
def filename(self): if source:
if self._filename is None and self.url: self.last_modified = datetime.datetime(1970, 1, 1)
if url:
module = filter(None, self.url.split('/'))[0] module = filter(None, self.url.split('/'))[0]
try: try:
# Test url against modules static assets
mpath = openerp.http.addons_manifest[module]['addons_path'] mpath = openerp.http.addons_manifest[module]['addons_path']
self.filename = mpath + self.url.replace('/', os.path.sep)
self.last_modified = datetime.datetime.fromtimestamp(os.path.getmtime(self.filename))
except Exception: except Exception:
raise KeyError("Could not find asset '%s' for '%s' addon" % (self.url, module)) try:
self._filename = mpath + self.url.replace('/', os.path.sep) # Test url against ir.attachments
return self._filename domain = [('type', '=', 'binary'), ('url', '=', self.url)]
attach = request.registry['ir.attachment'].search_read(request.cr, SUPERUSER_ID, domain, ['__last_update', 'datas', 'mimetype'], context=request.context)
self._irattach = attach[0]
server_format = openerp.tools.misc.DEFAULT_SERVER_DATETIME_FORMAT
try:
self.last_modified = datetime.datetime.strptime(attach[0]['__last_update'], server_format + '.%f')
except ValueError:
self.last_modified = datetime.datetime.strptime(attach[0]['__last_update'], server_format)
except Exception:
raise KeyError("Could not find asset '%s' for '%s' addon" % (self.url, module))
@property @openerp.tools.func.lazy_property
def content(self): def content(self):
if self._content is None:
self._content = self.get_content()
return self._content
def get_content(self):
if self.source: if self.source:
return self.source return self.source
if self._irattach:
return self._irattach['datas'].decode('base64')
return self.get_content()
def get_content(self):
with open(self.filename, 'rb') as fp: with open(self.filename, 'rb') as fp:
return fp.read().decode('utf-8') return fp.read().decode('utf-8')
def minify(self): def minify(self):
return self.content return self.content
@property
def last_modified(self):
if self.source:
# TODO: return last_update of bundle's ir.ui.view
return datetime.datetime(1970, 1, 1)
return datetime.datetime.fromtimestamp(os.path.getmtime(self.filename))
class JavascriptAsset(WebAsset): class JavascriptAsset(WebAsset):
def minify(self): def minify(self):
return rjsmin(self.content) return rjsmin(self.content)
@ -1122,9 +1129,6 @@ class StylesheetAsset(WebAsset):
rx_sourceMap = re.compile(r'(/\*# sourceMappingURL=.*)', re.U) rx_sourceMap = re.compile(r'(/\*# sourceMappingURL=.*)', re.U)
def _get_content(self): def _get_content(self):
if self.source:
return self.source
with open(self.filename, 'rb') as fp: with open(self.filename, 'rb') as fp:
firstline = fp.readline() firstline = fp.readline()
m = re.match(r'@charset "([^"]+)";', firstline) m = re.match(r'@charset "([^"]+)";', firstline)