Как установить имя PDF в отчете qWeb, Odoo?

Я делаю отчеты с помощью qWeb в Odoo 8. Эти сгенерированные файлы PDF сохраняются с именем «по умолчанию». Я хотел бы установить конкретное имя для каждого сгенерированного файла (не после того, как файл был сохранен, а во время «генерации»).

Это возможно? Если да, то как это сделать?

Заранее спасибо.


person Breba    schedule 27.05.2015    source источник


Ответы (8)


В Odoo 8 вы можете исправить метод report_download из addons/report/controllers/main.py, как показано ниже (между 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> 

Это патч _check_attachment объекта Report в addons/report/report.py для изменения поведения 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  
person Jeroen Vet    schedule 22.08.2015


В меню Общий отчет 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-файла, измените атрибут имени в соответствии с вашим милым именем отчета.

Я надеюсь, что это должно быть полезно для вас ..:)

person DASADIYA CHAITANYA    schedule 27.05.2015
comment
Спасибо. Это действительно помогает, но мне нужно распечатать «каждый» PDF-файл с настроенным именем. Например: я хочу распечатать каждую задачу с именем, которое она имеет в базе данных. Итак, любая помощь? - person Breba; 28.05.2015
comment
Может быть, это возможно, но я не знаю об этом, если я найду в будущем, то обязательно спрошу об этом у вас. - person DASADIYA CHAITANYA; 04.06.2015

аддоны\отчет\контроллеры\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)
person Usman Maqbool    schedule 02.09.2015
comment
Здравствуйте, Usman Maqbool, я одобрил ваше последнее предложение по редактированию. Хочу предложить при редактировании не ставить названия языков программирования в code markdown, а спасибо убирать из постов. С уважением! - person S.L. Barth; 22.10.2015
comment
@С.Л. Барт, пожалуйста, снимите бан, и я понял свою ошибку... пожалуйста. - person Usman Maqbool; 29.10.2015
comment
Только модераторы могут давать или снимать запреты на редактирование. Хотя обычно они временные. Вам придется подождать, пока это не закончится. Возможно, вас заинтересуют обсуждения этого вопроса на Meta Stack Overflow, хотя, честно говоря, я не думаю, они очень помогут. - person S.L. Barth; 29.10.2015
comment
да, я видел эту ссылку, но это бесполезно для моего случая. Вы хоть представляете, сколько времени уходит на снятие запретов? - person Usman Maqbool; 29.10.2015
comment
Эта информация должна быть дана с запретом на редактирование. Мне нужно посмотреть, чтобы знать наверняка, но я думаю, что в первый раз это 2 дня. Второй бан 7 дней, а потом месяц. Но опять же - надо будет поискать. - person S.L. Barth; 29.10.2015
comment
Я не получаю никакой информации о количестве заблокированных дней, и я заблокирован в первый раз, и это более 2 дней. - person Usman Maqbool; 29.10.2015

Я думаю, что это была ошибка, которая была исправлена ​​в версии 9. Просто замените содержимое addons\report\controllers\main.py этим https://github.com/odoo/odoo/blob/9.0/addons/report/controllers/main.py, а затем перезапустите odoo сервер

person Cyrusville    schedule 14.10.2015

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

правильно для имени строки это имя печати PDF сделано

person Murugan c    schedule 04.12.2015

Вы можете задать имя динамическому отчету с помощью конфигурации, но оно будет применяться при печати одного отчета.

Ниже приведен пример Печать пользовательского имени в отчете. Создайте одно поле в ir.actions.report.xml, в котором пользователь может настроить < strong>название отчета.

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/ Это может вам помочь.

person Emipro Technologies Pvt. Ltd.    schedule 04.04.2017

Простой способ изменить имя PDF-файла отчета в Odoo v10:

Просто добавьте этот код туда, где вы пишете тег отчета, и укажите один и тот же идентификатор как в отчете, так и в новой добавленной записи. Как следующее:

<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 – номер вашей продажи или предложения.

person Vibha Kachhela    schedule 31.01.2018