From bc5e6fa2cb577c11ae7236378b0175913d7d5648 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Fri, 5 Sep 2014 18:20:55 +0200 Subject: [PATCH] [ADD] Helper for /website/image (allows to use aggressive cache) --- addons/website/controllers/main.py | 13 ++++++------ addons/website/models/ir_qweb.py | 18 +++++++--------- addons/website/models/website.py | 21 ++++++++++++------- .../views/website_blog_templates.xml | 10 ++++----- addons/website_event/views/website_event.xml | 2 +- addons/website_hr/models/hr.py | 3 --- addons/website_hr/views/website_hr.xml | 2 +- .../views/website_mail_group.xml | 6 +++--- .../website_quote/views/website_quotation.xml | 4 ++-- addons/website_sale/models/product.py | 7 ------- .../static/src/js/website_sale.js | 2 +- addons/website_sale/views/templates.xml | 8 +++---- 12 files changed, 45 insertions(+), 51 deletions(-) diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index d5d9b7582e5..6891d767842 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -8,8 +8,6 @@ import xml.etree.ElementTree as ET import logging import re -from sys import maxint - import werkzeug.utils import urllib2 import werkzeug.wrappers @@ -17,7 +15,7 @@ from PIL import Image import openerp from openerp.addons.web import http -from openerp.http import request, Response +from openerp.http import request, STATIC_CACHE logger = logging.getLogger(__name__) @@ -397,8 +395,8 @@ class Website(openerp.addons.web.controllers.main.Home): @http.route([ '/website/image', - '/website/image///', - '/website/image////x' + '/website/image/--', + '/website/image/---x' ], auth="public", website=True) def website_image(self, model, id, field, max_width=None, max_height=None): """ Fetches the requested field and ensures it does not go above @@ -416,9 +414,12 @@ class Website(openerp.addons.web.controllers.main.Home): all cases. """ try: + idsha = id.split('_') + id = idsha[0] response = werkzeug.wrappers.Response() return request.registry['website']._image( - request.cr, request.uid, model, id, field, response, max_width, max_height) + request.cr, request.uid, model, id, field, response, max_width, max_height, + cache=STATIC_CACHE if len(idsha) > 1 else None) except Exception: logger.exception("Cannot render image field %r of record %s[%s] at size(%s,%s)", field, model, id, max_width, max_height) diff --git a/addons/website/models/ir_qweb.py b/addons/website/models/ir_qweb.py index 9d528c9329b..a4d94cbefe0 100644 --- a/addons/website/models/ir_qweb.py +++ b/addons/website/models/ir_qweb.py @@ -286,21 +286,17 @@ class Image(orm.AbstractModel): def record_to_html(self, cr, uid, field_name, record, column, options=None, context=None): if options is None: options = {} - classes = ['img', 'img-responsive'] + options.get('class', '').split() + aclasses = ['img', 'img-responsive'] + options.get('class', '').split() + classes = ' '.join(itertools.imap(escape, aclasses)) - url_frags = { - 'classes': ' '.join(itertools.imap(escape, classes)), - 'model': record._model._name, - 'id': record.id, - 'field': field_name, - 'max_size': '', - } + max_size = None max_width, max_height = options.get('max_width', 0), options.get('max_height', 0) if max_width or max_height: - url_frags['max_size'] = '/%sx%s' % (max_width, max_height) + max_size = '%sx%s' % (max_width, max_height) - img = '' - return ir_qweb.HTMLSafe(img % url_frags) + src = self.pool['website'].image_url(cr, uid, record, field_name, max_size) + img = '' % (classes, src) + return ir_qweb.HTMLSafe(img) local_url_re = re.compile(r'^/(?P[^]]+)/static/(?P.+)$') def from_html(self, cr, uid, model, column, element, context=None): diff --git a/addons/website/models/website.py b/addons/website/models/website.py index a1414f204bc..949e276b3b0 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -4,13 +4,13 @@ import contextlib import datetime import hashlib import inspect -import itertools import logging import math import mimetypes import unicodedata import os import re +import time import urlparse from PIL import Image @@ -513,7 +513,7 @@ class website(osv.osv): response.data = f.read() return response.make_conditional(request.httprequest) - def _image(self, cr, uid, model, id, field, response, max_width=maxint, max_height=maxint, context=None): + def _image(self, cr, uid, model, id, field, response, max_width=maxint, max_height=maxint, cache=None, context=None): """ Fetches the requested field and ensures it does not go above (max_width, max_height), resizing it if necessary. @@ -565,6 +565,10 @@ class website(osv.osv): response.set_etag(hashlib.sha1(record[field]).hexdigest()) response.make_conditional(request.httprequest) + if cache: + response.cache_control.max_age = cache + response.expires = int(time.time() + cache) + # conditional request match if response.status_code == 304: return response @@ -593,6 +597,13 @@ class website(osv.osv): return response + def image_url(self, cr, uid, record, field, size=None, context=None): + """Returns a local url that points to the image field of a given browse record.""" + model = record._name + id = '%s_%s' % (record.id, hashlib.sha1(record.write_date).hexdigest()[0:7]) + size = '' if size is None else '-%s' % size + return '/website/image/%s-%s-%s%s' % (model, id, field, size) + class website_menu(osv.osv): _name = "website.menu" @@ -668,11 +679,7 @@ class ir_attachment(osv.osv): if attach.url: result[attach.id] = attach.url else: - result[attach.id] = urlplus('/website/image', { - 'model': 'ir.attachment', - 'field': 'datas', - 'id': attach.id - }) + result[attach.id] = self.pool['website'].image_url(cr, uid, attach, 'datas') return result def _datas_checksum(self, cr, uid, ids, name, arg, context=None): return dict( diff --git a/addons/website_blog/views/website_blog_templates.xml b/addons/website_blog/views/website_blog_templates.xml index 9d9fdb9ba03..d28ae7375d2 100644 --- a/addons/website_blog/views/website_blog_templates.xml +++ b/addons/website_blog/views/website_blog_templates.xml @@ -123,7 +123,7 @@
@@ -205,7 +205,7 @@

- +
@@ -249,7 +249,7 @@

- +
diff --git a/addons/website_event/views/website_event.xml b/addons/website_event/views/website_event.xml index a5d437402b7..bdc92cdd69e 100644 --- a/addons/website_event/views/website_event.xml +++ b/addons/website_event/views/website_event.xml @@ -404,7 +404,7 @@
- +

Events:

diff --git a/addons/website_hr/models/hr.py b/addons/website_hr/models/hr.py index 006e5e5c975..faed91b4a28 100644 --- a/addons/website_hr/models/hr.py +++ b/addons/website_hr/models/hr.py @@ -12,6 +12,3 @@ class hr(osv.osv): _defaults = { 'website_published': False } - - def img(self, cr, uid, ids, field='image_small', context=None): - return "/website/image/%s/%s/%s" % (self._name, ids[0], field) diff --git a/addons/website_hr/views/website_hr.xml b/addons/website_hr/views/website_hr.xml index f0a6b3596fd..a1385624ff4 100644 --- a/addons/website_hr/views/website_hr.xml +++ b/addons/website_hr/views/website_hr.xml @@ -12,7 +12,7 @@
- +
diff --git a/addons/website_mail_group/views/website_mail_group.xml b/addons/website_mail_group/views/website_mail_group.xml index 56b86986cd4..bda3d78b0c6 100644 --- a/addons/website_mail_group/views/website_mail_group.xml +++ b/addons/website_mail_group/views/website_mail_group.xml @@ -39,7 +39,7 @@
+ t-att-src="website.image_url(message, 'author_avatar')"/>

@@ -247,7 +247,7 @@