<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] #### 工作流 工作流是與動態業務對象相關聯的模型。工作流也用于跟蹤動態演進的進程。 > 練習偽工作流 > 在授課模型上添加一個字段`state`,用于定義一個工作流程。授課存在三個可能的狀態:Draft(草稿,默認值)、Confirmed(已確認)、Done(已完成)。在授課的form視圖中,添加一個只讀字段用于顯示課程狀態,并可以通過按鈕來改變狀態。有效的狀態值遷移包括: > > * Draft->Confirmed > * Confirmed->Draft > * Confirmed->Done > * Done->Draft 1. 添加一個新的字段`state` 2. 添加狀態遷移方法,這個方法可以被form表單的按鈕所調用,用以更改授課的狀態 3. 將相關按鈕添加到授課的form視圖 `openacademy/models.py` ~~~ attendees_count = fields.Integer( string="Attendees count", compute='_get_attendees_count', store=True) state = fields.Selection([ ('draft', "Draft"), ('confirmed', "Confirmed"), ('done', "Done"), ], default='draft') @api.multi def action_draft(self): self.state = 'draft' @api.multi def action_confirm(self): self.state = 'confirmed' @api.multi def action_done(self): self.state = 'done' @api.depends('seats', 'attendee_ids') def _taken_seats(self): for r in self: ~~~ `openacademy/views/openacademy.xml` ~~~ <field name="model">openacademy.session</field> <field name="arch" type="xml"> <form string="Session Form"> <header> <button name="action_draft" type="object" string="Reset to draft" states="confirmed,done"/> <button name="action_confirm" type="object" string="Confirm" states="draft" class="oe_highlight"/> <button name="action_done" type="object" string="Mark as done" states="confirmed" class="oe_highlight"/> <field name="state" widget="statusbar"/> </header> <sheet> <group> <group string="General"> ~~~ 工作流可以與Odoo中的任何對象關聯,并且可完全定制化。工作流用于構造和管理業務對象和文檔的生命周期,并且通過圖形化工具定義轉換器、觸發器等。工作流、動作(節點或操作)和遷移(條件)通常以XML記錄行的形式定義。在工作流進行導航的標簽稱為工作項。 > 警告 > 與模型相關的工作流僅在創建模型記錄時被創建。因此,在工作流定義之前創建的授課實例是沒有與之對應的工作流實例的。 > > 練習工作流 > 使用真正的授課工作流替換之前的偽工作流。修改授課的form視圖,按鈕將調用工作流而不是調用模型的方法。 `openacademy/__manifest__.py` ~~~ 'templates.xml', 'views/openacademy.xml', 'views/partner.xml', 'views/session_workflow.xml', ], # only loaded in demonstration mode 'demo': [ ~~~ `openacademy/models.py` ~~~ ('draft', "Draft"), ('confirmed', "Confirmed"), ('done', "Done"), ]) @api.multi def action_draft(self): ~~~ `openacademy/views/openacademy.xml` ~~~ <field name="arch" type="xml"> <form string="Session Form"> <header> <button name="draft" type="workflow" string="Reset to draft" states="confirmed,done"/> <button name="confirm" type="workflow" string="Confirm" states="draft" class="oe_highlight"/> <button name="done" type="workflow" string="Mark as done" states="confirmed" class="oe_highlight"/> <field name="state" widget="statusbar"/> ~~~ `openacademy/views/session_workflow.xml` ~~~ <odoo> <data> <record model="workflow" id="wkf_session"> <field name="name">OpenAcademy sessions workflow</field> <field name="osv">openacademy.session</field> <field name="on_create">True</field> </record> <record model="workflow.activity" id="draft"> <field name="name">Draft</field> <field name="wkf_id" ref="wkf_session"/> <field name="flow_start" eval="True"/> <field name="kind">function</field> <field name="action">action_draft()</field> </record> <record model="workflow.activity" id="confirmed"> <field name="name">Confirmed</field> <field name="wkf_id" ref="wkf_session"/> <field name="kind">function</field> <field name="action">action_confirm()</field> </record> <record model="workflow.activity" id="done"> <field name="name">Done</field> <field name="wkf_id" ref="wkf_session"/> <field name="kind">function</field> <field name="action">action_done()</field> </record> <record model="workflow.transition" id="session_draft_to_confirmed"> <field name="act_from" ref="draft"/> <field name="act_to" ref="confirmed"/> <field name="signal">confirm</field> </record> <record model="workflow.transition" id="session_confirmed_to_draft"> <field name="act_from" ref="confirmed"/> <field name="act_to" ref="draft"/> <field name="signal">draft</field> </record> <record model="workflow.transition" id="session_done_to_draft"> <field name="act_from" ref="done"/> <field name="act_to" ref="draft"/> <field name="signal">draft</field> </record> <record model="workflow.transition" id="session_confirmed_to_done"> <field name="act_from" ref="confirmed"/> <field name="act_to" ref="done"/> <field name="signal">done</field> </record> </data> </odoo> ~~~ > 提示 > 要檢查授課實例對應的工作流實例是否被正確創建,可以:**設置->技術->工作流->實例** > > 練習自動狀態遷移 > 當超過一半座席被保留時,自動將授課的狀態從*Draft*遷移到*Confirmed*。 `openacademy/views/session_workflow.xml` ~~~ <field name="act_to" ref="done"/> <field name="signal">done</field> </record> <record model="workflow.transition" id="session_auto_confirm_half_filled"> <field name="act_from" ref="draft"/> <field name="act_to" ref="confirmed"/> <field name="condition">taken_seats > 50</field> </record> </data> </odoo> ~~~ > 練習服務器動作 > 用服務器動作替換用于同步授課狀態的Python方法。工作流和服務器動作都可以從UI創建。 `openacademy/views/session_workflow.xml` ~~~ <field name="on_create">True</field> </record> <record model="ir.actions.server" id="set_session_to_draft"> <field name="name">Set session to Draft</field> <field name="model_id" ref="model_openacademy_session"/> <field name="code"> model.search([('id', 'in', context['active_ids'])]).action_draft() </field> </record> <record model="workflow.activity" id="draft"> <field name="name">Draft</field> <field name="wkf_id" ref="wkf_session"/> <field name="flow_start" eval="True"/> <field name="kind">dummy</field> <field name="action"></field> <field name="action_id" ref="set_session_to_draft"/> </record> <record model="ir.actions.server" id="set_session_to_confirmed"> <field name="name">Set session to Confirmed</field> <field name="model_id" ref="model_openacademy_session"/> <field name="code"> model.search([('id', 'in', context['active_ids'])]).action_confirm() </field> </record> <record model="workflow.activity" id="confirmed"> <field name="name">Confirmed</field> <field name="wkf_id" ref="wkf_session"/> <field name="kind">dummy</field> <field name="action"></field> <field name="action_id" ref="set_session_to_confirmed"/> </record> <record model="ir.actions.server" id="set_session_to_done"> <field name="name">Set session to Done</field> <field name="model_id" ref="model_openacademy_session"/> <field name="code"> model.search([('id', 'in', context['active_ids'])]).action_done() </field> </record> <record model="workflow.activity" id="done"> <field name="name">Done</field> <field name="wkf_id" ref="wkf_session"/> <field name="kind">dummy</field> <field name="action"></field> <field name="action_id" ref="set_session_to_done"/> </record> <record model="workflow.transition" id="session_draft_to_confirmed"> ~~~ ##### 安全 安全是為了實現統一的安全策略而進行配置的訪問控制機制。 **基于組的訪問控制機制** 組是通過在`res.groups`模型的記錄行來創建的,并通過菜單訪問權限來限制權限。但是,即使沒有菜單,對象仍然可以間接被訪問,因此必須為組定義實際的對象級權限(讀取、寫入、創建、取消關聯)。一般通過模塊中的CSV文件插入。也可以通過字段的`groups`屬性來限制對視圖或對象上特定字段的訪問。 **訪問權限** 訪問權限通過`ir.model.access`的記錄行來定義。每個訪問權限與模型、組(或者非全局訪問的組)相關聯,并且是一組權限:讀取、寫入、創建、取消關聯。這些訪問權限一般通過`ir.model.access.csv`這個CSV文件創建。 ~~~ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink access_idea_idea,idea.idea,model_idea_idea,base.group_user,1,1,1,0 access_idea_vote,idea.vote,model_idea_vote,base.group_user,1,1,1,0 ~~~ > 練習 > 通過Odoo界面添加訪問控制權限 > 建立一個新用戶`John Smith`,然后建立`OpenAcademy/Session Read`組,并賦予這個組對*授課*模型的讀權限。 > > 1. 建立一個新用戶`John Smit`通過 **設置->用戶->用戶** > 2. 建立一個新組`session_read`通過 **設置->用戶->組**,這個組擁有對*授課*模型的讀權限 > 3. 編輯`John Smith`用戶,把他加入到`session_read`組 > 4. 以`John Smith`身份登錄系統,檢查權限是否正確。 * * * > 練習 > 通過數據文件添加訪問控制權限: > > * 建立一個組`OpenAcademy / Manager`,這個組對開放學院的所有模型都有完全權限。 > * 讓`Session`和`Course`對所有用戶可讀 > * 建立新的文件`openacademy/security/security.xml`用來定義`OpenAcademy Manager`組 > * 編輯文件`openacademy/security/ir.model.access.csv`來添加對模型的訪問權限 > * 最后更新`openacademy/__manifest__.py`來添加新的數據文件 `openacademy/__manifest__.py` ~~~ # always loaded 'data': [ 'security/security.xml', 'security/ir.model.access.csv', 'templates.xml', 'views/openacademy.xml', 'views/partner.xml', ~~~ `openacademy/security/ir.model.access.csv` ~~~ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink course_manager,course manager,model_openacademy_course,group_manager,1,1,1,1 session_manager,session manager,model_openacademy_session,group_manager,1,1,1,1 course_read_all,course all,model_openacademy_course,,1,0,0,0 session_read_all,session all,model_openacademy_session,,1,0,0,0 ~~~ `openacademy/security/security.xml` ~~~ <odoo> <data> <record id="group_manager" model="res.groups"> <field name="name">OpenAcademy / Manager</field> </record> </data> </odoo> ~~~ **記錄規則** 記錄規則限制對給定模型的記錄子集的訪問權限。一個規則就是`ir.rule`模型的一行記錄,并且將其關聯到模型、數組(many2many字段)、或domain。domain指定了對那些記錄有訪問權限。 這是一個記錄規則的例子,這個規則防止非`cancel`狀態的負責人被刪除。請注意,`groups`字段的值必須遵守與ORM的`write()`方法一樣的規則。 ~~~ <record id="delete_cancelled_only" model="ir.rule"> <field name="name">Only cancelled leads may be deleted</field> <field name="model_id" ref="crm.model_crm_lead"/> <field name="groups" eval="[(4, ref('sales_team.group_sale_manager'))]"/> <field name="perm_read" eval="0"/> <field name="perm_write" eval="0"/> <field name="perm_create" eval="0"/> <field name="perm_unlink" eval="1" /> <field name="domain_force">[('state','=','cancel')]</field> </record> ~~~ > 練習記錄規則 > 為*授課*模型和*OpenAcademy / Manager*組添加記錄規則,這個記錄規則限制只有課程負責人可以對課程進行`write`和`unlink`操作,如果課程還沒有負責人,這個組的所有用戶都可以編輯它。在`openacademy/security/security.xml`文件中創建新的規則: > `openacademy/security/security.xml` > ``` > > OpenAcademy / Manager > ~~~ <record id="only_responsible_can_modify" model="ir.rule"> <field name="name">Only Responsible can modify Course</field> <field name="model_id" ref="model_openacademy_course"/> <field name="groups" eval="[(4, ref('openacademy.group_manager'))]"/> <field name="perm_read" eval="0"/> <field name="perm_write" eval="1"/> <field name="perm_create" eval="0"/> <field name="perm_unlink" eval="1"/> <field name="domain_force"> ['|', ('responsible_id','=',False), ('responsible_id','=',user.id)] </field> </record> </data> ~~~ ``` 作者:luohuayong 鏈接:http://www.jianshu.com/p/6979497c4082 來源:簡書 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看