~openerp-dev/openobject-server/trunk-staging-mat

« back to all changes in this revision

Viewing changes to openerp/addons/base/ir/ir_qweb.py

  • Committer: Fabien Meghazi
  • Date: 2014-05-05 16:09:53 UTC
  • Revision ID: fme@openerp.com-20140505160953-yk6688ey7eoz5579
[ADD] Support for ir.attachments in assets bundles

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
import openerp.tools
24
24
import openerp.tools.func
25
25
import openerp.tools.lru
 
26
from openerp.http import request
26
27
from openerp.tools.safe_eval import safe_eval as eval
27
28
from openerp.osv import osv, orm, fields
28
29
from openerp.tools.translate import _
 
30
from openerp import SUPERUSER_ID
29
31
 
30
32
_logger = logging.getLogger(__name__)
31
33
 
1048
1050
            self.cache[key] = content
1049
1051
        if self.debug:
1050
1052
            return "/*\n%s\n*/\n" % '\n'.join(
1051
 
                [asset.filename for asset in self.javascripts if asset.filename]) + self.cache[key]
 
1053
                [asset.url for asset in self.javascripts if asset.url]) + self.cache[key]
1052
1054
        return self.cache[key]
1053
1055
 
1054
1056
    def css(self):
1068
1070
            self.cache[key] = content
1069
1071
        if self.debug:
1070
1072
            return "/*\n%s\n*/\n" % '\n'.join(
1071
 
                [asset.filename for asset in self.javascripts if asset.filename]) + self.cache[key]
 
1073
                [asset.url for asset in self.javascripts if asset.url]) + self.cache[key]
1072
1074
        return self.cache[key]
1073
1075
 
1074
1076
class WebAsset(object):
1075
1077
    def __init__(self, source=None, url=None):
1076
1078
        self.source = source
1077
1079
        self.url = url
1078
 
        self._filename = None
 
1080
        self._irattach = None
1079
1081
        self._content = None
1080
 
 
1081
 
    @property
1082
 
    def filename(self):
1083
 
        if self._filename is None and self.url:
 
1082
        self.filename = None
 
1083
        self.last_modified = None
 
1084
        if source:
 
1085
            self.last_modified = datetime.datetime(1970, 1, 1)
 
1086
        if url:
1084
1087
            module = filter(None, self.url.split('/'))[0]
1085
1088
            try:
 
1089
                # Test url against modules static assets
1086
1090
                mpath = openerp.http.addons_manifest[module]['addons_path']
 
1091
                self.filename = mpath + self.url.replace('/', os.path.sep)
 
1092
                self.last_modified = datetime.datetime.fromtimestamp(os.path.getmtime(self.filename))
1087
1093
            except Exception:
1088
 
                raise KeyError("Could not find asset '%s' for '%s' addon" % (self.url, module))
1089
 
            self._filename = mpath + self.url.replace('/', os.path.sep)
1090
 
        return self._filename
 
1094
                try:
 
1095
                    # Test url against ir.attachments
 
1096
                    domain = [('type', '=', 'binary'), ('url', '=', self.url)]
 
1097
                    attach = request.registry['ir.attachment'].search_read(request.cr, SUPERUSER_ID, domain, ['__last_update', 'datas', 'mimetype'], context=request.context)
 
1098
                    self._irattach = attach[0]
 
1099
                    server_format = openerp.tools.misc.DEFAULT_SERVER_DATETIME_FORMAT
 
1100
                    try:
 
1101
                        self.last_modified =  datetime.datetime.strptime(attach[0]['__last_update'], server_format + '.%f')
 
1102
                    except ValueError:
 
1103
                        self.last_modified =  datetime.datetime.strptime(attach[0]['__last_update'], server_format)
 
1104
                except Exception:
 
1105
                    raise KeyError("Could not find asset '%s' for '%s' addon" % (self.url, module))
1091
1106
 
1092
 
    @property
 
1107
    @openerp.tools.func.lazy_property
1093
1108
    def content(self):
1094
 
        if self._content is None:
1095
 
            self._content = self.get_content()
1096
 
        return self._content
1097
 
 
1098
 
    def get_content(self):
1099
1109
        if self.source:
1100
1110
            return self.source
 
1111
        if self._irattach:
 
1112
            return self._irattach['datas'].decode('base64')
 
1113
        return self.get_content()
1101
1114
 
 
1115
    def get_content(self):
1102
1116
        with open(self.filename, 'rb') as fp:
1103
1117
            return fp.read().decode('utf-8')
1104
1118
 
1105
1119
    def minify(self):
1106
1120
        return self.content
1107
1121
 
1108
 
    @property
1109
 
    def last_modified(self):
1110
 
        if self.source:
1111
 
            # TODO: return last_update of bundle's ir.ui.view
1112
 
            return datetime.datetime(1970, 1, 1)
1113
 
        return datetime.datetime.fromtimestamp(os.path.getmtime(self.filename))
1114
 
 
1115
1122
class JavascriptAsset(WebAsset):
1116
1123
    def minify(self):
1117
1124
        return rjsmin(self.content)
1122
1129
    rx_sourceMap = re.compile(r'(/\*# sourceMappingURL=.*)', re.U)
1123
1130
 
1124
1131
    def _get_content(self):
1125
 
        if self.source:
1126
 
            return self.source
1127
 
 
1128
1132
        with open(self.filename, 'rb') as fp:
1129
1133
            firstline = fp.readline()
1130
1134
            m = re.match(r'@charset "([^"]+)";', firstline)