94 lines
3.0 KiB
Python
Executable File
94 lines
3.0 KiB
Python
Executable File
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
# this repository contains the full copyright notices and license terms.
|
|
|
|
from trytond.i18n import lazy_gettext
|
|
from trytond.model import fields
|
|
from trytond.pool import Pool
|
|
|
|
|
|
def avatar_mixin(size=64, default=None):
|
|
class AvatarMixin:
|
|
__slots__ = ()
|
|
avatars = fields.One2Many(
|
|
'ir.avatar', 'resource', lazy_gettext('ir.msg_avatars'), size=1)
|
|
avatar = fields.Function(
|
|
fields.Binary(lazy_gettext('ir.msg_avatar')),
|
|
'_get_avatar', setter='_set_avatar')
|
|
avatar_url = fields.Function(
|
|
fields.Char(lazy_gettext('ir.msg_avatar_url')), '_get_avatar_url')
|
|
|
|
@property
|
|
def has_avatar(self):
|
|
if self.avatars:
|
|
avatar, = self.avatars
|
|
return bool(avatar.image_id or avatar.image)
|
|
return False
|
|
|
|
def _get_avatar(self, name):
|
|
if self.avatars:
|
|
avatar, = self.avatars
|
|
return avatar.get(size=size)
|
|
return None
|
|
|
|
@classmethod
|
|
def _set_avatar(cls, records, name, value):
|
|
pool = Pool()
|
|
Avatar = pool.get('ir.avatar')
|
|
avatars = []
|
|
image = Avatar.convert(value)
|
|
for record in records:
|
|
if record.avatars:
|
|
avatar, = record.avatars
|
|
else:
|
|
avatar = Avatar(resource=record)
|
|
avatars.append(avatar)
|
|
Avatar.save(avatars)
|
|
# Use write the image to store only once in filestore
|
|
Avatar.write(avatars, {
|
|
'image': image,
|
|
})
|
|
|
|
def _get_avatar_url(self, name):
|
|
if self.avatars:
|
|
avatar, = self.avatars
|
|
return avatar.url
|
|
|
|
@classmethod
|
|
def generate_avatar(cls, records, field='rec_name'):
|
|
from trytond.ir.avatar import PIL, generate
|
|
if not PIL:
|
|
return
|
|
records = [r for r in records if not r.has_avatar]
|
|
if not records:
|
|
return
|
|
for record in records:
|
|
avatar = generate(size, getattr(record, field))
|
|
if avatar:
|
|
record.avatar = avatar
|
|
cls.save(records)
|
|
|
|
@classmethod
|
|
def copy(cls, avatars, default=None):
|
|
if default is None:
|
|
default = {}
|
|
else:
|
|
default = default.copy()
|
|
default.setdefault('avatars', [])
|
|
return super().copy(avatars, default=default)
|
|
|
|
if default:
|
|
|
|
@classmethod
|
|
def create(cls, vlist):
|
|
records = super().create(vlist)
|
|
cls.generate_avatar(records, field=default)
|
|
return records
|
|
|
|
@classmethod
|
|
def write(cls, *args):
|
|
records = sum(args[0:None:2], [])
|
|
super().write(*args)
|
|
cls.generate_avatar(records, field=default)
|
|
|
|
return AvatarMixin
|