windows环境配置
-
安装开发工具PyCharm
-
安装Python
-
安装PostgreSQL数据库管理工具
-
下载并配置odoo
odoo13代码:https://github.com/odoo/odoo/archive/13.0.zip
- 创建oddo.conf
-
[options] addons_path = D:\software\ODOO\odoo-win-14\odoo14-bygitzip\addons data_dir = odoofile db_host = 192.168.109.130 db_maxconn = 64 db_name = odoo db_user = root db_password = root db_port = 5432 loglevel = debug db_template = template0 longpolling_port = 8072 xmlrpc_port = 8013
**python可以是虚拟环境也可以是主环境可能会影响到其他使用Pyhton的程序,比如你的Django工程**。将代码通过pychram打开 打开FileSettings选择ProjectInterpreter --showAll--add--新虚拟环境就会存在一个venv的文件夹
-
启动虚拟环境
cd odoo14-bygitzip/venv/Scripts ./Activate.ps1 #powershell activate.bat #cmd
虚拟环境中安装依赖
cd odoo14-bygitzip pip install -r odoo/requirements.txt #此步骤也可在pychram中 在启动虚拟环境后 可以在开发工具中打开终端Terminal 可以直接到venv操作命令,执行上述命令即可
配置环境后期补充
安装和配置 Samba
作用:
Samba服务让我们能够在Linux下实现与Windows兼容的文件共享服务。在Debian/Ubuntu系统中,可以使用下列命令安装Samba服务:
$ sudo apt-get install samba samba-common-bin
samba包用于安装文件共享服务,smbpasswd工具需要samba-common-bin包。缺省情况下,用户需要通过smbpasswd注册后才能够访问文件的文件。我们需要注册一个用户odoo,然后为之设置一个密码用于文件共享访问:
$ sudo smbpasswd -a odoo
输入此命令后,将提示为为此用户输入密码,此密码用于访问共享的目录。完成后odoo用户将能够访问他的用户主目录,尽管只是只读访问。如果需要有写入权限,我们需要按下面的内容修改Samba的配置文件。
$ sudo nano /etc/samba/smb.conf
在配置文件中,查找到[homes]部分。编辑其相应配置行使其匹配如下配置:
[homes]
comment = Home Directories
browseable = yes
read only = no
create mask = 0640
directory mask = 0750
为了使配置生效,需要重启服务:
$sudo /etc/init.d/smbd restart
建议
下载示例代码
在Packt 账户中,您可以下载所有购买过的书籍的示例代码,Packt链接为:http://www.packtpub.com. 如果是从其他地方购买的书籍,您可以访问http://www.packtpub.com/support , 注册后便能通过邮件获取示例代码文件。
为了从Windows访问这些文件,我们可以使用特殊的用户名和定义为smbpasswd的密码来为路径 \\<my-server-name>\odoo 映射一个网络驱动。当使用odoo用户登录时,您可能会遇到Windows将计算机的域添加到用户名的问题(例如:MYPC\odoo)。为了避免这种情况,我们通过增加 \ 前缀的空域来登录(例如,\odoo):
如果我们用Windows Explorer来打开网络驱动,我们将能够访问和编辑odoo用户的主目录的内容:
转存失败重新上传取消
Odoo包含一些对开发者很有帮助的工具,我们将在整本书中用到它们。包括技术特点和开发者模式,默认状态下它们是关闭的,所以这是一个好机会去了解和启用它们。
==============以下开发步骤=============
1.虚拟机与windows通过vm共享文件夹
2.将虚拟机共享的目录文件夹 里面通过git安装odoo
git clone https://github.com/odoo/odoo.git -b 14.0 --depth=1 #指定14版本,和git一个历史版本减少下载
3.安装后在pycharm中open windows中的这个共享文件夹里面的代码,等待编译完成,在右键run odoo-bin 然后edit config... 编辑启动参数 添加-c odoo.conf
##odoo.conf文件内容
[options]
addons_path = D:\software\ODOO\odoo14\addons
data_dir = odoofile
db_host = 192.168.109.130
db_maxconn = 64
db_name = odoo
db_user = root
db_password = root
db_port = 5432
loglevel = debug
db_template = template0
longpolling_port = 8072
xmlrpc_port = 8012
通过启动即可
添加新模块
Odoo提供了脚手架机制来快速创建新模块,例如创建“modeName”的模块
odoo-bin scaffold modeName addons
进入【设置】,在【开发者工具】区域,点击 “ 启用开发者模式 ” 。
菜单栏上点击【更新应用列表】,进行 “模块更新”。
开发者调试模式
正常情况下,代码文件发生改变需要重启odoo进程或升级模块,对开发者来说,频发的Ctrl+C和upgrade有时候比较费事,Odoo提供了一种免重启的模式,当代码文件发生变化时自动重载并更新视图文件,大大简化了开发的步骤。
启动这个模式的命令是在启动odoo的命令后添加一个–dev参数:
| |
注意:可能会碰到下面的错误:
| |
这是因为缺少依赖库inotify, 使用pip命令安装即可:
| |
views.xml相关说明
关于form tree中的name说明;在界面中并无任何视图上的影响, 应该是用于编码人员区别代码作用,类似与TODO 的提示作用 比如note的说明效果
关于 many2one中的ondelete说明
restrict: 表示无删除按钮
不写ondelete:表示有删除按钮
no action: 表示无删除按钮
odoo权限文件ir.model.access.csv字段详解
id:权限id,默认规则是access_模块名_类名,还没发现有什么用
name:权限名,默认规则是模块名.类名,还没发现有什么用
model_id:id:这个是固定写法,规则是model_模块名_类名,其它地方引用权限会用这个id
group_id:id:组id,这里的base.group_user是系统内置组,即员工.员工组,创建帐户时,默认属于这个组。所以给这个组赋权限,相当于给新帐户的默认权限。
perm_read,perm_write,perm_create,perm_unlink:对应读、写、增加、删除权限,1是有权限,0是无权限,具体根据需要来设置权限
7.0之前的API
当年那是Odoo还叫OpenERP的时代,OpenObject对象的方法通常都需要带着几个固定的参数:cr,uid,ids,context等等,写起来很繁琐,比如下面的例子:
1 2 | def btn_import(self,cr,uid,ids,context=None): ... |
到了8.0,可能Odoo官方的开发人员也觉得这样写起来太繁琐了,于是乎,他们引入了新API,封装在api.py文件中,主要有一下几种类型:
- model
- multi
- one
- constrains
- depends
- onchange
- returns
one
作用: 表示被封装的方法接受单一的对象,用于处理一些单个对象的方法。
返回值: [None](部分不负责的教程里说不返回值)
v7版本写法: def funct(self,cr,uid,ids,context)
举例:
视图文件中添加一个按钮,对应的触发方法:
1 2 3 | @api.one def button_test(self): self.name = "xxx" |
multi
作用:表示被封装的方法接收一个集合对象,正好与one对应。
返回值: 被封装方法的返回值
v7版本写法: model.method(cr, uid, ids, args, context=context)
multi典型的用法即odoo对象的write方法:
1 2 3 4 | @api.multi def write(self, vals): res = super(Book, self).write(vals) return res |
这里的self是一个集合对象,vals是待更新的字段和值的字典,这里的例子我们没有用到self,只是调用了父类的write方法,将vals写入到数据库中。如果我们要修改某个值,需要对self进行迭代,然后更新字段的值。
model
作用:self代表一个记录集合,但内容与记录集无关,只是与model类型相关。
返回值: 被装饰方法的返回值
v7版本写法: model.method(cr, args)
典型应用是对象的create方法:
1 2 3 | @api.model def create(self,vals): return super(Book,self).create(vals) |
self是个对象集合,但是creat方法内部却与self这个集合没有关系,只是用了self的model类型,将vals的值进行创建操作。
contrains
作用:给某个字段添加限制条件
v7版本:是通过_constrains属性关联验证方法的方式实现
到了新API,不需要添加_constrains属性了,直接给校验方法添加constrains装饰即可。
1 2 3 4 5 6 | age = fields.Integer(string="age") @api.constrains('age') def _check_age(self): if self.age<16: raise ValueError(_('Age must be older than 16')) |
这样就限制了age字段只能输入比16大的数据。
另外一种constrains
odoo支持另外一种添加限制的方式,即通过sql约束的方式。方法是在odoo类对象中添加_sql_constrains属性,值是一个包含了元组的列表,元组的三个值分别是约束名,约束条件和警告信息,看一个例子:
1 2 3 4 5 6 7 8 | _sql_constraints = [ ('name_description_check', 'CHECK(name != description)', "The title of the course should not be the description"), ('name_unique', 'UNIQUE(name)', "The course title must be unique"), ] |
这样做的好处是,在数据库层面就限制了数据的校验,而不是在代码层面的校验,显然效率会更高。缺点是在添加限制之前,数据库中不能存在违反约束的数据,否则约束会添加失败。
depends
depends主要用于compute方法,v8当中已经取消了function字段,对于任何fields都可以通过添加compute属性动态赋值。depends就是用来标该方法依赖于哪些字段的装饰。
1 2 3 | @api.depends('date') def _get_book_age(self): self.age = (datetime.now().date() - self.date).days |
对于compute方法来说,加不加depends装饰的区别在于,加了depends的方法会在依赖的字段发生改变时重新计算本字段的值,而不加depends的方法只在触发的第一次调用,也就是说不会持续更新。
returns
returns的用法主要是用来指定返回值的格式,它接受三个参数,第一个为返回值的model,第二个为向下兼容的method,第三个为向上兼容的method。
第一个参数如果是对象本身,则写’self’,如果是其他对象,则写其他对象名如:@api.returns(‘ir.ui.view’)。
例如:
1 2 3 4 5 6 | @api.multi @api.returns('mail.message', lambda value: value.id) def message_post(self, **kwargs): if self.env.context.get('mark_so_as_sent'): self.filtered(lambda o: o.state == 'draft').with_context(tracking_disable=True).write({'state': 'sent'}) self.env.user.company_id.set_onboarding_step_done('sale_onboarding_sample_quotation_state') return super(SaleOrder, self.with_context(mail_post_autofollow=True)).message_post(**kwargs) |
returns主要用于确保新旧API返回值的一致,并不常用。