odoo研究学习:刷新本地模块列表都干了什么事?

模块信息存储在ir.module.module 数据表中

平时在开发过程中经常会刷新本地模块列表,例如:新增了模块、更新了模块基础信息、更换了模块图标等等,在点击‘更新’按钮的时候odoo平台到底干了哪些事?

后台代码:

# update the list of available packages@assert_log_admin_access@api.modeldef update_list(self):    res = [0, 0]    # [update, add]

    default_version = modules.adapt_version(‘1.0‘)    known_mods = self.with_context(lang=None).search([])    known_mods_names = {mod.name: mod for mod in known_mods}

    # iterate through detected modules and update/create them in db    for mod_name in modules.get_modules():        mod = known_mods_names.get(mod_name)        terp = self.get_module_info(mod_name)        values = self.get_values_from_terp(terp)

        if mod:            updated_values = {}            for key in values:                old = getattr(mod, key)                updated = tools.ustr(values[key]) if isinstance(values[key], pycompat.string_types) else values[key]                if (old or updated) and updated != old:                    updated_values[key] = values[key]            if terp.get(‘installable‘, True) and mod.state == ‘uninstallable‘:                updated_values[‘state‘] = ‘uninstalled‘            if parse_version(terp.get(‘version‘, default_version)) > parse_version(mod.latest_version or default_version):                res[0] += 1            if updated_values:                mod.write(updated_values)        else:            mod_path = modules.get_module_path(mod_name)            if not mod_path:                continue            if not terp or not terp.get(‘installable‘, True):                continue            mod = self.create(dict(name=mod_name, state=‘uninstalled‘, **values))            res[1] += 1

        mod._update_dependencies(terp.get(‘depends‘, []))        mod._update_exclusions(terp.get(‘excludes‘, []))        mod._update_category(terp.get(‘category‘, ‘Uncategorized‘))

    return res

 注解1:

@assert_log_admin_access:验证是否为administrator用户,其实就是在验证是否具有管理员权限,跟踪了一下后台调用user._is_admin,如果在验证的时候如果不是administrator权限用户就会跳出异常。注解2:
@staticmethoddef get_values_from_terp(terp):    return {        ‘description‘: terp.get(‘description‘, ‘‘),        ‘shortdesc‘: terp.get(‘name‘, ‘‘),        ‘author‘: terp.get(‘author‘, ‘Unknown‘),        ‘maintainer‘: terp.get(‘maintainer‘, False),        ‘contributors‘: ‘, ‘.join(terp.get(‘contributors‘, [])) or False,        ‘website‘: terp.get(‘website‘, ‘‘),        ‘license‘: terp.get(‘license‘, ‘LGPL-3‘),        ‘sequence‘: terp.get(‘sequence‘, 100),        ‘application‘: terp.get(‘application‘, False),        ‘auto_install‘: terp.get(‘auto_install‘, False),        ‘icon‘: terp.get(‘icon‘, False),        ‘summary‘: terp.get(‘summary‘, ‘‘),        ‘url‘: terp.get(‘url‘) or terp.get(‘live_test_url‘, ‘‘),        ‘to_buy‘: False    }

在执行update_list方式中条用get_values_from_terp方法,返回应用信息,判断是否与old信息一致,执行更新write方法。在icon字段方面,在模型ir.module.module中还有一个icon_image字段,以base64形式存储icon,在icon更新时触发icon_image的更新写入操作:
@api.depends(‘icon‘)def _get_icon_image(self):    for module in self:        module.icon_image = ‘‘        if module.icon:            path_parts = module.icon.split(‘/‘)            path = modules.get_module_resource(path_parts[1], *path_parts[2:])        else:            path = modules.module.get_module_icon(module.name)        if path:            with tools.file_open(path, ‘rb‘) as image_file:                module.icon_image = base64.b64encode(image_file.read())

以上为当前的理解,但仍有一事不明:这两个_name = "ir.module.module"什么关系?



原文地址:https://www.cnblogs.com/yanhuaqiang/p/10631890.html

时间: 2024-11-10 19:09:11

odoo研究学习:刷新本地模块列表都干了什么事?的相关文章

Nginx学习指南之模块的应用

