-
請(qǐng)先參考我的odoo二開(1)windows下環(huán)境配置教程宴抚,配置好環(huán)境,接下來會(huì)按照初始化直至這個(gè)模塊能正確安裝到你的odoo上為例展開愈捅,這里筆者的odoo版本是16拯刁,python版本是3.10.10谍咆,使用的環(huán)境是windows窃肠,很基礎(chǔ)的操作這里不多贅述包个,大家自行百度。
-
到pycharm的terminal里輸入
python odoo-bin scaffold D:\ERP\odoo-16.0\myAddons\myStudy
-
odoo-bin scaffold【后續(xù)都會(huì)叫他腳手架】會(huì)自動(dòng)生成一個(gè)模塊必要的所有文件和文件夾到指定的地址冤留,還有一些展開參數(shù)赃蛛,這里不做說明恃锉,可自行百度。
# -*- coding: utf-8 -*-
{
'name': "my_study",
'summary': """
測(cè)試學(xué)習(xí)模塊""",
'description': """
測(cè)試學(xué)習(xí)模塊</br><h1>報(bào)告上傳模塊測(cè)試</h1>
""",
'author': "phoney",
'website': "",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/16.0/odoo/addons/base/data/ir_module_category_data.xml
# for the full list
'category': 'Services',
'version': '0.1',
# any module necessary for this one to work correctly
'depends': ['base'],
# always loaded
'data': [
# 'security/ir.model.access.csv',
'views/views.xml',
'security/study_security.xml',
'security/ir.model.access.csv',
],
# only loaded in demonstration mode
'installable': True,
'application': True,
}
-
上面這段 manifest.py 代碼解釋:
- 一個(gè)名稱為my_study的模塊呕臂,依賴插件有base插件
- data字典表示:界面文件有 'views/views.xml',
- data字典表示:權(quán)限配置參考 'security/study_security.xml',
- data字典表示:權(quán)限文件是 'security/ir.model.access.csv',也方便初始化
上訴文件需要到模塊目錄下創(chuàng)建對(duì)應(yīng)目錄和文件
- 'installable': True, 是否可安裝:是,這條影響能能不能手動(dòng)安裝肪跋。
- 'application': True, 是否是應(yīng)用:是歧蒋,這條影響插件能不能在應(yīng)用模塊里使用應(yīng)用篩選條件直接搜索到。
-
接下來州既,先初始化models/models.py,即數(shù)據(jù)庫(kù)初始化谜洽,這里用了一個(gè)檢測(cè)報(bào)告模塊做例子,考慮到一個(gè)檢測(cè)報(bào)告需要文件名吴叶,上傳人阐虚,訂單號(hào)還有上傳日期,以及一個(gè)可能需要的url蚌卤,比較簡(jiǎn)單实束。
from odoo import models, fields, api
class my_study(models.Model):
_name = 'my_study.pzbg'
_description = '報(bào)告模塊'
filename = fields.Char()
operator = fields.Char()
order = fields.Char()
upload_time = fields.Date()
url = fields.Char()
-
完成后開始著手準(zhǔn)備相關(guān)界面'views/views.xml,下文屬于準(zhǔn)備視圖的展示內(nèi)容逊彭,簡(jiǎn)單可以理解為規(guī)劃階段
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record model="ir.ui.view" id="my_study_list">
<field name="model">my_study.pzbg</field>
<field name="arch" type="xml">
<tree string="study tree" editable="bottom">
<field name="filename" string="文件名"/>
<field name="operator"/>
<field name="order"/>
<field name="upload_time"/>
<field name="url"/>
</tree>
</field>
</record>
</data>
</odoo>
要點(diǎn)分析:
- <record>標(biāo)簽是odoo內(nèi)定標(biāo)簽咸灿,其id屬性是唯一標(biāo)識(shí)符。
- record 的model屬性里的ir.ui.view是說明這個(gè)record的使用的模型類型是ir_ui_view侮叮,數(shù)據(jù)庫(kù)里會(huì)有對(duì)應(yīng)的字段避矢,odoo會(huì)在xml文件中使用一個(gè)點(diǎn)"."來代替數(shù)據(jù)庫(kù)表名稱中的下劃線"_"。
- field標(biāo)簽name囊榜,model审胸,arch屬性,其中后兩者是必填項(xiàng)卸勺,否則會(huì)報(bào)錯(cuò) 砂沛,name隨便起,model對(duì)應(yīng)數(shù)據(jù)模型的name孔庭,arch的格式是固定的尺上,你可以抄一些別的代碼,里面填寫你需要展示的內(nèi)容具體排布情況圆到。
- string屬性:顯示的是這個(gè)項(xiàng)的子標(biāo)題怎抛。
- <field name="operator"/>不要寫成 <field name="operator">xxx</field>這里新手容易犯錯(cuò)
-
繼續(xù)編輯'views/views.xml,實(shí)現(xiàn)打開模型視圖的功能,簡(jiǎn)單理解為修路階段芽淡,光有規(guī)劃沒用马绝,還得用路把規(guī)劃和人連接起來。
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record model="ir.ui.view" id="my_study_list">
...省略了挣菲,就是上一塊代碼
</record>
<record model="ir.actions.act_window" id="my_study_tree_action_window">
<field name="name">my_study_action_window</field>
<field name="res_model">my_study.pzbg</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="my_study_list"/>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">查詢檢測(cè)報(bào)告單
</p>
</field>
</record>
</data>
</odoo>
要點(diǎn)分析
- 同上富稻,record里的數(shù)據(jù)模型model為ir.actions.act_window掷邦,這個(gè)window模型odoo有他的一套處理邏輯,將他合理的顯示在頁(yè)面中椭赋,不需要你過多操心抚岗。同理,以下field的內(nèi)容均是這個(gè)模型的數(shù)據(jù)結(jié)構(gòu)哪怔。
- record id必填且很重要宣蔚,標(biāo)識(shí)作用。
- field標(biāo)簽中name代表他的叫法认境,隨便起一個(gè)就好胚委。
屬性res_model和view_mode的是必須項(xiàng),其中:
- res_model對(duì)應(yīng)你想指定的model對(duì)象叉信,告訴程序你后續(xù)的view內(nèi)容主要使用的是哪個(gè)數(shù)據(jù)模型亩冬。
- view_mode可選性有tree,和form硼身,對(duì)應(yīng)不同的表現(xiàn)形式
- tree代表樹狀視圖硅急,
2.form代表表單視圖,就這么簡(jiǎn)單
- view_id 指向第六步定義的ir.ui.view數(shù)據(jù)模型類的view視圖鸠姨。
- help用來在沒數(shù)據(jù)的時(shí)候給用戶提供提示作用铜秆,選填
-
接下來為這個(gè)view視圖添加菜單按鈕,簡(jiǎn)單理解為修一個(gè)大門讶迁。
.
.
.省略節(jié)省空間连茧,繼續(xù)之前的代碼寫
<!-- 頂層菜單按鈕,官方是這么解釋的 -->
<menuitem name="檢單查詢" id="my_study.menu_root"/>
<!-- 第二級(jí)菜單-->
<menuitem name="報(bào)告展示方式" id="my_study.menu_1" parent="my_study.menu_root"/>
<!-- 第二級(jí)菜單的子菜單-->
<menuitem name="樹狀展示" id="my_study.menu_1_list" parent="my_study.menu_1"
action="my_study_tree_action_window"/>
<menuitem name="表單展示" id="my_study.menu_2_list" parent="my_study.menu_1"
action="my_study_form_action_window"/>
</data>
</odoo>
要點(diǎn)分析:
- menuitem 中只要id為模塊名".menu_root"的巍糯,系統(tǒng)自動(dòng)識(shí)別為系統(tǒng)菜單,企業(yè)版他會(huì)出現(xiàn)在桌面上啸驯,社區(qū)版我還沒試過。
- 后續(xù)就基于這個(gè)root菜單一層一層搭建菜單就好祟峦,具體看上面的就行
- action 指向想要跳轉(zhuǎn)的ir_act_window的record.id罚斗。
-
接下來初始化security/study_security.xml文件,來為用戶賦予權(quán)限,這一步很重要宅楞,否則你后續(xù)安裝好后無法找到插件了针姿。
<?xml version="1.0" ?>
<odoo>
<record id="my_study_category" model="ir.module.category">
<field name="name">my_study</field>
</record>
<record id="my_study_group_user" model="res.groups">
<field name="name">my_studyUser</field>
<field name="category_id" ref="my_study_category" />
<field name="implied_ids" eval="[(4, ref('base.group_user'))]" />
</record>
<record id="my_study_group_manager" model="res.groups">
<field name="name">my_studyManager</field>
<field name="category_id" ref="my_study_category" />
<field name="implied_ids" eval="[(4, ref('my_study_group_user'))]" />
<field name="users" eval="[
(4, ref('base.user_root')),
(4, ref('base.user_admin'))
]" />
</record>
</odoo>
要點(diǎn)分析:
- 第一個(gè)record標(biāo)簽內(nèi)是定義一個(gè)繼承ir.module.category的model對(duì)象,用來在數(shù)據(jù)庫(kù)ir_model_category表中生成一個(gè)分類厌衙,分類名是name屬性對(duì)應(yīng)的內(nèi)容距淫。
- 第二個(gè)record是在res.groups這個(gè)model創(chuàng)建一個(gè)my_studyUser的項(xiàng),他的分類id剛好是第一個(gè)record
- implied_ids 這里的作用是odoo里的一個(gè)組權(quán)限繼承機(jī)制,他的基礎(chǔ)權(quán)限是繼承的base.group_user這個(gè)組
- [(4, ...)]: 這是一個(gè)命令列表(command list)婶希,它是 Odoo 用于更新記錄的關(guān)聯(lián)字段的特定語(yǔ)法榕暇,這里的4的意思是新增,具體要查看odoo官方開發(fā)說明。
- *ref('base.group_user'):
ref 是一個(gè)函數(shù)彤枢,它返回給定外部 ID 的數(shù)據(jù)庫(kù)記錄的 ID狰晚。在這里,'base.group_user' 是一個(gè)外部 ID缴啡,它指的是 Odoo 基礎(chǔ)模塊(base)中的一個(gè)用戶組壁晒。
- <field name="users" 里我將root,和user_admin用戶默認(rèn)定義到了my_study_group_manager這個(gè)組里盟猖。
-
新添加的模型還有一項(xiàng)必不可少的步驟讨衣,那就是配置加載權(quán)限。odoo使用的是csv文件式镐,通過把csv文件里的列表數(shù)據(jù)加載到”ir.model.access”模型中實(shí)現(xiàn)。所以通常把這也的csv文件名稱定義為”ir.model.access.csv”固蚤。
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
checkout_user,Checkout User,my_study.model_my_study_pzbg,my_study.my_study_group_user,1,1,1,0
checkout_manager,Checkout Manager,my_study.model_my_study_pzbg,my_study.my_study_group_manager,1,1,1,1
- 比較重要的是model_id這個(gè)項(xiàng)娘汞,這個(gè)是固定寫法,規(guī)則是{模塊名.model_模塊名_類名}夕玩,切記
- group_id:id:組id,上文提到的base.group_user是系統(tǒng)內(nèi)置組你弦,即員工.員工組,創(chuàng)建帳戶時(shí)燎孟,默認(rèn)屬于這個(gè)組禽作。所以給這個(gè)組賦權(quán)限,相當(dāng)于給新帳戶的默認(rèn)權(quán)限揩页,文中的則是在第9步中自定義的組旷偿,格式是模塊名.組名。
- perm_read,perm_write,perm_create,perm_unlink:對(duì)應(yīng)讀爆侣、寫萍程、增加、刪除權(quán)限兔仰,1是有權(quán)限茫负,0是無權(quán)限,具體根據(jù)需要來設(shè)置權(quán)限
到這里一個(gè)模塊就基本初始化完畢了