odoo10 addon開發流程

odoo addon開發流程

建立一個addon(插件)

  • 命令以下
python odoo-bin scaffold  插件名   路徑
# 例如
python odoo-bin scaffold hh_todo_app  myaddons
# 須要將myaddons的路徑添加到odoo.conf配置文件的addons_path參數中去
  • 目錄結構

image.png

開發To-do addon

  1. 建立huah_todo addon
python odoo-bin scaffold huah_todo extra_addons

建立huah_todo addon在extra_addons,需將extra_addons的絕對路徑添加到debian/odoo.conf中的addons_path參數中前端

  1. 編寫__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',
    ],
}
  1. 編寫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
  1. 編寫views/views.xml

python odoo-bin scaffold命令建立的views.xml其實都註釋了編寫xml的示例python

<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"這張表裏。git

  • 自定義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>

運行示例:
image.png
tree視圖控制列表視圖要顯示的字段:
image.png
form視圖控制建立數據時的顯示:

image.png
點擊已完成按鈕會執行model的work_done方法修改結束時間和累計用時字段

image.pnggithub

相關文章
相關標籤/搜索