• openerp学习笔记 domain 增加扩展支持,例如支持 <field name="domain">[('type','=','get_user_ht_type()')]</field>


    示例代码1,ir_action_window.read :

    # -*- coding: utf-8 -*-
    from openerp.osv import fields,osv

    class res_users(osv.osv):
        _name = 'res.users'
        _inherit = 'res.users'
        _columns = {
                    'ht_type' : fields.selection([
                    ('makings',u'材料'),
                    ('theme',u'主题'),
                    ('decorate',u'装修')
                    ],u'类型'),
                    }

        #获取用户具有审核权限的合同类型   
        def _get_ht_type(self, cr, uid, context=None):
            return self.browse(cr, uid, uid, context=context).ht_type
           
    res_users()

    # 为 domain 增加扩展支持,使用 get_user_ht_type() 获取用户具有审核权限的合同类型
    class ir_action_window(osv.osv):
        _inherit = 'ir.actions.act_window'

        def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
            if context is None:
                context = {}
            obj_user = self.pool.get('res.users')
            select = ids
            if isinstance(ids, (int, long)):
                select = [ids]
            res = super(ir_action_window, self).read(cr, uid, select, fields=fields, context=context, load=load)
            for r in res:
                mystring = 'get_user_ht_type()'
                if mystring in (r.get('domain', '[]') or ''):
                    r['domain'] = r['domain'].replace(mystring, str(obj_user._get_ht_type(cr, uid)))
            if isinstance(ids, (int, long)):
                if res:
                    return res[0]
                else:
                    return False
            return res

    ir_action_window()

    视图中调用:

    <field name="domain">[('type','=','get_user_ht_type()')]</field>

    其它示例代码:

     1 # -*- coding: utf-8 -*-
     2 
     3 from openerp.osv import fields, osv
     4 from openerp import tools
     5 
     6 class hr_department(osv.osv):
     7     def name_get(self, cr, uid, ids, context=None):
     8         if context is None:
     9             context = {}
    10         if not ids:
    11             return []
    12         reads = self.read(cr, uid, ids, ['name','parent_id'], context=context)
    13         res = []
    14         for record in reads:
    15             name = record['name']
    16             if record['parent_id']:
    17                 name = record['parent_id'][1]+' / '+name
    18             res.append((record['id'], name))
    19         return res
    20 
    21     def _dept_name_get_fnc(self, cr, uid, ids, prop, unknow_none, context=None):
    22         res = self.name_get(cr, uid, ids, context=context)
    23         return dict(res)
    24 
    25     _name = "hr.department"
    26     _columns = {
    27         'name': fields.char('Department Name', size=64, required=True),
    28         'complete_name': fields.function(_dept_name_get_fnc, type="char", string='Name'),
    29         'company_id': fields.many2one('res.company', 'Company', select=True, required=False),
    30         'parent_id': fields.many2one('hr.department', 'Parent Department', select=True),
    31         'child_ids': fields.one2many('hr.department', 'parent_id', 'Child Departments'),
    32         'note': fields.text('Note'),
    33     }
    34 
    35     _defaults = {
    36         'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'hr.department', context=c),
    37                 }
    38 
    39     def _get_members(self, cr, uid, context=None):
    40         mids = self.search(cr, uid, [('manager_id', '=', uid)], context=context)
    41         result = {uid: 1}
    42         for m in self.browse(cr, uid, mids, context=context):
    43             for user in m.member_ids:
    44                 result[user.id] = 1
    45         return result.keys()
    46 
    47     def _check_recursion(self, cr, uid, ids, context=None):
    48         if context is None:
    49             context = {}
    50         level = 100
    51         while len(ids):
    52             cr.execute('select distinct parent_id from hr_department where id IN %s',(tuple(ids),))
    53             ids = filter(None, map(lambda x:x[0], cr.fetchall()))
    54             if not level:
    55                 return False
    56             level -= 1
    57         return True
    58 
    59     _constraints = [
    60         (_check_recursion, 'Error! You cannot create recursive departments.', ['parent_id'])
    61     ]
    62 
    63 hr_department()
    64 
    65 class ir_action_window(osv.osv):
    66     _inherit = 'ir.actions.act_window'
    67 
    68     def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
    69         if context is None:
    70             context = {}
    71         obj_dept = self.pool.get('hr.department')
    72         select = ids
    73         if isinstance(ids, (int, long)):
    74             select = [ids]
    75         res = super(ir_action_window, self).read(cr, uid, select, fields=fields, context=context, load=load)
    76         for r in res:
    77             mystring = 'department_users_get()'
    78             if mystring in (r.get('domain', '[]') or ''):
    79                 r['domain'] = r['domain'].replace(mystring, str(obj_dept._get_members(cr, uid)))
    80         if isinstance(ids, (int, long)):
    81             if res:
    82                 return res[0]
    83             else:
    84                 return False
    85         return res
    86 
    87 ir_action_window()
    88 
    89 
    90 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
    View Code
     1 # -*- encoding: utf-8 -*-
     2 
     3 from osv import osv, fields
     4 
     5 class partner_category(osv.osv):
     6     _inherit = 'res.partner.category'
     7     _columns = {
     8         'company_id': fields.many2one('res.company', 'Company',select=1, help="The "Company" field is used to filter data in the "Company Partners" view.")
     9         }
    10     
    11     def _get_company(self, cr, uid, id, context=None):
    12         if context is None:
    13             context={}
    14         return self.pool.get('res.partner.category').browse(cr, uid, id, context).company_id.id
    15     
    16     def _default_company(self, cr, uid, context=None):
    17         if context is None:
    18             context={}
    19         return self.pool.get('res.users').browse(cr, uid, uid, context).company_id.id
    20         
    21     def onchange_parent_id(self, cr, uid, ids, parent_id, context=None):
    22         if context is None:
    23             context={}
    24         
    25         v={}
    26 
    27         if parent_id:
    28             parent_company = self._get_company(cr, uid, parent_id, context)
    29             if parent_company:
    30                 v['company_id'] = parent_company
    31         return {'value': v}
    32     
    33     _defaults = {  
    34         'company_id': _default_company,  
    35         }
    36 partner_category()
    37 
    38 class ir_action_window(osv.osv):
    39     _inherit = 'ir.actions.act_window'
    40 
    41     def read(self, cr, uid, ids, fields=None, context=None,
    42             load='_classic_read'):
    43         select = ids
    44         if isinstance(ids, (int, long)):
    45             select = [ids]
    46         res = super(ir_action_window, self).read(cr, uid, select, fields=fields,
    47                 context=context, load=load)
    48         for r in res:
    49             mystring = 'get_company_categories()'
    50             user_obj = self.pool.get('res.users').browse(cr, uid, uid)
    51             if mystring in (r.get('domain', '[]') or ''):
    52                 r['domain'] = r['domain'].replace(mystring, str(
    53                     self.pool.get('res.partner.category').search(cr, uid, [('company_id', '=', user_obj.company_id.id)])))
    54         if isinstance(ids, (int, long)):
    55             if res:
    56                 return res[0]
    57             else:
    58                 return False
    59         return res
    60 
    61 ir_action_window()
    62 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
    View Code

    视图中调用:

            <record id="action_company_partners_form" model="ir.actions.act_window">
                <field name="name">Company Partners</field>
                <field name="type">ir.actions.act_window</field>
                <field name="res_model">res.partner</field>
                <field name="view_type">form</field>
                <field name="domain">[('category_id', 'in', get_company_categories())]</field>
            </record>
    View Code

    示例代码2,self.search

    This is an example.
    Look to USER_PARTNER_IDS and USER_PAYMENT_MODE_IDS.

    Part of example.xml:
        <record id="action_income_payment_line_tree" model="ir.actions.act_window">
          <field name="name">Входящие платежи</field>
          <field name="res_model">payment.line</field>
          <field name="view_type">form</field>
          <field name="view_mode">tree,form</field>
          <field name="limit">300</field>
          <field name="context">{"search_default_today":1}</field>
          <field name="domain">[('partner_id','in','USER_PARTNER_IDS')]</field>
          <field name="search_view_id" ref="view_payment_line_search"/>
        </record>

        <record id="action_outgoing_payment_line_tree" model="ir.actions.act_window">
          <field name="name">Исходящие платежи</field>
          <field name="res_model">payment.line</field>
          <field name="view_type">form</field>
          <field name="view_mode">tree,form</field>
          <field name="limit">300</field>
          <field name="context">{"search_default_today":1}</field>
          <field name="domain">[('payment_mode','in','USER_PAYMENT_MODE_IDS')]</field>
          <field name="search_view_id" ref="view_payment_line_search"/>
        </record>

    Part of example.py:
        def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False, xtra=None):
            user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
            new_args = []
            for arg in args:
                if type(arg) is not tuple:
                    new_args += arg
                    continue
                if arg[2] == 'USER_PARTNER_IDS':
                    new_args += [(arg[0], arg[1], [p.id for p in user.partner_ids])]
                elif arg[2] == 'USER_PAYMENT_MODE_IDS':
                    new_args += [(arg[0], arg[1], [m.id for m in user.payment_mode_ids])]
                else:
                    new_args += [arg]
            return super(payment_line, self).search(cr, uid, new_args, offset, limit, order, context, count)

  • 相关阅读:
    Linux入门
    Linux和VMware
    vue中select的使用以及select设置默认选中
    Django ModelFrom组件
    Django登录(含随机生成图片验证码)注册实例
    Django组件---Django请求生命周期和中间件
    Python3之使用Crypto
    ORM大结局
    ORM多表查询下
    Pycharn破解补丁激活
  • 原文地址:https://www.cnblogs.com/cnshen/p/3167082.html
Copyright © 2020-2023  润新知