odoo报表

* odoo8 采用是Qweb报表,废弃了7.0中的RML报表
        
* 创建业务报表
    报表是通过Qweb的技术来建立的
    #一般报表结构如下:
     purchase
       ├ views
       │  ├ report_purchaseorder.xml (报表模板)
       │  ├ report_purchasequotaion.xml
       ├ purchase_report.xml (模块中报表定义 模块名_report.xml)    
       
     当要建立报表时,就按这样的结构来创建,    
     
    #注意,报表,用到了wkhtmltopdf依赖
      http://wkhtmltopdf.org/downloads.html   wkhtmltopdf-0.12.1 版本
      $ sudo apt-get remove --purge wkhtmltopdf
      $ cd /tmp
      $ wget http://downloads.sourceforge.net/project/wkhtmltopdf/archive/0.12.1/
              wkhtmltox-0.12.1_linux-trusty-adm64.deb
              
      $ sudo dpkg -i wkhtmltox-0.12.1_linux-trusty-amd64.deb
  
    #报表定义purchase_report.xml:(注册报表)
     
       
           
                                    string="Purchase Order" 
                    id="action_report_purchase_order" 
                    model="purchase.order" 
                    report_type="qweb-pdf"
                    name="purchase.report_purchaseorder" 
                    file="purchase.report_purchaseorder" 
                />

                                    string="Request for Quotation" 
                    id="report_purchase_quotation" 
                    model="purchase.order" 
                    report_type="qweb-pdf"
                    name="purchase.report_purchasequotation" 
                    file="purchase.report_purchasequotation"
                />
           
       
        @string: 在打印按钮那里的显示名称 
        @id:外id标识
        @name: 完整主模板名称 模块名.主板模名称  用于管理和调用
        @file: 完整模板文件名 模块名.模板文件名  用于更好地关联模板
        @model:相关的模型显示在那个模块进行打印报表 通常在各视图中的打印那里会出现
         上面表示在采购订单相关视图时,会出现“打印-询价单/采购订单”
        @report_type: 报表类型 是 qweb-pdf 或 qweb-html
        @report_name: 打印出来的文件名
        @groups_id:指定权限
        --------
        attachment_use="True"
        attachment="(object.state in ('open','paid')) and
        ('INV'+(object.number or '').replace('/','')+'.pdf')"
        @attachment_use:使用附件,这样不会一直查数据库,只能当数据变化时才会查数据库
        @attachment:附件的名称,当我们下载下来的文件名
        ------
              
        是 ir.actions.report.xml 模型的快捷方式
        
    
       
                Purchase Order
                purchase.order
                qweb-pdf
               
                    purchase.report_purchaseorder
               

                 
                #指定的纸张 可以到 addons/report/data/report_paperformat.xml 查看可用纸张规格
       

        报表可以在 设置->技术->报表 可以查到
         t-call 调用的标准报告架构,这个很重要
         report.external_layout 包含头部和尾部 ,也可以只用 report.internal_layout 只用
         基础架构的头部,其它部分自己写
         
    # 报表模板 report_purchaseorder.xml
        # /addons/purchase/views/report_purchase.xml:
       
           
           
           

           
           
           
            
            来一段没有翻译的模板
           
            
        @docs 当前报表记录集
        @doc_ids 报表记录集的ids列表
        @doc_model 报表录集对应的模型
        @translate_doc 翻译报表
       
         
       

        @user 打印报表的人
        @res_company 当前用户的公司
            
         @调用了report.external_layout 模板 所在的布局文件在 /addons/report/views/layouts.xml
         @注意translate_doc 中的 purchase.report_purchaseorder_document ,这个要报表视图id前加模块名
          这个名称和模板的id名称要一致
         @模板名称 report_purchaseorder_documen  和模板名称 report_purchaseorder
          这样在报表定义时 purchase.report_purchaseorder 就可以关联到定义的模板
         @ 大家可能注意到了o 对于o是代表当前报表模型数据 在/addons/report/models/report.xml
           translate_doc 这个方法
           def translate_doc(self, cr, uid, doc_id, model, lang_field, template, values, context=None):
                ctx = context.copy()
                doc = self.pool[model].browse(cr, uid, doc_id, context=ctx)
                qcontext = values.copy()
                # Do not force-translate if we chose to display the report in a specific lang
                if ctx.get('translatable') is True:
                    qcontext['o'] = doc
                else:
                    # Reach the lang we want to translate the doc into
                    ctx['lang'] = eval('doc.%s' % lang_field, {'doc': doc})
                    qcontext['o'] = self.pool[model].browse(cr, uid, doc_id, context=ctx)
                return self.pool['ir.ui.view'].render(cr, uid, template, qcontext, context=ctx)
            看到o就是报表中的的对象,若选择多个就是objects ,单个用o
            报表中除了html的布局,剩下的就是用qweb语言来写的,和python类似。            
        

    #在报表中呈现数据    
    可用的变量:
      docs 循环打印出一个记录集
      doc_ids 一个记录集的ids列表打印出来
      doc_model 调用哪个模型来处理
      time 时间
      user 本次执行报告的用户
      res_company  当前用户所在的公司
     
      
      字段值用 t-field 属性 还可以用其补充属性 t-field-options
      上一道菜:
      


           


           


               
                   

  •                                              t-att-src="'data:image/png;base64,%s' % f.image_small"
                             style="max-height: 45px;"/>
                       
                   

  •            

           

        有货币字段:
                     t-field-options='{
            "widget": "monetary",
            "display_currency": "o.pricelist_id.currency_id"}'/>

        

            t-field-options='{
            "widget": "contact",
            "fields": ["address", "name", "phone", "fax"],
            "no_marker": true}' />
            
         支持语言翻译
        
         translate_doc
         
          
            注:col-xs-N  N代表多少列 像bootstrap写法,一行划成12列
                循环到了最后
                
                
         #纸张格式

           
                To-do Tasks
                todo.task
                qweb-html
               
                    todo_kanban.report_todo_task_template
               

               
           
         
            paper_format_id 引用了 report.paperformat_euro 这个格式,这个值,可以在
            设置->技术->报告->纸张格式
            
            定义纸张格式
           
                French Bank Check
               
                custom
                80
                175
                Portrait
                3
                3
                3
                3
               
                3
                80
           

            
            
            
        #模板加入模块中(__openerp__.py)
       'data': [
        
        'views/report_purchaseorder.xml',
        'views/report_purchasequotation.xml',
        ],   

        #加入条件码:
       
                    type=%s&value=%s&width=%s&height=%s'%('QR', 'text', 200, 200)"/>
            
        # 报表加入css
       
        
    #自定义报表
      默认有 get_html方法来调用报表传递数据,这时,我们只要定义模型时,重写这个方法就
      可以完成自定义报表输出
        from openerp import api, models

      class ParticularReport(models.AbstractModel):
        _name = 'report.module.report_name'
        @api.multi
        def render_html(self, data=None):
            report_obj = self.env['report']
            report = report_obj._get_report_from_name('module.report_name')
            docargs = {
                'doc_ids': self._ids,
                'doc_model': report.model,
                'docs': self,
            }
            return report_obj.render('module.report_name', docargs)

你可能感兴趣的:(Python,Odoo,报表,odoo)