88 lines
2.6 KiB
Python
Executable File
88 lines
2.6 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.
|
|
|
|
import os
|
|
|
|
from trytond.cache import Cache
|
|
from trytond.model import ModelSQL, ModelView, fields, sequence_ordered
|
|
from trytond.rpc import RPC
|
|
from trytond.tools import file_open
|
|
from trytond.transaction import Transaction
|
|
|
|
|
|
class Icon(
|
|
fields.fmany2one(
|
|
'module_ref', 'module', 'ir.module,name', "Module",
|
|
readonly=True, required=True, ondelete='CASCADE'),
|
|
sequence_ordered(), ModelSQL, ModelView):
|
|
'Icon'
|
|
__name__ = 'ir.ui.icon'
|
|
|
|
name = fields.Char('Name', required=True)
|
|
module = fields.Char('Module', readonly=True, required=True)
|
|
path = fields.Char('SVG Path', readonly=True, required=True)
|
|
icon = fields.Function(fields.Char('Icon', depends=['path']), 'get_icon')
|
|
_list_icons = Cache('ir.ui.icon.list_icons', context=False)
|
|
|
|
@classmethod
|
|
def __setup__(cls):
|
|
super(Icon, cls).__setup__()
|
|
cls.__rpc__.update({
|
|
'list_icons': RPC(),
|
|
})
|
|
|
|
@classmethod
|
|
def __register__(cls, module_name):
|
|
super().__register__(module_name)
|
|
|
|
table = cls.__table_handler__(module_name)
|
|
|
|
# Migration from 5.0: remove required on sequence
|
|
table.not_null_action('sequence', 'remove')
|
|
|
|
@staticmethod
|
|
def default_module():
|
|
return Transaction().context.get('module') or ''
|
|
|
|
@staticmethod
|
|
def default_sequence():
|
|
return 10
|
|
|
|
@classmethod
|
|
def list_icons(cls):
|
|
icons = cls._list_icons.get(None)
|
|
if icons is not None:
|
|
return icons
|
|
icons = {}
|
|
for icon in cls.browse(cls.search([],
|
|
order=[('sequence', 'ASC'), ('id', 'ASC')])):
|
|
if icon.name not in icons:
|
|
icons[icon.name] = icon.id
|
|
icons = sorted((icon_id, name) for name, icon_id in icons.items())
|
|
cls._list_icons.set(None, icons)
|
|
return icons
|
|
|
|
def get_icon(self, name):
|
|
path = os.path.join(self.module, self.path.replace('/', os.sep))
|
|
with file_open(
|
|
path,
|
|
subdir='modules' if self.module not in {'ir', 'res'} else '',
|
|
mode='r', encoding='utf-8') as fp:
|
|
return fp.read()
|
|
|
|
@classmethod
|
|
def create(cls, vlist):
|
|
icons = super().create(vlist)
|
|
cls._list_icons.clear()
|
|
return icons
|
|
|
|
@classmethod
|
|
def write(cls, *args):
|
|
super().write(*args)
|
|
cls._list_icons.clear()
|
|
|
|
@classmethod
|
|
def delete(cls, icons):
|
|
super().delete(icons)
|
|
cls._list_icons.clear()
|