![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
odoo
少奶奶的猪
python开发,web开发,odoo开发,前端开发,数据库,机器学习
展开
-
odoo----xpath语法
odoo 视图函数 在整个项目文件中,结构并不是十分明显,虽然它也遵循MVC设计,类比django的MTV模式,各个模块区分的十分明显,在Odoo中,视图的概念不是特别明显,很多时候,我们会将调用模型的函数直接写在models里边(即:类中)。而对于模版Tempelate部分,odoo里边反而称做“views”,如下是odoo典型模块,销售模块sale的代码结构:可以看到odoo的前端显示部分,对应的就是views,它是基于xml来实现的,而不是我们日常的html;今天要说的xpath语法,就是针对于原创 2020-12-15 10:05:05 · 3072 阅读 · 1 评论 -
odoo----模块代码修改后如何生效?
很多朋友在odoo模块修改后,重启服务器或者更新升级模块后不生效,这主要是由于python文件JS文件的特性决定的,可根据以下步骤处理:修改 python 文件: 必须重启服务,以重写编译生产 *.pyc 文件。 如果是修改函数,不需要升级模块,如果修改模型字段或依赖关系,需要升级模块。修改 XML 文件: 不需要重启服务, 升级相关模块。修改CSS 文件: 刷新浏览器重新加载。修改JS 文件: 刷新浏览器重新加载。如果还是不可以,则重起服务器后,先卸载模块然后再重新安装即可...原创 2020-12-14 14:34:16 · 1617 阅读 · 0 评论 -
Odoo----模型的内置方法(可按需重写)
https://www.cnblogs.com/ygj0930/p/10826222.html模型层面一:_table_exist检查该模型对于的数据库表是否存在,是则返回1,否则返回0.@api.model_cr def _table_exist(self): pass模型记录层面二:create(self,vals)记录的创建函数,一般情况下,是根据视图传过来的dict对象,生成模型记录。我们可以重写create方法:1)获取vals参数,从中提前数据进行校验原创 2020-12-14 14:30:57 · 856 阅读 · 0 评论 -
Odoo-----View 常用技巧
视图控制隐藏Field<field name="currency_id" invisible="True"/><field name="currency_id" invisible="1"/>在某种条件下隐藏<field name="expense_description" attrs="{'invisible':[('expense_audit','!=','1')]}" />隐藏label<field name="descripti原创 2020-12-01 23:12:36 · 478 阅读 · 0 评论 -
Odoo----引入自定义css样式
定义Form页面<?xml version="1.0" encoding="utf-8"?><odoo> <data> <record id="myquality_iqcbasesetup_form" model="ir.ui.view"> <field name="name">myquality.iqcbasesetup.form</field> <f.原创 2020-12-01 22:59:12 · 1475 阅读 · 0 评论 -
ODOO Many2one ondelete属性
class PinBan(models.Model): _name = "pinban.pinban" _description = "Pin Ban" pinban_ids = fields.One2many('pinban.record', 'pinban_id', string='工位记录') class PinBanRecord(models.Model): _name = "pinban.record" _description = 'P原创 2020-07-23 16:19:01 · 556 阅读 · 0 评论 -
ODOO 按日期分组
<filter string="日期" name="group_by_check_in_day" context="{'group_by':'check_in:day'}"/>我有个字段 check_in 是datetime类型的,我想按字段的date分组,也就是按日期,忽略掉时间我查看odoo源码,看odoo是怎么实现按日期分组的,我看到:<filter string="Date" name="groupby_date" domain="[]" context="{'group_原创 2020-07-23 16:17:43 · 561 阅读 · 0 评论 -
ODOO 在form视图中创建按钮并调用后台方法
在 from 视图中,允许增加 button ,并调用后台方法。实现方式:在表单视图的 form 标签中,插入 header 标签,在 header 标签中,定义button ,并在当前模块中,定义后台方法,就像这样,type=object ,name = 后台方法名: <!--Form View--> <record id="view_zerone_books_form" model="ir.ui.view"> <fi原创 2020-07-23 16:17:33 · 1325 阅读 · 0 评论 -
Odoo--saas开发
一、SaaS & 云计算—说起SaaS就绕不过云计算的概念,云计算的底层是基于虚拟化,从底层到上层,云计算包含三种服务模式,分别是:IaaS(Infrastructure-as-a-Service),基础设施即服务PaaS(Platform-as-a-Service),平台即服务SaaS(Software-as-a-Service),软件即服务SaaS模式,便是云计算的三种服务模式其中之一。上图中对比了传统IT服务架构和云计算几种服务架构,传统IT服务架构中,作为用户来讲,从底层原创 2020-11-19 10:56:23 · 1567 阅读 · 0 评论 -
Odoo----异常、错误、警告、提示、确认信息显示
1.检查业务逻辑中的错误,终止代码执行,显示错误或警告信息:raise osv.except_osv(_('Error!'), _('Error Message.'))示例代码:#删除当前销售单,需要验证销售单的状态 def unlink(self, cr, uid, ids, context=None): for rec in self.browse(cr, uid, ids, context=context): if rec.state not i原创 2020-11-19 10:46:02 · 2446 阅读 · 0 评论 -
Odoo----定义字段获取当前用户名
场景描述:在一些视图下,当系统用户创建某条记录的时候,需要给某个用户字段设置默认值,即:默认值为系统的当前登录用户,如何实现?处理方式:在定义模型的时候,给该字段赋值就可以:operator_uid = fields.Many2one(string=u"操作员", comodel_name='res.users', default=lambda self: self.env.user)...原创 2020-11-19 10:41:02 · 1800 阅读 · 0 评论 -
Odoo----跟踪字段值的改变(日志记录)
跟踪重要字段值的改变是ERP系统里面重要功能,也是审计的内容,SAP也是因为有这样的功能备受审计们的青睐,而作为业务管理经理们,在追责的过程中,也需要此项功能作为辅助手段。以前开发ERP系统的时候,弟兄们做这个功能吃力不讨好,因为在功能提升上不显著,而且会涉及到每个模块增加调整工作量,没少吃白眼。现在好了,Odoo有这个框架,可以很容易的实现这个审计追踪的功能,只需要在关键字段定义处添加:track_visibility=“always”我们把病人姓名和年龄作为需要跟踪修改的字段,只要修改patien原创 2020-11-19 10:37:12 · 1384 阅读 · 0 评论 -
Odoo----Compute Field计算字段
什么叫Compute Field?直接翻译过来就是计算字段,也就是说它的结果依赖于其他数据的计算结果或判断结果。我们今天在这里讲解的就是这种类型的字段如何在Odoo实现。病人有年龄之分,我们让系统根据年龄进行分组显示。首先,我们要建立一个年龄分组的计算字段age_group,分别在patient.py实现计算功能,在patient_menu.xml的Form View和Tree View里面添加这个年龄分组的计算字段用于编辑和显示patient.py: 要点在compute=‘set_age_grou原创 2020-11-19 10:34:42 · 1490 阅读 · 2 评论 -
Odoo----from视图中显示每条记录的名称
截止到目前,我们Hospital模块的Patient数据显示在Form上有点奇怪,就是在标题栏位显示出来的是Odoo保存的这条记录的自动编号(hospital.patient,1),这个就不太友好和直观了。我们通常的做法是显示病人的姓名,或者说显示名称,因为中国公司里面外国人越来越多,有的人证件上的名字又20个字符那么长,但是他们通常用简称,像Odoo这样的系统就很好的提供了这种支持, 首先要升级一下patient.py代码,增加一个patient_disp_name并赋给Odoo的一个系统字段_rec原创 2020-11-19 10:03:05 · 554 阅读 · 0 评论 -
Odoo-----在Form视图中添加Chatter
标准的Odoo表单界面下面都提供有聊天,登记日志,安排下一期工作和添加附件的功能,这个功能英文叫Chatter首先,我们要改造一下patient.py,就添加了_inherit这一行。不过mixin类是一个Odoo用于多重继承扩展的类型,非常有用,很好的诠释了编码的DRY(Don’t Repeat Yourself)原则。mixin类我们后面再详细谈class HospitalPatient(models.Model): _name = 'hospital.patient' _inher原创 2020-11-19 09:58:55 · 739 阅读 · 0 评论 -
Odoo-----视图继承
简介继承在odoo里可以通过继承的方式来改写已经存在的view对比view的定义视图定义中写法多了inherit_idinherit_id指向要改写的view <field name="inherit_id" ref="id_category_list"/>在arch里用xpath定位改写的元素<!-- 改写 ibuilding list 列表视图 --><record id="building_list_view" model="ir.ui.原创 2020-11-19 09:33:38 · 2506 阅读 · 6 评论 -
Odoo-----计算字段、onchange 机制、模型约束
DomainDomain 代表记录集的条件表达式。Domain 是定义模型子集的规则集合。每个规则是一个包含名称、操作和值的三元组例如,下面是Product模型子集的Domain表达式,“单价大于1000且类型为服务”的记录集:[('product_type', '=', 'service'), ('unit_price', '>', 1000)]多个规则组合时,默认条件组合方式是AND。逻辑运算符&(AND),|(OR),!(NOT)可以用来显示的组合多个规则。它们在前缀位置使用(原创 2020-11-18 10:18:05 · 1414 阅读 · 0 评论 -
Odoo-----字段常用属性
隐藏字段<field name="currency_id" invisible="True"/><field name="currency_id" invisible="1"/>在某种条件下隐藏<field name="expense_description" attrs="{'invisible':[('expense_audit','!=','1')]}" />隐藏标签<field name="description" widget="html"原创 2020-11-16 22:47:05 · 582 阅读 · 0 评论 -
Odoo-----JS的继承机制
ODOO中JS的继承有什么用?odoo官方文档戳这里Odoo中有相当多的视图,挂件等组件,在产品拥有个性化定制需求的时候,我们要修改某些widgets或者classes,那么就需要理解Odoo中前端框架的JS架构,并且掌握继承JS的方法。JS继承方法var new_class = demo_class.extend({ demo_method: function() { return "demo class"; },});使用extend()方法可以新建子类,编原创 2020-11-16 13:45:30 · 767 阅读 · 0 评论 -
Odoo-----Javascript 参考指南
本文介绍了odoo javascript框架。从代码行的角度来看,这个框架不是一个大的应用程序,但它是非常通用的,因为它基本上是一个将声明性接口描述转换为活动应用程序的机器,能够与数据库中的每个模型和记录交互。甚至可以使用Web客户端修改Web客户端的接口。这里有一个有用的html版本的文档:Javascript API概览这个Javascript框架主要设计用于三个地方使用:web客户端:这是一个私有的web应用,可以在其中查看和编辑业务数据。这是一个单页应用程序(永远不会重新加载该页,只在原创 2020-11-16 13:40:57 · 2033 阅读 · 0 评论 -
Odoo-----button 应用
按钮< button>,支持的属性:icon 可用的icon在 addons/web/static/src/img/iconsstring 按钮的显示文字type 值可以是 workflow, object action 默认是 workflowname 就是要触发的方法标识args 传递方法的参数content 上下文confirm 针对对话框的确认special="cancel" 用于向导states 可见的状态classname 加载的类名(常用 oe_h原创 2020-11-13 20:30:14 · 1360 阅读 · 0 评论 -
Odoo----env详解
一:environmentenvironment类提供了对ORM对象的封装,同时提供了:1)注册类的访问:对于继承Model类来说可以直接通过self.env对environment进行操作。2)记录集的缓存:清除缓存可以使用environment对象的invalidate_all()方法进行。3)管理重计算的数据结构。二:env的属性列表user:返回当前用户self.env.user lang:返回当前语言代码self.env.lang in_draft:返回是否处原创 2020-11-09 14:22:27 · 1411 阅读 · 0 评论 -
Odoo----如何使用context
<field name="partner_id" string="Customer"widget="res_partner_many2one"context="{'default_name': contact_name, 'default_street': street, 'default_city': city, 'default_state_id': state_id, 'default_zip': zip, 'default_country_id': country_id, 'default原创 2020-11-09 14:05:45 · 1497 阅读 · 0 评论 -
Odoo----如何更新context
Odoo开发人员在工作过程中都会遇到需要向self. env. context添加一些东西的问题。 他们不知道该怎么做。 今天让我们更详细地讨论这个问题。 因此,何时需要更新上下文:1)您需要设置一些默认值2)您需要发送想要在其他函数中获取的某种信息什么是context要获得答案,我们将参考以下Odoo.com提供的responses:context是python字典,用于将某些数据传递给方法。由于几乎所有方法都具有context参数,因此您可以使用context通过多个级别的python方法传原创 2020-11-09 13:55:48 · 1452 阅读 · 1 评论 -
Odoo---- @api.onchange使用
【οnchange=前端js函数,可以实现前端实时更新以及修改验证】onchange机制:不需要保存数据到数据库就可以实时更新用户界面上的显示。@api.onchange('监听的字段', '监听的字段'。。。)def _onchange_受影响的字段(self): # set auto-changing field self.受影响的字段 = 根据监听字段计算出受影响字段的值也可以监控某字段值的变化,如果异常则报错:@api.onchange('监听的字段')def _ver原创 2020-11-09 13:26:11 · 1476 阅读 · 0 评论 -
Odoo----hooks的使用
挂钩是在现有代码之前,之后或代替现有代码执行的函数。在odoo中,挂钩是在模块的__init__.py内部定义的函数的字符串表示形式。简单理解就像一些外来的钩子,在源代码之间钩取一些信息,当捕捉到感兴趣的事时,就拦截下来,让自己的代码执行一下,处理一下这个信息,然后再放出去继续之前的进程。这样就可以在不用改变源代码的情况下,做一些别的事情,比方说监控、分析和一些恶意的事引用知乎上著名的示意图在odoo挂钩中,以下类型的挂钩:pre_init_hookpost_init_hook原创 2020-11-07 16:37:32 · 1022 阅读 · 0 评论 -
Odoo----wizard 向导页的使用方法
概述Odoo 中有不少地方涉及对话向导页面模式,这种功能页很方便灵活,可以随意产生自已定义的表单/动作交互操作流,下面我们就举例讲解具体使用方法方法以odoo中“更新模块列表”这个操作为例定义模型class BaseModuleUpdate(models.TransientModel): _name = "base.module.update" _description = "Update Module" updated = fields.Integer('Number原创 2020-11-06 15:25:47 · 1846 阅读 · 0 评论 -
Odoo----self详解
介绍python中一切皆对象!odoo基于python开发,那么odoo中也可以理解成一切皆对象。我们在python中定义类的时候,一般会用到self,用来表示当前对象自己。那么odoo中的self除了python语法中,自带的用法,还有哪些特殊的用法呢?一:self是什么目前新版的Odoo中使用到的self,是对 游标cr、用户ID、模型、上下文、记录集、缓存 的封装。我们可以通过 self.XX 获取到这些封装的东西,比如:self.cr、self.uid。对象self.env提供原创 2020-11-05 16:53:24 · 845 阅读 · 0 评论 -
Odoo----Qweb简单介绍
定义:Qweb被用作OpenERP的web客户端模板引擎。它是一种基于XML的模板语言。特征:完全在客户端浏览器中完成渲染一个模板文件中可以包含多个模板,通常一个模板文件中包含一个模板对OpenERP的web组件有很好的支持,也可以用于除开OpenERP web外的其他框架Odoo中的Qweb关键点说明Qweb模板在XML属性上加前缀“t-”表示t-name:模板名称,如:<t t-name="message"></t>t-foreach=iter原创 2020-10-27 16:09:40 · 1881 阅读 · 0 评论 -
Odoo----odoo13版本更新内容
总结了 odoo12 --> odoo13 的部份不同,分为 1 模型,2 视图,3 前端开发, 4 业务逻辑三大部份Tip: 可通过指令操作找出需要改的后端代码grep -nri 'oldname\|sudo([^\)]\+)\|api.multi\|api.returns\|api.one\|api.cr\|api.model_cr\|12.0\|compute=' $MODULE1.废除 @api.multi等13的后端方法直接def,不允许再跟此装饰器,因为已废除2.移除下面原创 2020-10-26 09:12:41 · 426 阅读 · 0 评论 -
Odoo----的消息系统 - Mail 模块 - Discuss 应用
Odoo 的 Mail 就是那个 Discuss 应用,但同时也是一个基础模块。所谓基础模块,就是几乎所有的 Odoo 应用都依赖了 Mail 模块。一般来说 打开 Odoo 默认应用就是 Discuss,在 Discuss 中可以收发邮件,建立 Channel,收发相关 Channel 的消息。所谓 Channel 就是一个对话过程,有一对一的,也有多人的(就是聊天群)。通过建立 Channel 可以和 Odoo 的用户进行实时消息通讯。以前我曾经写过一个 Odoo 的登录用户是如何监听自己所关心的转载 2020-10-24 17:30:38 · 1624 阅读 · 1 评论 -
Odoo----constraints 使用
Odoo中的约束一:装饰器约束(字段约束)装饰器参数指定了约束的字段,当涉及的字段中任一发生改变时触发方法执行。如果不满足约束条件,该方法将引发异常。@api.constrains('约束字段')def _check_something(self): for record in self: if record.约束字段 op 值: raise ValidationError("异常信息")Constraints:@api.constrains('instructo原创 2020-10-22 14:12:21 · 869 阅读 · 0 评论 -
Odoo----高级服务端开发技巧
修改运行指定动作用户在书写业务逻辑代码时,常会需要在不同权限上下文中操作动作,比如使用管理员权限绕过权限检查。下面我们来看一下普通用户如何使用 sudo()来修改公司电话号码。默认仅 Administration/Access Rights 用户组的用户可修改 res.company 记录。from odoo import models, apiclass ResCompany(models.Model): _inherit = 'res.company' @api.multi原创 2020-07-25 09:41:40 · 591 阅读 · 0 评论 -
Odoo----调试与自动化测试
标题生成服务器日志来帮助调试方法服务器崩溃时使用日志可以帮助查看运行时的情况,下面介绍如何为现有方法添加日志。例如下面的代码中加入了日志语句,存储产品的库存等级到一个文件中from os.path import join# 1. 代码开头从 Python 标准库引用 logging 模块import logging from odoo import models, api, exceptions EXPORTS_DIR = '/srv/exports'# 2.在定义模型类之前,为模块获取转载 2020-07-24 17:26:44 · 1607 阅读 · 0 评论 -
odoo----相关知识点
导入模块可以起别名:新的模型前端要调用显示有关联的另一个模型的相关字段传递上下文 搜索视图打开默认按照接收的参数搜索显示:发起端视图 上下文写法:目标端 触发显示,搜索视图写法 注意字段名要写对!!!前端显示 模型名 而不是指定的字段名原因是,后台模型里边没有写 _rec_namexml中option 作用:模型中字段如果 添加store=True属性 那么comput方法会不执行!!!向导视图前端字段 显示 隐藏的写法。取消隐藏 关联字段的创原创 2020-07-24 17:03:37 · 445 阅读 · 0 评论 -
odoo----权限机制
第一篇:http://www.cnblogs.com/dancesir/p/6994030.htmlOdoo的权限的核心是权限组(res_groups)。对每个权限组,可以设置权限组的菜单表示,对象表示,记录规则表示,字段表示。1.菜单/对象级别设置哪些人可以访问哪些菜单/对象,对象的访问权限包括创建、读、写、删除。2.记录级别设置哪些人可以访问哪些记录,也就是设置表的查询条件。3.字段级别设置表中的字段的访问权限。4.工作流级别在工作流的每一步迁移中,设置哪些角色允许触发本迁移菜单/对原创 2020-07-24 16:54:28 · 964 阅读 · 0 评论 -
odoo----self详解
python中一切皆对象!odoo基于python开发,那么odoo中也可以理解成一切皆对象。我们在python中定义类的时候,一般会用到self,用来表示当前对象自己。那么odoo中的self除了python语法中,自带的用法,还有哪些特殊的用法呢?一:self是什么目前新版的Odoo中使用到的self,是对 游标cr、用户ID、模型、上下文、记录集、缓存 的封装。我们可以通过 self.XX 获取到这些封装的东西,比如:self.cr、self.uid。二:通过直接设置属性来改变数原创 2020-07-24 16:19:34 · 545 阅读 · 0 评论 -
odoo----附件上传
附件上传基本原理实现,可以参考这篇:https://www.cnblogs.com/ljwTiey/p/7348291.htmlhttp://blog.csdn.net/wangnan537/article/details/41903159首先我们看一下odoo界面默认的附件功能,有木有感觉不是很友好!囧 :)下面给小伙伴们介绍另一种odoo自带的附件管理方式!首先,在你的模型中增加如下定义:###################################################原创 2020-07-24 16:16:38 · 1212 阅读 · 0 评论 -
odoo----odoo可用小图标
odoo系统的小图标都采用了 fontawesome字体图标官网: http://fontawesome.dashgame.com/Github:http://fortawesome.github.io/Font-Awesome/icons odoo可用:https://www.slideshare.net/TaiebKristou/odoo-icon-smart-buttonsodoo xml视图中引用小图标# 首先打开官网 http://fontawesome.dashgame.com/原创 2020-07-24 16:11:24 · 657 阅读 · 0 评论 -
odoo----用户配置界面增加模块访问权限
在odoo设置界面,点击用户,进入用户配置界面,会看到:访问权 | 个人资料菜单在访问权 page菜单界面,可以看到系统预制的一些模块都会显示在这里,那么,我们自己开发的模块如何显示在这块呢,从而方便在创建用户的时候,给该用户访问我们自己开发模块的权限!实现方式:在odoo后台代码中增加两个文件,并在__manifest__.py中申明引用这两个文件。具体编写:新建两个文件夹:(1) 在自己模块根目录下,创建data 和 security 两个目录,一般这两个目录也是平时odoo模块开原创 2020-07-24 16:09:09 · 902 阅读 · 1 评论