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
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
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.
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
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"
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(