一.自述 Nginx模块功能也是相当的丰富,但对于Apache Web来说,两者之间还是有区别的,大家都知道Nginx模块是直接被编译进了nginx.conf配置文件,而Apache则是被编译成为.SO文件,有些是需要在httpd.conf配置文件中指定是否加载,这样才能激活模块功能.Nginx模块有三个角色,Handlers(处理一个HTTP请求,并产生输出):Filters(处理由一个handler生成的输出):load-balancers(负载均衡器,当后端服务器符合一个以上后,依据算法选

React-Native之IOS本地模块的应用实践分享(仅此一篇足以...)

前言 React-Native从诞生至今,火热程度已经不言而喻,在不断的框架迭代过程中,RN也提供了丰富的组件,以供开发者使用,但是在实际应用中,我们可能需要更为丰富的交互组件,但是RN中又没有及时提供,这时候我们就需要使用RN的本地模块,本地模块即可以使用JS调用Native,也可以使用Native调用JS, 并传递各种参数,实现完整功能,接下来我们看看具体的使用方法,方便大家参考学习,如果想了解更多,我们可以查阅官方的文档. 下面文章中,我会经常用到RN,即为React Native的缩写,

开源学习--SlideExpandableListView中的列表项动画实现框架分析

前面的话 开源项目Android-SlideExpandableListView是一个简单的介绍列表项动画展示的小型项目,分析这个项目可以对自定义框架及列表类动画实现有个比较清晰的认识,工作中中时常根据需求扩展定义自己的适配器,虽然具体需求不同,但架构类似,本文把最近关于该开源项目的研究心得整理分享,共同学习~ 项目简介 github地址https://github.com/tjerkw/Android-SlideExpandableListView 这是个入门级的列表项动画展示框架,实现效果如

跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])

跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据]) 写了几个月,总算有点盼头了,最终要从后台取得数据了.后台的spring mvc 和 service 仅仅能简单的说说了,里面加了几十个类.有兴趣的下载了源代码自己看.以下画张通用的模块列表取数据的流程,这个流程是适用于全部的模块.我这个后台处理程序也是对全部的模块进行统一处理,包含数据查找,新增,改动,删除都是同样的. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamZvaw==

利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)

原文:利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习) Mono.Cecil是一个强大的MSIL的注入工具,利用它可以实现动态创建程序集,也可以实现拦截器横向切入动态方法,甚至还可以修改已有的程序集,并且它支持多个运行时框架上例如:.net2.0/3.5/4.0,以及silverlight程序 官方地址:http://www.mono-project.com/Cecil 首先,我先假想有一个这样的商业组件,该组件满足了以下条件: 1. 该程序集的代码被混淆过了 2. 该程序

菜菜鸟Zend Framework 2 不完全学习涂鸦(四)-- 模块

菜菜鸟Zend Framework 2 不完全学习涂鸦(四)-- 模块 这是涂鸦的第四篇 模块(Modules) ZF2 是一个模块系统,而你需要在每个模块中组织你主要应用代码.由模板(skeleton)所提供的应用程序模块在整个应用程序中被用作引导(bootstrapping),错误(error)和路由设置(routing configuration).它经常被用作提供应用级别控制,例如,应用程序的首页.但是在这个教程中我们不使用默认的模块,我们将使用唱片列表来作为应用程序的首页. 我们将代码

(转)织梦后台模块列表不显示的原因以及四种解决方法

最近,kdchxue在学习织梦的建站,可是遇到了这样的问题,织梦的后台模块列表没有办法显示.kdchxue在网上一搜,发现出现这样的原因的用户可不是少数,于是小编在网上冲浪了一般,结合自己的实际经验,给大家分析了织梦的后台模块列表无法显示的原因做了剖析,以及解决的方法! 虽然说织梦CMS是一款非常优秀的开源CMS程序,但在使用织梦DedeCMS的过程中,我们还是会遇到一些很恼火的事情,比如模块管理列表无法显示,无法对模块进行卸载,这个是非常影响心情的.造成织梦模块管理列表无法显示的原因,可能有很

【python标准库学习】re模块

1.什么是re 正则表达式一门相对通用的语言,在python中也有对正则表达式的支持,那就是的内置re模块.正则表达式就是一系列的规则去匹配字符串然后进行相应的操作,这些规则网上一搜一大片,而re则是运用正则表达式来提供一系列的功能强大的接口让我们来调用.通常我们在对日志文件进行操作的时候会对正则表达式运用的比较多来得到我们希望得到的数据. 2.python中的转义符 正则表达式中通常用反斜杠'\'来代表转义,'\d'代表数字等,但是python本身也是通过反斜杠'\'来表示转义,所以就和正则表

Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解

Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解 概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅拷贝.深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新列表l1 = [1, 2, 3, 4, 5]# 对l2赋值l2 = l1print(l1)l2[0] = 100print(l1) 示例结果: [1, 2, 3, 4, 5][100, 2, 3, 4, 5] 可以看到,更改赋