2015-05-27 61 views
7

我在Odoo 8中使用qWeb进行报告。那些生成的PDF文件以“默认”名称保存。我想为每个生成的文件设置一个特定的名称(不是在文件保存后,而是在“生成”时间)。如何在qWeb报告中设置PDF名称,Odoo?

这可能吗?如果是这样,怎么做?

在此先感谢。

回答

2

一般来说Qweb报告您可以打印您的Qweb报告Odoo 8.0

<?xml version="1.0" encoding="utf-8"?> 
<openerp> 
    <data> 
     <report 
      id="report_sale_order" 
      string="Quotation/Order" 
      model="sale.order" 
      report_type="qweb-pdf" 
      file="sale.report_saleorder" 
      name="sale.report_saleorder" 
     /> 
    </data> 
</openerp> 

<report>标签菜单具有印刷版的不同属性在Qweb 报告如果要更改名称您的印刷PDF然后名称属性对我们来说更重要。

基于属性的名称我们的报告PDF文件名过来听到广义含一个,你应该设置的名称属性上your_module_name.report_name

基地如果你想改变你的PDF文件的您定制名字 然后根据您的甜蜜报告名称更改名称属性。

我希望这应该对你有帮助.. :)

+0

感谢。真的有帮助,但我需要打印一个自定义名称“每一个” PDF。例如:我想用数据库中的名称打印每个任务。那么,有什么帮助? – Breba

+0

可能是它的可能,但我不知道如果我将来找到它,那么肯定会问你。 –

3

在Odoo 8,你可以打补丁插件/报告/控制器/ main.py的方法report_download像下面(FIX START和END之间)。然后,它将在报告操作定义中使用附件属性的代码。因为系统将始终将文件另存为数据库中的附件,您可以进一步更改行为,以便在attachment_use设置为True时仅保存在数据库中。以这种方式,不需要添加额外的字段并改变视图。

@route(['/report/download'], type='http', auth="user") 
def report_download(self, data, token): 
    """This function is used by 'qwebactionmanager.js' in order to trigger the download of 
    a pdf/controller report. 

    :param data: a javascript array JSON.stringified containg report internal url ([0]) and 
    type [1] 
    :returns: Response with a filetoken cookie and an attachment header 
    """ 
    requestcontent = simplejson.loads(data) 
    url, type = requestcontent[0], requestcontent[1] 
    try: 
     if type == 'qweb-pdf': 
      reportname = url.split('/report/pdf/')[1].split('?')[0] 

      docids = None 
      if '/' in reportname: 
       reportname, docids = reportname.split('/') 

      if docids: 
       # Generic report: 
       response = self.report_routes(reportname, docids=docids, converter='pdf') 
       ##### FIX START: switch reportname with the evaluated attachment attribute of the action if available 
       docids = [int(i) for i in docids.split(',')] 
       report_obj = request.registry['report'] 
       cr, uid, context = request.cr, request.uid, request.context 
       report = report_obj._get_report_from_name(cr, uid, reportname) 
       if report.attachment: 
        obj = report_obj.pool[report.model].browse(cr, uid, docids[0]) 
        reportname=eval(report.attachment, {'object': obj, 'time': time}).split('.pdf')[0] 
       ##### FIX END  
      else: 
       # Particular report: 
       data = url_decode(url.split('?')[1]).items() # decoding the args represented in JSON 
       response = self.report_routes(reportname, converter='pdf', **dict(data)) 

      response.headers.add('Content-Disposition', 'attachment; filename=%s.pdf;' % reportname) 
      response.set_cookie('fileToken', token) 
      return response 
     elif type =='controller': 
      reqheaders = Headers(request.httprequest.headers) 
      response = Client(request.httprequest.app, BaseResponse).get(url, headers=reqheaders, follow_redirects=True) 
      response.set_cookie('fileToken', token) 
      return response 
     else: 
      return 
    except Exception, e: 
     se = _serialize_exception(e) 
     error = { 
      'code': 200, 
      'message': "Odoo Server Error", 
      'data': se 
     } 
     return request.make_response(html_escape(simplejson.dumps(error))) 

您可以在这种方式,例如一个报告采取行动的附件属性:

