def load_custom_module_terms(self, mods, langs): # 该操作耗时较长,将流程与系统原有流程分离。 # res = super(IrTranslation, self).load_module_terms(modules, langs) mod_dict = { mod.name: mod.dependencies_id.mapped('name') for mod in mods } modules = topological_sort(mod_dict) res_lang = self.env['res.lang'].sudo() for lang in langs: res_lang.load_lang(lang) for module_name in modules: modpath = get_module_path(module_name) if not modpath: continue for lang in langs: context = dict(self._context) lang_code = tools.get_iso_codes(lang) lmch_extra_file = get_lmch_extra_file(module_name, lang_code) if lmch_extra_file: _logger.info( u'模块 %s: loading lmch extra translation file (%s) for language %s', module_name, lang_code, lang) tools.trans_load(self._cr, lmch_extra_file, lang, verbose=False, module_name=module_name, context=context) return True
def _update_translations(self, filter_lang=None): if not filter_lang: langs = self.env['res.lang'].search([('translatable', '=', True)]) filter_lang = [lang.code for lang in langs] elif not isinstance(filter_lang, (list, tuple)): filter_lang = [filter_lang] update_mods = self.filtered(lambda r: r.state in ('installed', 'to install', 'to upgrade')) mod_dict = { mod.name: mod.dependencies_id.mapped('name') for mod in update_mods } mod_names = topological_sort(mod_dict) self.env['ir.translation'].load_module_terms(mod_names, filter_lang)
def _update_translations(self, filter_lang=None, overwrite=False): if not filter_lang: langs = self.env['res.lang'].get_installed() filter_lang = [code for code, _ in langs] elif not isinstance(filter_lang, (list, tuple)): filter_lang = [filter_lang] update_mods = self.filtered(lambda r: r.state in ('installed', 'to install', 'to upgrade')) mod_dict = { mod.name: mod.dependencies_id.mapped('name') for mod in update_mods } mod_names = topological_sort(mod_dict) self.env['ir.translation']._load_module_terms(mod_names, filter_lang, overwrite)
def _topological_sort(self, addons_tuple): """Returns a list of sorted modules name accord to the spec in ir.module.module that is, application desc, sequence, name then topologically sorted""" IrModule = self.env['ir.module.module'] def mapper(addon): manif = odoo.modules.module.get_manifest(addon) from_terp = IrModule.get_values_from_terp(manif) from_terp['name'] = addon from_terp['depends'] = manif.get('depends', ['base']) return from_terp manifs = map(mapper, addons_tuple) def sort_key(manif): return (not manif['application'], int(manif['sequence']), manif['name']) manifs = sorted(manifs, key=sort_key) return misc.topological_sort({manif['name']: manif['depends'] for manif in manifs})
# '%Y-%m-%d %H:%M:%S' flat_list = misc.flatten([[['a', 'b'], 'c'], 'd', [], ['e', [], 'f']]) # ['a', 'b', 'c', 'd', 'e', 'f'] for num, el in misc.reverse_enumerate(['a', 'b', 'c', 'd']): print(num, el) # 3 d # 2 c # 1 b # 0 a misc.topological_sort({ 'a': ['b', 'c'], 'b': ['c'], 'd': ['a'], 'r': ['y'], 'y': ['z'] }) # ['b', 'a', 'd', 'y', 'r'] misc.scan_languages() # [('sq_AL', 'Albanian / Shqip'), # ('am_ET', 'Amharic / አምሃርኛ'), # ('ar_SY', 'Arabic / الْعَرَبيّة'), # ('eu_ES', 'Basque / Euskara'), # ('bs_BA', 'Bosnian / bosanski jezik'), # # ..] misc.human_size(1024 * 10)