From 5436e4fea87bb1c4e9db11bc444f82e3d3753fbd Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 18 Jun 2012 17:47:10 +0200 Subject: [PATCH] [ADD] Added support for ETag in Binary#image [REM] Removed kanban hack using Date#getDate() in url bzr revid: fme@openerp.com-20120618154710-luw8bt50bjtdlj7t --- addons/web/controllers/main.py | 23 +++++++++++++++++++---- addons/web_kanban/static/src/js/kanban.js | 4 ---- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 8203efc969e..2966b34ab19 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1331,19 +1331,34 @@ class Binary(openerpweb.Controller): @openerpweb.httprequest def image(self, req, model, id, field, **kw): + last_update = '__last_update' Model = req.session.model(model) context = req.session.eval_context(req.context) + headers = [('Content-Type', 'image/png')] + etag = req.httprequest.headers.get('If-None-Match') + hashed_session = hashlib.md5(req.session_id).hexdigest() + if etag: + if not id and hashed_session == etag: + return werkzeug.wrappers.Response(status=304) + else: + date = Model.read([int(id)], [last_update], context)[0].get(last_update) + if hashlib.md5(date).hexdigest() == etag: + return werkzeug.wrappers.Response(status=304) + retag = hashed_session try: if not id: res = Model.default_get([field], context).get(field) + image_data = base64.b64decode(res) else: - res = Model.read([int(id)], [field], context)[0].get(field) - image_data = base64.b64decode(res) + res = Model.read([int(id)], [last_update, field], context)[0] + retag = hashlib.md5(res.get(last_update)).hexdigest() + image_data = base64.b64decode(res.get(field)) except (TypeError, xmlrpclib.Fault): image_data = self.placeholder(req) - return req.make_response(image_data, [ - ('Content-Type', 'image/png'), ('Content-Length', len(image_data))]) + headers.append(('ETag', retag)) + headers.append(('Content-Length', len(image_data))) + return req.make_response(image_data, headers) def placeholder(self, req): addons_path = openerpweb.addons_manifest['web']['addons_path'] return open(os.path.join(addons_path, 'web', 'static', 'src', 'img', 'placeholder.png'), 'rb').read() diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 7e3d8c10e6b..2b123468260 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -743,10 +743,6 @@ instance.web_kanban.KanbanRecord = instance.web.OldWidget.extend({ kanban_image: function(model, field, id) { id = id || ''; var url = instance.connection.prefix + '/web/binary/image?session_id=' + this.session.session_id + '&model=' + model + '&field=' + field + '&id=' + id; - if (this.record.__last_update && this.record.__last_update.raw_value) { - var time = instance.web.str_to_datetime(this.record.__last_update.raw_value).getTime(); - url += '&t=' + time; - } return url; }, kanban_text_ellipsis: function(s, size) {