Improve module buttons

- Enforce origin state of modules
- Speedup on_write computation
- Better usage of record cache

review3361002
This commit is contained in:
Cédric Krier committed 2014-02-14 00:18:27 +01:00
1 parent 729aaa8a00
commit 1e9673ea47
1 file changed
+64 -53
+64 -53
View File
@@ -1,5 +1,7 @@
#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 functools import wraps
from trytond.model import ModelView, ModelSQL, fields
from trytond.modules import create_graph, get_module_list, get_module_info
from trytond.wizard import Wizard, StateView, Button, StateTransition, \
@@ -19,6 +21,16 @@ __all__ = [
]
def filter_state(state):
def filter(func):
@wraps(func)
def wrapper(cls, modules):
modules = [m for m in modules if m.state == state]
return func(cls, modules)
return wrapper
return filter
class Module(ModelSQL, ModelView):
"Module"
__name__ = "ir.module.module"
@@ -98,14 +110,14 @@ class Module(ModelSQL, ModelView):
@classmethod
def get_childs(cls, modules, name):
child_ids = dict((m.id, []) for m in modules)
names = [m.name for m in modules]
name2id = dict((m.name, m.id) for m in modules)
childs = cls.search([
('dependencies.name', 'in', names),
('dependencies.name', 'in', name2id.keys()),
])
for child in childs:
for dep in child.dependencies:
if dep.module.id in child_ids:
child_ids[dep.module.id].append(child.id)
if dep.name in name2id:
child_ids[name2id[dep.name]].append(child.id)
return child_ids
@classmethod
@@ -122,34 +134,38 @@ class Module(ModelSQL, ModelView):
@classmethod
def on_write(cls, modules):
ids = set()
graph, packages, later = create_graph(get_module_list())
dependencies = set()
def get_parents(module):
parents = set(p.id for p in module.parents)
for p in module.parents:
parents.update(get_parents(p))
return parents
def get_childs(module):
childs = set(c.id for c in module.childs)
for c in module.childs:
childs.update(get_childs(c))
return childs
for module in modules:
if module.name not in graph:
continue
def get_parents(module):
parents = set(p.name for p in module.parents)
for p in module.parents:
parents.update(get_parents(p))
return parents
dependencies = get_parents(module)
def get_childs(module):
childs = set(c.name for c in module.childs)
for c in module.childs:
childs.update(get_childs(c))
return childs
dependencies.update(get_parents(module))
dependencies.update(get_childs(module))
ids |= set(x.id for x in cls.search([
('name', 'in', list(dependencies)),
]))
return list(ids)
return list(dependencies)
@classmethod
@ModelView.button
@filter_state('uninstalled')
def install(cls, modules):
modules_install = set(modules)
graph, packages, later = create_graph(get_module_list())
def get_parents(module):
parents = set(p for p in module.parents)
for p in module.parents:
parents.update(get_parents(p))
return parents
for module in modules:
if module.name not in graph:
missings = []
@@ -158,24 +174,25 @@ class Module(ModelSQL, ModelView):
missings = [x for x in deps if x not in graph]
cls.raise_user_error('missing_dep', (missings, module.name))
def get_parents(module):
parents = set(p.name for p in module.parents)
for p in module.parents:
parents.update(get_parents(p))
return parents
dependencies = list(get_parents(module))
modules_install = cls.search([
('name', 'in', dependencies),
('state', '=', 'uninstalled'),
])
cls.write(modules_install + [module], {
'state': 'to install',
})
modules_install.update((m for m in get_parents(module)
if m.state == 'uninstalled'))
cls.write(list(modules_install), {
'state': 'to install',
})
@classmethod
@ModelView.button
@filter_state('installed')
def upgrade(cls, modules):
modules_installed = set(modules)
graph, packages, later = create_graph(get_module_list())
def get_childs(module):
childs = set(c for c in module.childs)
for c in module.childs:
childs.update(get_childs(c))
return childs
for module in modules:
if module.name not in graph:
missings = []
@@ -184,24 +201,15 @@ class Module(ModelSQL, ModelView):
missings = [x for x in deps if x not in graph]
cls.raise_user_error('missing_dep', (missings, module.name))
def get_childs(name, graph):
childs = set(x.name for x in graph[name].childs)
childs2 = set()
for child in childs:
childs2.update(get_childs(child, graph))
childs.update(childs2)
return childs
dependencies = list(get_childs(module.name, graph))
modules_installed = cls.search([
('name', 'in', dependencies),
('state', '=', 'installed'),
])
cls.write(modules_installed + [module], {
'state': 'to upgrade',
})
modules_installed.update((m for m in get_childs(module)
if m.state == 'installed'))
cls.write(list(modules_installed), {
'state': 'to upgrade',
})
@classmethod
@ModelView.button
@filter_state('to install')
def install_cancel(cls, modules):
cls.write(modules, {
'state': 'uninstalled',
@@ -209,6 +217,7 @@ class Module(ModelSQL, ModelView):
@classmethod
@ModelView.button
@filter_state('installed')
def uninstall(cls, modules):
cursor = Transaction().cursor
for module in modules:
@@ -228,11 +237,13 @@ class Module(ModelSQL, ModelView):
@classmethod
@ModelView.button
@filter_state('to remove')
def uninstall_cancel(cls, modules):
cls.write(modules, {'state': 'installed'})
@classmethod
@ModelView.button
@filter_state('to upgrade')
def upgrade_cancel(cls, modules):
cls.write(modules, {'state': 'installed'})