changeset 9710c9206e90 in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset&node=9710c9206e90
description:
        Add cache on list icons

        issue11438
        review405311003
diffstat:

 trytond/ir/ui/icon.py |  25 ++++++++++++++++++++++++-
 1 files changed, 24 insertions(+), 1 deletions(-)

diffs (58 lines):

diff -r 05674a0ed7ea -r 9710c9206e90 trytond/ir/ui/icon.py
--- a/trytond/ir/ui/icon.py     Thu May 19 22:10:43 2022 +0200
+++ b/trytond/ir/ui/icon.py     Thu May 19 22:12:32 2022 +0200
@@ -3,6 +3,7 @@
 
 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
@@ -17,6 +18,7 @@
     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):
@@ -44,12 +46,17 @@
 
     @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
-        return sorted((icon_id, name) for name, icon_id in icons.items())
+        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))
@@ -58,3 +65,19 @@
                 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()

Reply via email to