<?xml version="1.0" encoding="UTF-8"?> 
<openerp> 
    <data> 
    <!-- rename the file names of the standard rfq report --> 
     <record id="purchase.report_purchase_quotation" model="ir.actions.report.xml"> 
      <field name="attachment">'RFQ_'+object.name+'.pdf'</field> 
     </record>  
    </data> 
</openerp> 

这是插件/报告/ report.py报告对象的_check_attachment的修改补丁在attachment_use行为:

@api.v7 
def _check_attachment_use(self, cr, uid, ids, report): 
    """ Check attachment_use field. If set to true and an existing pdf is already saved, load 
    this one now. Else, mark save it. 
    """ 
    save_in_attachment = {} 
    save_in_attachment['model'] = report.model 
    save_in_attachment['loaded_documents'] = {} 

    if report.attachment: 
     for record_id in ids: 
      obj = self.pool[report.model].browse(cr, uid, record_id) 
      filename = eval(report.attachment, {'object': obj, 'time': time}) 

      # If the user has checked 'Reload from Attachment' 
      if report.attachment_use: 
       alreadyindb = [('datas_fname', '=', filename), 
           ('res_model', '=', report.model), 
           ('res_id', '=', record_id)] 
       attach_ids = self.pool['ir.attachment'].search(cr, uid, alreadyindb) 
       if attach_ids: 
        # Add the loaded pdf in the loaded_documents list 
        pdf = self.pool['ir.attachment'].browse(cr, uid, attach_ids[0]).datas 
        pdf = base64.decodestring(pdf) 
        save_in_attachment['loaded_documents'][record_id] = pdf 
        _logger.info('The PDF document %s was loaded from the database' % filename) 

        continue # Do not save this document as we already ignore it 

      # FIX START (commenting out below lines and indenting the else clause one level down) 
      # If the user has checked 'Save as Attachment Prefix' 
      #~ if filename is False: 
       #~ # May be false if, for instance, the 'attachment' field contains a condition 
       #~ # preventing to save the file. 
       #~ continue 
       else: 
        save_in_attachment[record_id] = filename # Mark current document to be saved 
      # FIX END 
    return save_in_attachment 
+0

我可以确认它的魅力。 –

2

插件\报告\控制器\ main.py

线:127

response.headers.add('Content-Disposition', 'attachment; filename=%s.pdf;' % reportname) 

invoicename="ma_facture" #create a variable you can add date for example stfftime("%d-%m-%Y") 
response.headers.add('Content-Disposition', 'attachment; filename=%s.pdf;' % invoicename) 
+0

你好Usman Maqbool,我批准你最后的编辑建议。我想建议,编辑时,不要将编程语言的名称放在'code markdown'中,并从帖子中删除“谢谢”。亲切的问候! –

+1

al-right,下次我会照顾的。 –

+0

@ S.L。巴特现在请取消禁令,我得到了我的错误...请。 –

2
<report 
     id="report_sale_order" 
     string="Quotation/Order" 
     model="sale.order" 
     report_type="qweb-pdf" 
     file="sale.report_saleorder" 
     name="sale.report_saleorder" 
/> 

是字符串名称正确完成

2

您可以使用配置给动态报​​表的名字,但是当你打印一份报告,它将应用。

下面的例子在报告打印自定义名称中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社区模块的V8和V9的链接。

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

https://www.odoo.com/apps/modules/8.0/report_custom_filename/ 这可能会帮助你。

0

简单的方法来在Odoo V10变更报告PDF文件名:

只需添加该代码,你写报告的标签,并给两个相同的ID,报告和新添加的记录。像下面这样:

<report id="report_quote_temp" string="Quote Template" model="sale.order" report_type="qweb-pdf" 
    file="custom_template.report_quote_custom" name="custom_template.report_quote_custom" 
    menu="True" paperformat="custom_template.custom_paperformat" /> 

<record id="report_quote_temp" model="ir.actions.report.xml"> 
    <field name="print_report_name">'SALES_'+object.name+'.pdf'</field> 
</record> 

它将打印报告文件SALES_SO004.pdf,其中SO004是你的销售或引用数。

+0

谢谢克莱门斯.... –