odoo V10开发文档(第三章:工作流、安全机制、向导)

工作流

工作流是与业务流程相关联的模型,工作流同时可用于跟踪工序的演变过程

例:为session模型添加一个state字段用于定义一个工作流
state有三种取值:Draft (默认), Confirmed and Done.
在session表单添加state的显示,并添加一个改变其状态的按钮

#models.py
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'
    
#views.xml

工作流可与odoo的任意对象相关联,可以自定义。工作流用于构造、管理业务对象和文档的整个生命周期,并可用图形化工具来定义转换、触发器等。工作流、活动(节点或操作)、转换通常在xml里以record定义。在工作流中处理的单个流程称为工作项。

与模型关联的工作流是在创建模型记录时生成的,工作流定义之前创建的模型记录是没有相应的工作流的。

例:将之前定义的伪工作流修改为真正的工作流,修改视图让按钮触发真正的工作流

#__manifest__.py
'data':[
    'templates.xml',
    'views/openacademy.xml',
    'views/partner.xml',
    'views/session_workflow.xml',
],

#models.py
state = fields.Selection([
        ('draft', "Draft"),
        ('confirmed', "Confirmed"),
        ('done', "Done"),
    ])

#views.xml

    
#views/session_workflow.xml OpenAcademy sessions workflow openacademy.session True Draft function action_draft() Confirmed function action_confirm() Done function action_done() confirm draft draft done

自动转换:当上座率达到50%时自动将session的状态由draft变为confirmed

#session_workflow.xml


    
    
    taken_seats > 50



    Set session to Draft
    
    
model.search([('id', 'in', context['active_ids'])]).action_draft()
    



    Draft
    
    
    dummy
    
    



    Set session to Confirmed
    
    
model.search([('id', 'in', context['active_ids'])]).action_confirm()
    


    Confirmed
    
    dummy
    
    


    Set session to Done
    
    
model.search([('id', 'in', context['active_ids'])]).action_done()
    


    Done
    
    dummy
    
    

安全机制

1.基于组的权限控制机制

组是以单条记录的形式记录在res.group模型中的,通过菜单定义来控制访问权限。但在不通过菜单访问情况下仍然是可以访问到对象的,所以需要为组定义对象级别的权限(read,write,create,unlink),一般是通过csv文件来定义,也可通过group属性来限制对象或视图中的字段权限

2.访问权限

访问权限通过ir.model.access的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

例:
通过用户界面来添加权限控制

通过设置-用户-用户 添加一个新用户
通过设置-用户-组 建立一个新组
编辑创建的新用户将他加入到新建的组中
用新增的用户帐号登录,看权限是否正确

通过文件来设置权限

#__manifest__.py
'data': [
        'security/security.xml',
    
#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_courses,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_courses,,1,0,0,0
session_read_all,session all,model_openacademy_session,,1,0,0,0

#security/security.xml

    
        
            OpenAcademy / Manager
        
    


3.基于记录的权限控制

基于记录的权限可以控制指定模型的所有数据集,使用模型的ir.rule属性来声明,可以控制其关联模型、many2many字段、domain表达式所过滤出的字段

例:状态为cancel的负责人才可以删除,group的值必须与ORM的write()方法规定的一致


    Only cancelled leads may be deleted
    
    
    
    
    
    
    [('state','=','cancel')]

例:为课程模型添加记录行权限,限制write和unlink权限,当课程没有负责人时所有组内成员就都可以修改,有负责人时只有负责人有权修改

#security.xml

    Only Responsible can modify Course
    
    
    
    
    
    
    
        ['|', ('responsible_id','=',False),
              ('responsible_id','=',user.id)]
    

向导

向导以动态的形式描述与用户或对话框的交互,一个向导其实就是一个继承自TransientModel的模型,TransientModel又继承自model,在继承原有属性的基础上新增了新特性

  • 记录是临时的,会在一定时间内自动从数据库删除
  • 向导模型不需要访问权限,所有用户均可访问
  • 向导记录可以通过many2one关联普通记录或其他向导记录,普通记录无法通过many2one关系向导记录

实例:创建一个与session模型有多对一关系、与partner模型有多对多关系的向导

#__init__.py
from . import wizard

#wizard.py
# -*- coding: utf-8 -*-

from odoo import models, fields, api

class Wizard(models.TransientModel):
    _name = 'openacademy.wizard'

    session_id = fields.Many2one('openacademy.session',
        string="Session", required=True)
    attendee_ids = fields.Many2many('res.partner', string="Attendees")

启动向导

向导可以通过ir.actions.act_window记录来启动,将target字段值设置为new即可。target属性会给出一个向导的弹出框。还可以通过一个额外的src_model字段来指定某个模型的向导操作可用,在xml中用act_window标签定义。


向导使用的是常规视图,我们可以给它的按钮添加special="cancel"属性来实现不保存任何数据的情况下关闭向导

例1:为向导定义一个表单,在session模型中添加一个按钮来启动向导,使用self._context拿到当前session,给向导的session字段添加一个默认值
下面的例子可以为session创建一个添加出席者的向导

#wizard.py
def _default_session(self):
        return self.env['openacademy.session'].browse(self._context.get('active_id'))
session_id = fields.Many2one('openacademy.session',
        string="Session", required=True, default=_default_session)
        
#views.xml

    wizard.form
    openacademy.wizard
    
        
            
                
                
            
        
    



        

例2:注册出席人
给向导添加一个按钮,并将出席人添加到指定session中

#views.xml

#wizard.py @api.multi def subscribe(self): self.session_id.attendee_ids |= self.attendee_ids return {}

例3:将出席人注册到多个session

#views.xml
#wizard.py def _default_sessions(self): return self.env['openacademy.session'].browse(self._context.get('active_ids')) session_ids = fields.Many2many('openacademy.session', string="Sessions", required=True, default=_default_sessions) attendee_ids = fields.Many2many('res.partner', string="Attendees") @api.multi def subscribe(self): for session in self.session_ids: session.attendee_ids |= self.attendee_ids return {}

内容发布自http://www.dingyii.cn,转载请注明出处

你可能感兴趣的:(odoo V10开发文档(第三章:工作流、安全机制、向导))