odoo二開(2)windows下如何初始化一個(gè)新的模塊,以及正確使他工作

  1. 請(qǐng)先參考我的odoo二開(1)windows下環(huán)境配置教程宴抚,配置好環(huán)境,接下來會(huì)按照初始化直至這個(gè)模塊能正確安裝到你的odoo上為例展開愈捅,這里筆者的odoo版本是16拯刁,python版本是3.10.10谍咆,使用的環(huán)境是windows窃肠,很基礎(chǔ)的操作這里不多贅述包个,大家自行百度。
  2. 到pycharm的terminal里輸入
python odoo-bin scaffold  D:\ERP\odoo-16.0\myAddons\myStudy 
  1. 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,
}
  1. 上面這段 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)用篩選條件直接搜索到。
  1. 接下來州既,先初始化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()
  1. 完成后開始著手準(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ò)
  1. 繼續(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)形式
      1. tree代表樹狀視圖硅急,
        2.form代表表單視圖,就這么簡(jiǎn)單
    • view_id 指向第六步定義的ir.ui.view數(shù)據(jù)模型類的view視圖鸠姨。
    • help用來在沒數(shù)據(jù)的時(shí)候給用戶提供提示作用铜秆,選填
  1. 接下來為這個(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罚斗。
  1. 接下來初始化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è)組里盟猖。
  1. 新添加的模型還有一項(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è)模塊就基本初始化完畢了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乎赴,一起剝皮案震驚了整個(gè)濱河市忍法,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榕吼,老刑警劉巖饿序,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異友题,居然都是意外死亡嗤堰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來踢匣,“玉大人告匠,你說我怎么就攤上這事±牖#” “怎么了后专?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)输莺。 經(jīng)常有香客問我戚哎,道長(zhǎng),這世上最難降的妖魔是什么嫂用? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任型凳,我火速辦了婚禮,結(jié)果婚禮上嘱函,老公的妹妹穿的比我還像新娘甘畅。我一直安慰自己,他們只是感情好往弓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布疏唾。 她就那樣靜靜地躺著,像睡著了一般函似。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上撇寞,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天顿天,我揣著相機(jī)與錄音,去河邊找鬼重抖。 笑死露氮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钟沛。 我是一名探鬼主播畔规,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼恨统!你這毒婦竟也來了叁扫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤畜埋,失蹤者是張志新(化名)和其女友劉穎莫绣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悠鞍,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡对室,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掩宜。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蔫骂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出牺汤,到底是詐尸還是另有隱情辽旋,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布檐迟,位于F島的核電站补胚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏追迟。R本人自食惡果不足惜溶其,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望敦间。 院中可真熱鬧握联,春花似錦、人聲如沸每瞒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剿骨。三九已至,卻和暖如春埠褪,著一層夾襖步出監(jiān)牢的瞬間浓利,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工钞速, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贷掖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓渴语,卻偏偏與公主長(zhǎng)得像苹威,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驾凶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容