odoo10 addon开发流程
odoo addon开发流程
创建一个addon(插件)
- 命令如下
python odoo-bin scaffold 插件名 路径
# 例如
python odoo-bin scaffold hh_todo_app myaddons
# 需要将myaddons的路径添加到odoo.conf配置文件的addons_path参数中去
- 目录结构

开发To-do addon
- 创建huah_todo addon
python odoo-bin scaffold huah_todo extra_addons
创建huah_todo addon在extra_addons,需将extra_addons的绝对路径添加到debian/odoo.conf中的addons_path参数中
- 编写__manifest__.py文件
# -*- coding: utf-8 -*-
{
'name': "huah_todo",# addons在应用栏中的展示名
# 摘要
'summary': """
Short (1 phrase/line) summary of the module's purpose, used as
subtitle on modules listing or apps.openerp.com""",
# 描述
'description': """
Long description of module's purpose
""",
# 作者
'author': "My Company",
# 网站
'website': "http://www.yourcompany.com",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/master/odoo/addons/base/module/module_data.xml
# for the full list
'category': 'Uncategorized',
'version': '0.1',
# any module necessary for this one to work correctly
# 依赖组件,当继承组件时需要编写,当按照组件时会自动安装依赖,卸载依赖组件时,该组件也会连带卸载
'depends': ['base'],
# always loaded
# 允许加载的xml文件
'data': [
# 'security/ir.model.access.csv',
'views/views.xml',# 编写视图等xml文件
'views/templates.xml',
],
# only loaded in demonstration mode
'demo': [
'demo/demo.xml',
],
}
- 编写models/models.py
# -*- coding: utf-8 -*-
from odoo import models, fields, api
import datetime
class TaskInfo(models.Model):
_name = 'huah_todo.taskinfo' # _name属性对应该模型在数据库中的表名
_rec_name = 'work_name' # _rec_name显示模型对象时指定显示的字段
work_name = fields.Char(u'工作项目',required=True) # 工作项目字段
work_content = fields.Text(u'工作内容',required=True) # 工作内容字段
# 工作任务开始时间,设置readonly只读不可修改,默认为当前时间
start_time = fields.Datetime(u'开始时间',default=lambda self:fields.Datetime.now(),
readonly=True)
# 结束时间,只读字段,当更改任务状态时才会被修改
end_time = fields.Datetime(u'结束时间',readonly=True)
# 累计用时,只读字段,任务完成时,计算时间差
count_time =fields.Char(u'累计用时',readonly=True)
# 任务状态,选择字段,默认未完成
status = fields.Selection([(1,u'已完成'),(2,u'未完成'),(3,u'已取消')],
string=u'状态',default=2)
# 当前进度,text字段
current_process=fields.Text(u'当前进度')
# 备注
remark = fields.Text(u'备注')
@api.one # 接收一个form对象传入self。
def work_done(self):
"""
前端按绑定work_done方法,改变任务状态并计算用时
:return:
"""
self.status=1
self.end_time=datetime.datetime.now()
start_time=datetime.datetime.strptime(self.start_time,'%Y-%m-%d %H:%M:%S')
end_time=datetime.datetime.strptime(self.end_time,'%Y-%m-%d %H:%M:%S')
self.count_time=str((end_time-start_time).seconds//60)+'分钟'
return True
- 编写views/views.xml
python odoo-bin scaffold命令创建的views.xml其实都注释了编写xml的示例
<odoo>
<data>
<!-- explicit list view definition -->
<!--
<record model="ir.ui.view" id="huah_todo.list">
<field name="name">huah_todo list</field>
<field name="model">huah_todo.huah_todo</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="value"/>
<field name="value2"/>
</tree>
</field>
</record>
-->
<!-- actions opening views on models -->
<!--
<record model="ir.actions.act_window" id="huah_todo.action_window">
<field name="name">huah_todo window</field>
<field name="res_model">huah_todo.huah_todo</field>
<field name="view_mode">tree,form</field>
</record>
-->
<!-- server action to the one above -->
<!--
<record model="ir.actions.server" id="huah_todo.action_server">
<field name="name">huah_todo server</field>
<field name="model_id" ref="model_huah_todo_huah_todo"/>
<field name="code">
action = {
"type": "ir.actions.act_window",
"view_mode": "tree,form",
"res_model": self._name,
}
</field>
</record>
-->
<!-- Top menu item -->
<!--
<menuitem name="huah_todo" id="huah_todo.menu_root"/>
-->
<!-- menu categories -->
<!--
<menuitem name="Menu 1" id="huah_todo.menu_1" parent="huah_todo.menu_root"/>
<menuitem name="Menu 2" id="huah_todo.menu_2" parent="huah_todo.menu_root"/>
-->
<!-- actions -->
<!--
<menuitem name="List" id="huah_todo.menu_1_list" parent="huah_todo.menu_1"
action="huah_todo.action_window"/>
<menuitem name="Server to list" id="huah_todo" parent="huah_todo.menu_2"
action="huah_todo.action_server"/>
-->
</data>
</odoo>
- 编写菜单
<!-- Top menu item -->
<!--每日事项的一级按钮-->
<menuitem
name="每日事项" #按钮的名字,用来显示在主菜单
id="huah_todo.menu_root" # 按钮唯一标示
action="huah_todo.taskinfo_window"/> #指定要执行的窗口id
- 编写视图窗口
<record model="ir.actions.act_window" id="huah_todo.taskinfo_window">
<field name="name">每日事项</field> # 窗口的名字
# 指定model,内容为model的_name属性
<field name="res_model">huah_todo.taskinfo</field>
# 自动生成列表视图和form视图
<field name="view_mode">tree,form</field>
</record>
- 自定义tree视图
<record model="ir.ui.view" id="huah_todo.taskinfo_tree_view"> # id 视图的唯一标示
<field name="name">taskinfo_tree_view</field> # 视图名,可随意定义
<field name="model">huah_todo.taskinfo</field># # 指定模型
<field name="arch" type="xml"> # 声明类型为xml
<tree> #tree标签定义要在tree视图显示的模型字段
<field name="work_name"/>
<field name="start_time"/>
<field name="end_time"/>
<field name="status"/>
<field name="current_process"/>
</tree>
</record>
所有的视图都存在model="ir.ui.view"这张表里。
- 自定义form视图
<record model="ir.ui.view" id="huah_todo.taskinfo">
<field name="name">taskinfo_form_view</field>
<field name="model">huah_todo.taskinfo</field>
<field name="arch" type="xml"> # 前几行与tree视图类似
<form># form标签用于创建数据时显示的字段
<header> # header标签可定制按钮功能
<button# button按钮的name属性绑定model的work_done方法
name="work_done"
type="object"
string="已完成"
/>
</header>
<sheet> # sheet标签包含单元显示数据
<group># group标签可将字段分组优化显示
<field name="work_name"/>
<field name="work_content"/>
<field name="current_process"/>
<field name="status"/>
<field name="remark"/>
</group>
<group>
<field name="start_time"/>
<field name="end_time"/>
<field name="count_time"/>
</group>
</sheet>
</form>
</field>
</record>
运行示例:
tree视图控制列表视图要显示的字段:
form视图控制创建数据时的显示:

点击已完成按钮会执行model的work_done方法修改结束时间和累计用时字段

odoo10 addon开发流程的更多相关文章
- FastAdmin 插件的 Git 开发流程(简明)
FastAdmin 插件的 Git 开发流程(简明) cms zip 安装 包安装 删除 addons 里的 cms 使用 mklink 软链接到 cms 插件 Git 仓库 修改 cms 插件 gi ...
- Linux下服务器端开发流程及相关工具介绍(C++)
去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路 ...
- 小谈Scrum敏捷开发流程
一晃眼,有两年没有写博客了,回顾前两年,各种奔波,各种忙碌,也有不少的收获.从今天开始,我要把这些收获都分享在这里. 其实这两年,对我影响最大的是开发流程.总所周知,一个好的开发流程,对于项目的进行, ...
- 我理解的Sitecore开发流程
Sitecore是一个强大的支持快速开发CMS建站的平台,进入sitecore后台可以看到 它主要有3个元素: 1.Templates模板 Data template:类似于面向对象编程中的类或结构体 ...
- C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- git开发流程、常用命令及工具、TortoiseGit使用及常见问题
根据我最近使用git的一些经历,git是基于分支的版本控制工具,分支有远程分支和本地分支. 一.开发流程 - 从远程服务器的master,clone一份项目文件到本地,然后本地master的基础上br ...
- 软件开发流程 Software development process
软件开发流程(Software development process)即软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法和方法.软件的总体结构设计和模块设计.编程和调试.程序联调和测试以 ...
- Web开发流程
知乎上关于Web开发流程豪情给予的回答 web前端开发流程是什么?进行操作会用到哪些便捷的小工具?是先用模板做好,然后在基础上改吗??正常大家说的改框架是不是指的用模板做的网站原文件?前端开发做的文件 ...
- 基于Lattice_CPLD/FPGA Diamond 开发流程
本文主要介绍了Lattice CPLD/FPGA集成开发环境的使用方法,并通过点亮开发板(Mach XO2 Breakout Board)上位号为D2的LED这一实例来演示其开发流程. 1. ...
随机推荐
- hive基本操作与应用
通过hadoop上的hive完成WordCount 启动hadoop Hdfs上创建文件夹 上传文件至hdfs 启动Hive 创建原始文档表 导入文件内容到表docs并查看 用HQL进行词频统计,结果 ...
- 20190421-那些年使用过的CSS预处理器(CSS Preprocessor)之Sass and Less
写在前面乱七八糟的前言: emmm,还是决定把Sass与Less单独出来写成一篇,可能会稍微好辣么一丢丢?TAT语法特性是真的香,通篇下来能吸收个10%自我感觉已经很nice了,毕竟渣渣的我有渣渣的自 ...
- HTML5之webSocket使用
webSocket是什么 webSocket是HTML5新出的一种协议,底层是基于TCP/IP协议的.跟http没有关系,只是复用了http握手通道,用来升级协议. webSocket的作用 轮询:客 ...
- 洛谷P3366 【模板】最小生成树(Boruvka算法)
题意 题目链接 Sol 自己yy着写了一下Boruvka算法. 算法思想很简单,就是每次贪心的用两个联通块之间最小的边去合并. 复杂度\(O(n \log n)\),然鹅没有Kruskal跑的快,但是 ...
- 【代码笔记】Web-CSS-CSS Align
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- .net工作流引擎ccflow新增支持PostgreSQL数据库的功能的发布说明
关键字: 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 各位驰骋工作流引擎爱好着,经过驰骋公司与正元公司的共同努力,ccflow支持Post ...
- 清理mac的硬盘空间,清理Xcode,清除“其他”
下面是一些清理的方法:打开Finder使用快捷键command+shift+g输入路径即可进入该文件夹 1. 移除DerivedData,建议定期清理,会重新生成 此文件夹内是模拟器运行每个APP生成 ...
- 一种动态写入apk数据的方法(用于用户关系绑定、添加渠道号等)
背景: 正在开发的APP需要记录业务员与客户的绑定关系.具体应用场景如下: 由流程图可知,并没有用户填写业务人员信息这一步,因此在用户下载的APP中就已经携带了业务人员的信息. 由于业务人员众多,不可 ...
- 解决SVN Cleanup错误: Failed to run the WC DB work queue associated with
[内容来源自https://www.cnblogs.com/ANCAN-RAY/p/8961832.html] 在svn本地目录更新文件夹时,更新失败. 然后svn提示我,让我cleanup一下,于是 ...
- springCloud feign使用/优化总结
基于springCloud Dalston.SR3版本 1.当接口参数是多个的时候 需要指定@RequestParam 中的value来明确一下. /** * 用户互扫 * @param uid 被扫 ...