简体   繁体   English

如何在qWeb报告中设置PDF名称,Odoo?

[英]How to set PDF name in qWeb report, Odoo?

I'm making reports using qWeb in Odoo 8. Those generated PDF files are saved with a "default" name. 我在Odoo 8中使用qWeb进行报告。这些生成的PDF文件以“默认”名称保存。 I would like to set a specific name to every generated file (not after file was saved, but in "generation" time). 我想为每个生成的文件设置一个特定的名称(不是在保存文件之后,而是在“生成”时间内)。

Is that possible? 那可能吗? If it is, how to do it? 如果是的话,该怎么做?

Thanks in advance. 提前致谢。

In Odoo 8 you can patch the method report_download of addons/report/controllers/main.py like below (between FIX START and END). 在Odoo 8中,您可以修改addons / report / controllers / main.py的方法report_download,如下所示(在FIX START和END之间)。 It will then use the code for the attachment attribute in the report action definition. 然后,它将在报告操作定义中使用附件属性的代码。 As the system will then always also save the file as an attachment in the database you can change the behaviour further to only save in the database when attachment_use is set to True. 由于系统将始终将文件另存为数据库中的附件,因此当attachment_use设置为True时,您可以进一步更改行为以仅保存在数据库中。 In this way no extra fields need to be added and views changed. 这样就不需要添加额外的字段并改变视图。

@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))) 

You can set the attachment attribute of a report action for example in this way: 您可以通过以下方式设置报告操作的附件属性:

<?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> 

This is the patch of _check_attachment of the Report object in addons/report/report.py to modify the attachment_use behaviour: 这是addons / report / report.py中Report对象的_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  

you can use 'custom file name' module 您可以使用“自定义文件名”模块

  1. Download module 下载模块
  2. https://www.odoo.com/apps/modules/8.0/report_custom_filename/ https://www.odoo.com/apps/modules/8.0/report_custom_filename/
  3. Change name in setting - > action -> report 在设置 - >操作 - >报告中更改名称

select your report and change the name .. 选择您的报告并更改名称..

In General Qweb Report the Menu you can print your Qweb Report in Odoo 8.0 在Qweb General报告菜单中,您可以在Odoo 8.0中打印Qweb报告

<?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>

In <report> Tag has the different attributes for print the report in Qweb If you want to change the name of your printed PDF then the name Attribute is more important for us. <report>标签中具有用于在Qweb中打印报表的不同属性如果要更改打印PDF的名称,则名称属性对我们来说更重要。

Based on the name attribute our report PDF File name comes over hear in generalize one you should set the name attribute base on your_module_name.report_name 基于name属性我们的报告PDF文件名称听到概括你应该根据your_module_name.report_name设置名称属性

If you want to change your customize name of your PDF File then change the name attribute as per your sweet report name. 如果要更改PDF文件的自定义名称,请根据甜蜜报告名称更改名称属性。

I hope this should helpful for you ..:) 我希望这对你有帮助.. :)

addons\\report\\controllers\\main.py 插件\\报告\\控制器\\ main.py

Line : 127 行:127

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

change it with 改变它

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)

我认为这是一个在版本9中修复的错误。只需用这个https://github.com/odoo/odoo/blob/9.0/addons/report/controllers替换addons \\ report \\ controllers \\ main.py的内容/main.py然后重启odoo服务器

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

is correct for string name is a print PDF name done 字符串名称是正确的是打印PDF名称完成

You can give dynamic report name using configuration, but it will apply when you print one report. 您可以使用配置提供动态报告名称,但在打印一份报告时将适用。

Below is the example to Print custom name in report. 以下是在报告中打印自定义名称的示例。 Create one field in ir.actions.report.xml , in which user can configure report name . ir.actions.report.xml中 创建一个字段,用户可以在其中配置报告名称

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

    download_filename = fields.Char(
        'Download filename')

Now you need to create two files. 现在您需要创建两个文件。

  1. Report Controller 报告控制器

     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 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 community Providing us a default module for report custom name. Odoo社区为我们提供报告自定义名称的默认模块。 you can directly install this module and set report name like : ${o.name} 您可以直接安装此模块并设置报告名称,如:$ {o.name}

Here o means your record. 这意味着你的记录。

Below is a link of odoo community module for V8 and V9. 以下是V8和V9的odoo社区模块的链接。

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

https://www.odoo.com/apps/modules/8.0/report_custom_filename/ This may help you. https://www.odoo.com/apps/modules/8.0/report_custom_filename/这可能对您有所帮助。

Easy Way to change report PDF file name in Odoo v10: 在Odoo v10中更改报告PDF文件名的简便方法:

Just add this code where you write the report tag, and give same ID in both, report and new added record. 只需在编写报告标记的位置添加此代码,并在报告和新添加的记录中同时提供相同的ID。 Like the following: 如下:

<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>

It will print the report file as SALES_SO004.pdf , where SO004 is your sale or quotation number. 它会将报告文件打印为SALES_SO004.pdf ,其中SO004是您的销售或报价编号。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM