2017-04-03 36 views

回答

1

您可以使用配置給出動態報告名稱,但是當您打印一份報告時它將應用。

下面的例子在報告打印自定義名稱中ir.actions.report.xml,其中用戶可以配置報告名稱創建一個字段。

from openerp import models, fields 
class IrActionsReportXml(models.Model): 
    _inherit = 'ir.actions.report.xml' 

    download_filename = fields.Char(
     'Download filename') 

現在您需要創建兩個文件。

  1. 報告控制器

    from openerp import http 
    from openerp.addons.mail.models import mail_template 
    from openerp.addons.report.controllers.main import ReportController 
    from openerp.addons.web.controllers.main import content_disposition 
    
    
    class ReportController(ReportController): 
        @http.route([ 
         '/report/<path:converter>/<reportname>', 
         '/report/<path:converter>/<reportname>/<docids>', 
        ]) 
        def report_routes(self, reportname, docids=None, converter=None, **data): 
         response = super(ReportController, self).report_routes(
          reportname, docids=docids, converter=converter, **data) 
         if docids: 
          docids = [int(i) for i in docids.split(',')] 
         report_xml = http.request.session.model('ir.actions.report.xml') 
         report_ids = report_xml.search(
          [('report_name', '=', reportname)]) 
         for report in report_xml.browse(report_ids): 
          if not report.download_filename: 
           continue 
          objects = http.request.session.model(report.model)\ 
           .browse(docids or []) 
          generated_filename = mail_template.mako_template_env\ 
           .from_string(report.download_filename)\ 
           .render({ 
            'objects': objects, 
            'o': objects[:1], 
            'object': objects[:1], 
            'ext': report.report_type.replace('qweb-', ''), 
           }) 
          response.headers['Content-Disposition'] = content_disposition(
           generated_filename) 
         return response 
    
        @http.route(['/report/download']) 
        def report_download(self, data, token): 
         response = super(ReportController, self).report_download(data, token) 
         # if we got another content disposition before, ditch the one added 
         # by super() 
         last_index = None 
         for i in range(len(response.headers) - 1, -1, -1): 
          if response.headers[i][0] == 'Content-Disposition': 
           if last_index: 
            response.headers.pop(last_index) 
           last_index = i 
         return response 
    

2.Report.py

import json 
    from openerp import http 
    from openerp.addons.web.controllers import main 
    from openerp.addons.mail.models import mail_template 


    class Reports(main.Reports): 
     @http.route('/web/report', type='http', auth="user") 
     @main.serialize_exception 
     def index(self, action, token): 
      result = super(Reports, self).index(action, token) 
      action = json.loads(action) 
      context = dict(http.request.context) 
      context.update(action["context"]) 
      report_xml = http.request.env['ir.actions.report.xml'] 
      reports = report_xml.search([ 
       ('report_name', '=', action['report_name']), 
       ('download_filename', '!=', False)]) 
      for report in reports: 
       objects = http.request.session.model(context['active_model'])\ 
        .browse(context['active_ids']) 
       generated_filename = mail_template.mako_template_env\ 
        .from_string(report.download_filename)\ 
        .render({ 
         'objects': objects, 
         'o': objects[0], 
         'object': objects[0], 
        }) 
       result.headers['Content-Disposition'] = main.content_disposition(
        generated_filename) 
      return result 

Odoo社區提供我們報告的自定義名稱的默認模塊。您可以直接安裝該模塊,並設置報告名稱,如:$ {} o.name

位置o意味着你的記錄。

下面是odoo社區模塊的鏈接。

https://www.odoo.com/apps/modules/9.0/report_custom_filename/

這可能對你有幫助。

+0

非常感謝您的回覆! 但我也有另外的代碼這已經是對我的作品,但我旁邊也擺在首位代碼期待,你的代碼確實有幫助! –

0

嘗試附件在reprot改變報告文件的名稱爲您想要的名稱。

<report 
      string="Delivery Slip" 
      id="action_report_delivery" 
      model="stock.picking" 
      report_type="qweb-pdf" 
      name="stock.report_deliveryslip" 
      file="stock.report_deliveryslip" 
      attachment="'Custom Text...'+'.pdf')" 
     /> 
+0

好了讓我來試試呢。但首先我迷惑,什麼是(object.state)意味着什麼?我應該變成什麼? –

+0

它將顯示選股狀態,如果您不需要它可以忽略它。 –

+0

雖然它仍然沒有工作,我想要的文件名是從源文件(字段名稱:來源) –

0
Here is my code which works for different reportname in the same model. So the filename only changes for the certain filename. 

> 
from openerp.addons.web.http import Controller, route, request 
from openerp.addons.web.controllers.main import _serialize_exception 
from openerp.osv import osv 
from openerp.addons.report.controllers.main import ReportController 
from openerp import http 
import simplejson 
import logging 

class SponsorReportController(ReportController): 

    @route(['/report/download'], type='http', auth="user") 
    def report_download(self, data, token): 
     requestcontent = simplejson.loads(data) 
     url, type = requestcontent[0], requestcontent[1] 

     logging.info(url) 
     logging.info(type) 

     response = ReportController().report_download(data, token) 

     if len(url.split('/report/pdf/')) > 1 and type == 'qweb-pdf': 

      reportname = url.split('/report/pdf/')[1].split('?')[0] 
      reportname, docids = reportname.split('/') 
      logging.info(reportname) 
      assert docids 
      logging.info(docids) 

      if reportname == 'pci_stock_picking_report.report_delivery_note': 
       partner_obj = http.request.env['stock.picking'] 
       object = partner_obj.browse(int(docids)) 
       filename = "No."+(object.origin) 
       response.headers.set('Content-Disposition', 'attachment; filename=%s.pdf;' % filename) 

     return response