[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.func
import openerp.tools.lru
from openerp.http import request
from openerp.tools.safe_eval import safe_eval as eval
from openerp.osv import osv, orm, fields
from openerp.tools.translate import _
from openerp import SUPERUSER_ID
_logger = logging.getLogger(__name__)
@ -1048,7 +1050,7 @@ class AssetsBundle(object):
self.cache[key] = content
if self.debug:
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]
def css(self):
@ -1068,50 +1070,55 @@ class AssetsBundle(object):
self.cache[key] = content
if self.debug:
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]
class WebAsset(object):
def __init__(self, source=None, url=None):
self.source = source
self.url = url
self._filename = None
self._irattach = None
self._content = None
@property
def filename(self):
if self._filename is None and self.url:
self.filename = None
self.last_modified = None
if source:
self.last_modified = datetime.datetime(1970, 1, 1)
if url:
module = filter(None, self.url.split('/'))[0]
try:
# Test url against modules static assets
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:
raise KeyError("Could not find asset '%s' for '%s' addon" % (self.url, module))
self._filename = mpath + self.url.replace('/', os.path.sep)
return self._filename
try:
# Test url against ir.attachments
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):
if self._content is None:
self._content = self.get_content()
return self._content
def get_content(self):
if 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:
return fp.read().decode('utf-8')
def minify(self):
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):
def minify(self):
return rjsmin(self.content)
@ -1122,9 +1129,6 @@ class StylesheetAsset(WebAsset):
rx_sourceMap = re.compile(r'(/\*# sourceMappingURL=.*)', re.U)
def _get_content(self):
if self.source:
return self.source
with open(self.filename, 'rb') as fp:
firstline = fp.readline()
m = re.match(r'@charset "([^"]+)";', firstline)