• openerp学习笔记 context 的应用


    1.在Action中定义,context用于传递搜索条件和分组条件,在搜索视图中默认显示:

    示例代码:

    <record model="ir.actions.act_window" id="open_company_allocation">
                <field name="name">Leaves Summary</field>
                <field name="res_model">hr.holidays</field>
                <field name="view_type">form</field>
                <field name="view_mode">tree,form</field>
                <field name="view_id" eval="view_holiday_simple"/>
                <field name="context">{'search_default_group_type': 1, 'search_default_validated': 1}</field>
                <field name="domain">[('holiday_type','=','employee')]</field>
                <field name="search_view_id" ref="view_hr_holidays_filter"/>
            </record>

    其中:

    <field name="context">{'search_default_group_type': 1, 'search_default_validated': 1}</field>
    定义了窗口打开时默认的分组条件 group_type 和过滤条件 validated ,如图所示:

    111

    对应的搜索视图代码:

    <record id="view_hr_holidays_filter" model="ir.ui.view">
                <field name="name">hr.holidays.filter</field>
                <field name="model">hr.holidays</field>
                <field name="arch" type="xml">
                    <search string="Search Leave">
                        <field name="name"/>
                        <separator/>
                        <filter icon="terp-check" domain="[('state','=','draft')]" string="To Confirm"/>
                        <filter icon="terp-camera_test" domain="[('state','in',('confirm','validate1'))]" string="To Approve" name="approve"/>
                        <filter icon="terp-camera_test" domain="[('state','=','validate')]" string="Validated" name="validated"/>
                        <separator/>
                        <filter icon="terp-go-year" name="year" string="Year" domain="[('holiday_status_id.active','=',True)]" help="Filters only on allocations and requests that belong to an holiday type that is 'active' (active field is True)"/>
                        <separator/>
                        <filter string="My Leaves" icon="terp-personal" name="my_leaves" domain="[('employee_id.user_id','=', uid)]" help="My Leaves"/>
                        <separator/>
                        <filter string="My Department Leaves" icon="terp-personal+" help="My Department Leaves" domain="[('department_id.manager_id','=',uid)]"/>
                        <field name="employee_id"/>
                        <field name="department_id"/>
                        <field name="holiday_status_id"/>
                        <group expand="0" string="Group By...">
                            <filter name="group_name" string="Description" domain="[]" context="{'group_by':'name'}"/>
                            <filter name="group_date_from" string="Start Date" icon="terp-personal" domain="[]" context="{'group_by':'date_from'}"/>
                            <filter name="group_employee" string="Employee" icon="terp-personal" domain="[]" context="{'group_by':'employee_id'}"/>
                            <filter name="group_category" string="Category" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'category_id'}"/>
                            <filter string="Manager" icon="terp-personal" domain="[]" context="{'group_by':'manager_id'}"/>
                            <filter string="Department" icon="terp-personal+" domain="[]" context="{'group_by':'department_id','set_visible':True}"/>
                            <filter name="group_type" string="Type" icon="terp-stock_symbol-selection" domain="[]" context="{'group_by':'holiday_status_id'}"/>
                            <filter string="Status" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
                        </group>
                    </search>
                </field>
            </record>

    2.在Action中定义,context用于传递创建对象的默认值:

    示例代码:XML中定义Action,context用于传递创建对象的默认值

    <act_window
                    id="act_crm_opportunity_crm_phonecall_new"
                    name="Phone calls"
                    groups="base.group_sale_salesman"
                    res_model="crm.phonecall"
                    view_mode="tree,calendar,form"
                    context="{'default_duration': 1.0 ,'default_opportunity_id': active_id}"
                    view_type="form"/>
    示例代码:Python后台代码中动态给Action的context赋值,context用于传递创建对象的默认值:
    def action_makeMeeting(self, cr, uid, ids, context=None):
            """
            Open meeting's calendar view to schedule meeting on current opportunity.
            :return dict: dictionary value for created Meeting view
            """
            opportunity = self.browse(cr, uid, ids[0], context)
            res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid, 'base_calendar', 'action_crm_meeting', context)
            res['context'] = {
                'default_opportunity_id': opportunity.id,
                'default_partner_id': opportunity.partner_id and opportunity.partner_id.id or False,
                'default_partner_ids' : opportunity.partner_id and [opportunity.partner_id.id] or False,
                'default_user_id': uid,
                'default_section_id': opportunity.section_id and opportunity.section_id.id or False,
                'default_email_from': opportunity.email_from,
                'default_name': opportunity.name,
            }
            return res

    其中:
    context="{'default_duration': 1.0 ,'default_opportunity_id': active_id}"

    res['context'] = {
      'default_opportunity_id': opportunity.id,
      'default_partner_id': opportunity.partner_id and opportunity.partner_id.id or False,
      'default_partner_ids' : opportunity.partner_id and [opportunity.partner_id.id] or False,
      'default_user_id': uid,
      'default_section_id': opportunity.section_id and opportunity.section_id.id or False,
      'default_email_from': opportunity.email_from,
      'default_name': opportunity.name,
    }
    定义了Action对应的对象创建新记录时的默认值。

    3.在搜索视图中定义,context用于传递在视图中使用的变量:

    示例代码:

    <!-- CRM Lead Search View -->
            <record id="view_crm_case_leads_filter" model="ir.ui.view">
                <field name="name">CRM - Leads Search</field>
                <field name="model">crm.lead</field>
                <field name="arch" type="xml">
                    <search string="Search Leads">
                        <field name="name" string="Lead / Customer" filter_domain="['|','|',('partner_name','ilike',self),('email_from','ilike',self),('name','ilike',self)]"/>
                        <field name="categ_ids" string="Category" filter_domain="[('categ_ids','ilike',self)]"/>
                        <field name="section_id" context="{'invisible_section': False, 'default_section_id': self}"/>
                        <field name="user_id"/>
                        <field name="partner_id" filter_domain="[('partner_id','child_of',self)]"/>
                        <field name="create_date"/>
                        <field name="country_id" context="{'invisible_country': False}"/>
                        <separator/>
                        <filter string="Open" name="open" domain="[('state','!=','cancel')]" help="Open Leads"/>
                        <filter string="Dead" name="dead" domain="[('state','=','cancel')]"/>
                        <filter string="Unassigned" domain="[('user_id','=', False)]" help="No salesperson"/>
                        <filter string="Unread Messages" name="message_unread" domain="[('message_unread','=',True)]" help="Unread messages"/>
                        <filter string="Assigned to Me"
                                domain="[('user_id','=',uid)]" context="{'invisible_section': False}"
                                help="Leads that are assigned to me"/>
                        <filter string="Assigned to My Team(s)"
                                domain="[('section_id.member_ids', 'in', [uid])]" context="{'invisible_section': False}"
                                help="Leads that are assigned to any sales teams I am member of"/>
                        <separator />
                        <filter string="Available for mass mailing"
                                name='not_opt_out' domain="[('opt_out', '=', False)]"
                                help="Leads that did not ask not to be included in mass mailing campaigns"/>
                        <separator />
                        <group expand="0" string="Group By...">
                            <filter string="Salesperson" domain="[]" context="{'group_by':'user_id'}"/>
                            <filter string="Team" domain="[]" context="{'group_by':'section_id'}"/>
                            <filter string="Stage" domain="[]" context="{'group_by':'stage_id'}"/>
                            <filter string="Customer" help="Partner" domain="[]" context="{'group_by':'partner_id'}"/>
                            <filter string="Country" domain="[]" context="{'group_by':'country_id'}"/>
                            <filter string="Referrer" domain="[]" context="{'group_by':'referred'}"/>
                            <filter string="Campaign" domain="[]" context="{'group_by':'type_id'}"/>
                            <filter string="Channel" domain="[]" context="{'group_by':'channel_id'}"/>
                            <filter string="Creation" domain="[]" context="{'group_by':'create_date'}"/>
                        </group>
                        <group string="Display">
                            <filter string="Show Countries" context="{'invisible_country': False}" help="Show Countries"/>
                            <filter string="Show Sales Team" context="{'invisible_section': False}" domain="[]" help="Show Sales Team"/>
                        </group>
                    </search>
                </field>
            </record>

    其中:
    <filter string="Show Countries" context="{'invisible_country': False}" help="Show Countries"/>
    定义了在搜索视图中选择“显示国家”时,设置变量 invisible_country 的值为 False,tree 视图中引用变量,设置字段“国家”的显示或隐藏,
    tree视图中的代码如下所示:
    <field name="country_id" invisible="context.get('invisible_country', True)"/>

    4.在Action中定义,context用于传递在后台搜索方法中使用的变量:

    示例代码:

    <act_window name="Related Products"
                        context="{'related_product':1}"
                        res_model="product.product"
                        src_model="product.product"
                        view_mode="tree,form"
                        key2="client_action_multi"
                        id="action_related_products2"/>

    其中:
    context="{'related_product':1}"
    定义了变量 related_product 的值为 1 ,后台代码中引用变量的代码如下所示:

    from osv import osv, fields
    
    class product_product(osv.osv):
    
        _inherit = 'product.product'
    
        def search(self, cr, uid, args=None, offset=0, limit=None, order=None,
                context=None, count=False):
            if context is None:
                context = {}
    
            if context.get('related_product') and context.get('active_ids'):
                bom_obj = self.pool.get('mrp.bom')
                product_bom = bom_obj.search(cr,uid, [('product_id', 'in', context['active_ids'])])
                parent_bom = [bom.bom_id.id for bom in
                        bom_obj.browse(cr,uid, product_bom) if bom.bom_id.id]
                rel_ids = [bom.product_id.id for bom in bom_obj.browse(cr, uid, parent_bom)]
                args.append(('id', 'in', rel_ids))
                return super(product_product, self).search(cr,uid,args,offset,limit,
                        order,context=context, count=count)
    
            return super(product_product, self).search(cr,uid,args,offset,limit,
                        order,context=context, count=count)
    product_product()

    后台代码中通过继承并覆写search方法,判断 context 中变量 related_product 的值,共用产品视图中实现了根据产品作为BOM的原料而生成的所有产品的的查询(列表)。

    5.在后台代码中传递,context用于方法调用过程中变量的传递:

    示例代码:

    #写入,可用于校验写入和更改数据的合法性
        def write(self, cr, uid, ids, vals, context=None):
            if context is None:
                context = {}
            if not context.get('set_to_draft', False): #非设置为草稿状态的操作
                for rec in self.browse(cr, uid, ids, context=context):
                    if rec.state == 'draft' and rec.create_uid.id != uid:
                        raise osv.except_osv(_(u'警告!'),_(u'您不能修改他人创建的单据.'))
            return super(dispatch_sale, self).write(cr, uid, ids, vals, context=context)
        
    
        #设置为草稿状态
        def set_to_draft(self, cr, uid, ids, context=None):
            ctx = context.copy()
            ctx['set_to_draft'] = True #用于在write方法中判断是否是设置为草稿状态的操作
            return self.write(cr, uid, ids, {'state': 'draft'}, ctx)

    其中:
    set_to_draft 方法中定义了变量 ctx['set_to_draft'] = True 并作为参数传递到 write 中,
    write 方法中判断变量的值 if not context.get('set_to_draft', False) 执行响应的业务逻辑。

  • 相关阅读:
    青魔法圣堂法术 Django的技术栈(持续更新)
    青魔法圣堂法术 Django REST framework (DRF) 框架(持续更新)
    Python无法卸载的解决办法
    Django开发social-auth-app-django 第三方登陆
    【转载】青魔法圣堂法术Django项目知识点汇总
    基于session 的springMvc 国际化
    java导出生成csv文件
    mybatis + log4j 打印mybatis的sql
    spring Mvc + Mybatis 中使用junit
    spring官网项目
  • 原文地址:https://www.cnblogs.com/chjbbs/p/3793219.html
Copyright © 2020-2023  润新知