diff options
Diffstat (limited to 'addons/website/models/website.py')
| -rw-r--r-- | addons/website/models/website.py | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/addons/website/models/website.py b/addons/website/models/website.py index a93f0ff8bf9..dab91bdf06d 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 @@ -25,8 +25,7 @@ except ImportError: import openerp from openerp.osv import orm, osv, fields -from openerp.tools import html_escape as escape -from openerp.tools import ustr as ustr +from openerp.tools import html_escape as escape, ustr, image_resize_and_sharpen, image_save_for_web from openerp.tools.safe_eval import safe_eval from openerp.addons.web.http import request from werkzeug.exceptions import NotFound @@ -516,7 +515,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. @@ -568,19 +567,25 @@ 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 data = record[field].decode('base64') + image = Image.open(cStringIO.StringIO(data)) + response.mimetype = Image.MIME[image.format] + + filename = '%s_%s.%s' % (model.replace('.', '_'), id, str(image.format).lower()) + response.headers['Content-Disposition'] = 'inline; filename="%s"' % filename if (not max_width) and (not max_height): response.data = data return response - image = Image.open(cStringIO.StringIO(data)) - response.mimetype = Image.MIME[image.format] - w, h = image.size max_w = int(max_width) if max_width else maxint max_h = int(max_height) if max_height else maxint @@ -588,14 +593,22 @@ class website(osv.osv): if w < max_w and h < max_h: response.data = data else: - image.thumbnail((max_w, max_h), Image.ANTIALIAS) - image.save(response.stream, image.format) + size = (max_w, max_h) + img = image_resize_and_sharpen(image, size) + image_save_for_web(img, response.stream, format=image.format) # invalidate content-length computed by make_conditional as # writing to response.stream does not do it (as of werkzeug 0.9.3) del response.headers['Content-Length'] 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.sudo().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" @@ -671,11 +684,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( |
