Initial import from Docker volume
This commit is contained in:
93
model/avatar.py
Executable file
93
model/avatar.py
Executable file
@@ -0,0 +1,93 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user