[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:
parent
59ec75cbb0
commit
da294291cf
|
@ -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__'):
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue