zoukankan      html  css  js  c++  java
  • (20)odoo中的action

    ---------
    更新时间
    18:06 2016-09-18 星期日
    15:05 2016-03-14 星期一
    18:07 2016-02-19 星期五
    ---------
    * 窗口动作
       <?xml version="1.0" encoding="utf-8" ?>
        <openerp>
           <data>
             <act_window id="action_todo_stage"
                         name="To-Do Task Stages"
                         res_model="todo.task.stage"
                         view_mode="tree,form" />

             <act_window id="todo_app.action_todo_task"
                         name="To-Do Task "
                         res_model="todo.task"
                         view_mode="tree,form,calendar,gantt,graph"
                         target="current"
                         context="{'default_user_id':uid}"
                         domain="[]"
                         limit="80" />
             <act_window id="action_todo_task_stage"
                         name="To-Do Task Stages"
                         res_model="todo.task.stage"
                         src_model="todo.task"
                         multi="False" />
           </data>

        </openerp>
       
        可以用ir.action.act_window 重新写上面的对象
        <record id="action_todo_stage" model="ir.actions.act_window">
            <field name="name">To-Do Task Stage</field>
            <field name="type">ir.actions.act_window</field>
            <field name="domain">["list of 3-tuples (max 250 characters)"]</field>
            <field name="context">{"context dictionary (max 250 characters)"}</field>
            <field name="res_model">todo.task.stage</field>
            <field name="view_type">form</field>
            <field name="view_mode">tree,form</field>
            <field name="search_view_id" ref="todo_task_search"/>
            <field name="view_id" ref="view_form_todo_task_ui" />
        </record>
       
        窗口的动作是存在 ir.actions.act_window 模型中的,我们可以在xml文件中用<act_window>来快捷定义
        下面是部分属性说明,完整的可以在 openerp/addons/base/ir/ir_actions.py 中的 ir.actions.act_window
        类中可以找到
        # name 显示的标题
        # type 动作类型 ,默认ir.actions.act_window
        # view_id 中的 ref 值是对应视图对象的id 触发时用哪个视图
        # context 设置目标视图的上下文
        # domain 过滤记录按条件,如:[["customer", "=", true]]
        # res_id: 当动作打开视图是表单视图时,要指定的加载记录id,只有‘view_mode’ 值为 form时才有效
                  否则就会新建一个记录 如:"res_id": a_product_id,
        # res_model 动作响应的目标模型
        # target 如果设置为new 就打开新窗口,默认是 current
        # view_mode:列出允许使用的视图模式 如 form, tree, calendar,etc 默认是 tree,form
        # view_type:设定tree时的列表是树状还是普通列表, tree-树状   form-普通列表 缺省是form
        # usage: 过滤菜单和动作
        # view_ids:
        # views:是(view_id,view_type) 元组对列表,第一组是动作默认打开的视图
                如:"views": [[False, "tree"], [False, "form"]]
        # limit 指列表视图时,一页的记录数,默认是80
        # auto_refresh: 在视图中添加一个刷新功能
        # groups_id:权限组 用快捷标签则为 groups
        # search_view_id 指定响应的搜索视图(id,name) 元组对
        # filter:列表视图显示过滤器(bool)   
        # auto_search: 加载默认视图后,自动搜索
        # src_model 指定可以启动视图的更多按钮
        # multi 设为True, 更多按钮显示在列表视图,否则显示在表单视图   
       
       
        系统的默认值:
          _defaults = {
            'type': 'ir.actions.act_window',
            'view_type': 'form',
            'view_mode': 'tree,form',
            'context': '{}',
            'limit': 80,
            'target': 'current',
            'auto_refresh': 0,
            'auto_search':True,
            'multi': False,
        }            


    * URL动作
        ir.actions.act_url
        {
        "type": "ir.actions.act_url",
        "url": "http://odoo.com",
        "target": "self",
        }
            <record id="action_website_homepage" model="ir.actions.act_url">
                <field name="name">Website Homepage</field>
                <field name="url">/page/homepage</field>
                <field name="target">self</field>
            </record>
         # name: 显示名称
         # url:网址
         # target: new 新开  self 本窗口
       

    * 服务端动作(这个是非常强大,开专题讲)
        ir.actions.server
            <record model="ir.actions.server" id="print_instance">
                <field name="name">Res Partner Server Action</field>
                <field name="model_id" ref="model_res_partner"/>
                <field name="code">
                    if object.some_condition():
                        action = {
                            "type": "ir.actions.act_window",
                            "view_mode": "form",
                            "res_model": object._name,
                            "res_id": object.id,
                        }
                </field>
            </record>
         # id 服务端动作标识
         # context 上下文
         # model_id 链接响应的模型
         # condition 条优
         # code python代码设定,这里最灵活了

    * 报表动作
        ir.actions.report.xml
           <record id="mc_crm_lead_demo_report" model="ir.actions.report.xml">
                <field name="name">Marketing campaign demo report</field>
                <field name="type">ir.actions.report.xml</field>
                <field name="model">crm.lead</field>
                <field name="report_name">crm.lead.demo</field>
                <field name="report_rml">marketing_campaign_crm_demo/crm_lead_mc_demo_report.rml</field>
                <field name="report_type">pdf</field>
            </record>
           
       
        #name 显示名称
        #type 动作类型,固定为ir.actions.report.xml
        #model 响应的模型
        #report_type 报表类型 有 ('qweb-pdf', 'PDF'),
                        ('qweb-html', 'HTML'),
                        ('controller', 'Controller'),
                        ('pdf', 'RML pdf (deprecated)'),
                        ('sxw', 'RML sxw (deprecated)'),
                        ('webkit', 'Webkit (deprecated)'),
        #report_name 要用的报表模板
        #groups_id 权限组
        #paperformat_id
        #attachment_use (bool)第二次打开还是前一次打开的结果
        #attachment 附件的名称
        # report_rml rml文件路径
       
        快捷标签<report> 用的属性有一些不同,主要是 groups
        <report
            id="account_invoices"
            model="account.invoice"
            string="Invoices"
            report_type="qweb-pdf"
            name="account.report_invoice"
            file="account.report_invoice"
            attachment_use="True"
            attachment="(object.state in ('open','paid')) and
                ('INV'+(object.number or '').replace('/','')+'.pdf')"
        />
       
       
       
    * js调用action
        在js中调用action 和直接在python 中调用action是一样的
        但是有一个比较坑的区别是  views: [[false, 'list'],[false, 'form']],
        这里与form对应的时list 而不是tree 然而在python 里边调用 action时 tree , 这个点是很难发现的。 是通过源码查找找到的。

       instance.web_calendar.CalendarView.include({
             open_event: function(id, title) {
                var self = this;
                console.log(self,"id:",id,"title:",title,'model:',self.model);
                if (self.model=='crm.phonecall'){
                    this.do_action({
                            type: 'ir.actions.act_window',
                            res_model: "crm.phonecall",
                            view_mode: 'tree',
                            view_type: 'tree,form',
                            views: [[false, 'list'],[false, 'form']],
                            domain:'[("previous_contact_id","=",'+id+')]',
                            target: 'current',
                            context:"{'default_previous_contact_id':"+id+"}",
                        }, {
                            on_reverse_breadcrumb: function () {
                                self.reload();
                            }
                        });
                }else{
                    this._super.apply(this, arguments);
                }
             }

        });

    * py文件调用action
        知识点 1. "[('id','in',[" + ','.join(map(str, sale_order_ids)) + "])]"
        在实际下情况下运用py的语法. 这操作就是 把sale_order_ids 的id列表 转换成 id字符串
        就是odoo的domain的表达式是字符串

       #这个是一个简单的一个方法  
         model_data_obj = self.pool.get('ir.model.data')
            stock_picking_tree_ids = model_data_obj.xmlid_to_res_id(
                cr, SUPERUSER_ID, 'dftg_stock_picking_tree')
            view_picking_form_id = model_data_obj.xmlid_to_res_id(
                cr, SUPERUSER_ID, 'stock.view_picking_form')
            return {
                'type': 'ir.actions.act_window',
                'res_model': 'stock.picking',
                'view_mode': 'tree,form',
                'view_type': 'form',
                'name': u'查看出/入库单',
                'views': [(stock_picking_tree_ids, 'tree'), (view_picking_form_id, 'form')],
                'view_id': stock_picking_tree_ids,
                'domain': "[('so_id','='," + str(ids[0]) + "),('state','not in',['waiting'])]",
            }
        #这种方法是更常用更强大的 会动态的返回form 或者tree 很方便
          适用各种需求
            mod_obj = self.pool.get('ir.model.data')
            act_obj = self.pool.get('ir.actions.act_window')
            result = mod_obj.get_object_reference(
                cr, uid, 'dftg_ext', 'fake_sale_order_action')
            id = result and result[1] or False
            result = act_obj.read(cr, uid, [id], context=context)[0]
            # compute the number of invoices to display

            if len(sale_order_ids) > 1:
                result[
                    'domain'] = "[('id','in',[" + ','.join(map(str, sale_order_ids)) + "])]"
            else:
                res = mod_obj.get_object_reference(
                    cr, uid, 'dftg_ext', 'fake_sale_order_form')
                result['views'] = [(res and res[1] or False, 'form')]
                result['res_id'] = sale_order_ids and sale_order_ids[0] or False
            return result
           
           
    * 客户端动作
      openerp/addons/base/ir/ir_actions.py
        ir.actions.client
            <record id="action_client_sale_menu" model="ir.actions.client">
                <field name="name">Open Sale Menu</field>
                <field name="tag">reload</field>
                <field name="params" eval="{'menu_id': ref('base.menu_base_partner')}"/>
            </record>
           
        #name 显示名称
        #tag
        #res_model 目标模型
        #context 设置目标视图的上下文
        #params 带上参数
        #params_store

  • 相关阅读:
    java使用io流读取windows文件乱码问题
    java的io字符流关闭和刷新.flush();
    java使用io流实现图片复制
    java8新特性-函数式接口详细讲解及案例
    java8的lambda过滤list遍历集合,排序
    java复制对象,复制对象属性,只可复制两个对象想同的属性名。也可自定义只复制需要的属性。
    详讲KMP算法
    java栈和队列
    请求中文乱码解决
    idea创建servlet步骤
  • 原文地址:https://www.cnblogs.com/toby2chen/p/5177157.html
Copyright © 2011-2022 走看看