[IMP] res.users: from avatar to image: iamge, image_medium and image_small, using tools to resize.

bzr revid: tde@openerp.com-20120627132807-crf2vi23ato69v47
This commit is contained in:
Thibault Delavallée 2012-06-27 15:28:07 +02:00
parent 59ec75cbb0
commit da294291cf
2 changed files with 58 additions and 39 deletions

View File

@ -152,33 +152,6 @@ class users(osv.osv):
body=(self.get_welcome_mail_body(cr, uid, context=context) % user))
return ir_mail_server.send_email(cr, uid, msg, context=context)
def onchange_avatar(self, cr, uid, ids, value, context=None):
if not value:
return {'value': {'avatar_big': value, 'avatar': value} }
return {'value': {'avatar_big': self._avatar_resize(cr, uid, value, 540, 450, context=context), 'avatar': self._avatar_resize(cr, uid, value, context=context)} }
def _set_avatar(self, cr, uid, id, name, value, args, context=None):
if not value:
vals = {'avatar_big': value}
else:
vals = {'avatar_big': self._avatar_resize(cr, uid, value, 540, 450, context=context)}
return self.write(cr, uid, [id], vals, context=context)
def _avatar_resize(self, cr, uid, avatar, height=180, width=150, context=None):
image_stream = io.BytesIO(avatar.decode('base64'))
img = Image.open(image_stream)
img.thumbnail((height, width), Image.ANTIALIAS)
img_stream = StringIO.StringIO()
img.save(img_stream, "PNG")
return img_stream.getvalue().encode('base64')
def _get_avatar(self, cr, uid, ids, name, args, context=None):
result = dict.fromkeys(ids, False)
for user in self.browse(cr, uid, ids, context=context):
if user.avatar_big:
result[user.id] = self._avatar_resize(cr, uid, user.avatar_big, context=context)
return result
def _set_new_password(self, cr, uid, id, name, value, args, context=None):
if value is False:
# Do not update the password if no value is provided, ignore silently.
@ -194,6 +167,35 @@ class users(osv.osv):
def _get_password(self, cr, uid, ids, arg, karg, context=None):
return dict.fromkeys(ids, '')
def _get_image_resized(self, cr, uid, ids, name, args, context=None):
result = dict.fromkeys(ids, False)
for user in self.browse(cr, uid, ids, context=context):
result[user.id] = {'image_medium': False, 'image_small': False}
if user.image:
result[user.id]['image_medium'] = tools.resize_image_medium(user.image)
result[user.id]['image_small'] = tools.resize_image_small(user.image)
return result
def _set_image_resized(self, cr, uid, id, name, value, args, context=None):
if not value:
vals = {'image': value}
else:
vals = {'image': tools.resize_image_big(value)}
return self.write(cr, uid, [id], vals, context=context)
def onchange_image(self, cr, uid, ids, value, context=None):
if not value:
return {'value': {
'image': value,
'image_medium': value,
'image_small': value,
}}
return {'value': {
'image': tools.resize_image_big(value),
'image_medium': tools.resize_image_medium(value),
'image_small': tools.resize_image_small(value),
}}
_columns = {
'id': fields.integer('ID'),
'name': fields.char('User Name', size=64, required=True, select=True,
@ -208,11 +210,28 @@ class users(osv.osv):
"otherwise leave empty. After a change of password, the user has to login again."),
'user_email': fields.char('Email', size=64),
'signature': fields.text('Signature', size=64),
'avatar_big': fields.binary('Big-sized avatar', help="This field holds the image used as avatar for the user. The avatar field is used as an interface to access this field. The image is base64 encoded, and PIL-supported. It is stored as a 540x450 px image, in case a bigger image must be used."),
'avatar': fields.function(_get_avatar, fnct_inv=_set_avatar, string='Avatar', type="binary",
'image': fields.binary("Avatar",
help="This field holds the image used as avatar for the "\
"user. The avatar field is used as an interface to "\
"access this field. The image is base64 encoded, "\
"and PIL-supported. It is stored as a 540x450 px "\
"image, in case a bigger image must be used."),
'image_medium': fields.function(_get_image_resized, fnct_inv=_set_image_resized,
string="Medium-sized avatar", type="binary", multi="_get_image_resized",
store = {
'res.users': (lambda self, cr, uid, ids, c={}: ids, ['avatar_big'], 10),
}, help="Image used as avatar for the user. It is automatically resized as a 180x150 px image. This field serves as an interface to the avatar_big field."),
'res.users': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
},
help="Medium-sized image of the user. It is automatically "\
"resized as a 180x180px image, with aspect ratio keps. "\
"Use this field in form views or some kanban views."),
'image_small': fields.function(_get_image_resized, fnct_inv=_set_image_resized,
string="Smal-sized avatar", type="binary", multi="_get_image_resized",
store = {
'res.users': (lambda self, cr, uid, ids, c={}: ids, ['image'], 10),
},
help="Small-sized image of the user. It is automatically "\
"resized as a 50x50px image, with aspect ratio keps. "\
"Use this field in form views or some kanban views."),
'active': fields.boolean('Active'),
'action_id': fields.many2one('ir.actions.actions', 'Home Action', help="If specified, this action will be opened at logon for this user, in addition to the standard menu."),
'menu_id': fields.many2one('ir.actions.actions', 'Menu Action', help="If specified, the action will replace the standard menu for this user."),
@ -321,16 +340,16 @@ class users(osv.osv):
pass
return result
def _get_avatar(self, cr, uid, context=None):
# default avatar file name: avatar0 -> avatar6.png, choose randomly
avatar_path = openerp.modules.get_module_resource('base', 'static/src/img', 'avatar%d.png' % random.randint(0, 6))
return self._avatar_resize(cr, uid, open(avatar_path, 'rb').read().encode('base64'), context=context)
def _get_image(self, cr, uid, context=None):
# default image file name: avatar0 -> avatar6.png, choose randomly
image_path = openerp.modules.get_module_resource('base', 'static/src/img', 'avatar%d.png' % random.randint(0, 6))
return tools.resize_image_big(open(image_path, 'rb').read().encode('base64'))
_defaults = {
'password' : '',
'context_lang': lambda self, cr, uid, context: context.get('lang', 'en_US'),
'context_tz': lambda self, cr, uid, context: context.get('tz', False),
'avatar': _get_avatar,
'image': _get_image,
'active' : True,
'menu_id': _get_menu,
'company_id': _get_company,
@ -340,7 +359,7 @@ class users(osv.osv):
}
# User can write to a few of her own fields (but not her groups for example)
SELF_WRITEABLE_FIELDS = ['menu_tips','password', 'signature', 'action_id', 'company_id', 'user_email', 'name', 'avatar', 'avatar_big']
SELF_WRITEABLE_FIELDS = ['menu_tips','password', 'signature', 'action_id', 'company_id', 'user_email', 'name', 'image', 'image_medium', 'image_small']
def write(self, cr, uid, ids, values, context=None):
if not hasattr(ids, '__iter__'):

View File

@ -82,7 +82,7 @@
<field name="id" invisible="1"/>
<sheet>
<div class="oe_right">
<field name="avatar" widget='image' nolabel="1" on_change="onchange_avatar(avatar)" class="oe_avatar"/>
<field name="image_medium" widget='image' nolabel="1" on_change="onchange_image(image_medium)" class="oe_avatar"/>
</div>
<div class="oe_title">
<label for="name" class="oe_edit_only"/>
@ -196,7 +196,7 @@
<form string="Users" version="7.0">
<sheet>
<div class="oe_right oe_avatar">
<field name="avatar" widget='image' on_change="onchange_avatar(avatar)"/>
<field name="image_small" widget='image' on_change="onchange_image(image_small)"/>
</div>
<div class="oe_title">
<h1>