This Odoo technical development blog is my way to contribute back to the Odoo Community, for all the selfless and great sharing by the community members.
If you are generating Odoo report in the standard wizard, pdf report name is always static, even though print_report_name is being used. Wizard is being used to have a pop up selection for user to enter the selection parameter to generate the report.
This will be inconvenient to the user who has to download the report pdf file and rename it every time. There isn't any option do it easily.
In the example below, it is a pdf report which print from res.partner object and get the customer name to append in the report name. It is not the cleanest way to generate the dynamic pdf report name, but it does the trick.
To do it, create a "controller" folder, and add the main.py.
In the main.py, add the following codes.
@http.route(['/report/download'], type='http', auth="user")
def report_download(self, data, token):
"""This function is used by 'action_manager_report.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 = json.loads(data)
url, type = requestcontent[0], requestcontent[1]
try:
if type in ['qweb-pdf', 'qweb-text']:
converter = 'pdf' if type == 'qweb-pdf' else 'text'
extension = 'pdf' if type == 'qweb-pdf' else 'txt'
pattern = '/report/pdf/' if type == 'qweb-pdf' else '/report/text/'
reportname = url.split(pattern)[1].split('?')[0]
docids = None
if '/' in reportname:
reportname, docids = reportname.split('/')
if docids:
# Generic report:
response = self.report_routes(reportname, docids=docids, converter=converter)
else:
# Particular report:
data = url_decode(url.split('?')[1]).items() # decoding the args represented in JSON
response = self.report_routes(reportname, converter=converter, **dict(data))
report = request.env['ir.actions.report']._get_report_from_name(reportname)
filename = "%s.%s" % (report.name, extension)
if docids:
ids = [int(x) for x in docids.split(",")]
obj = request.env[report.model].browse(ids)
if report.print_report_name and not len(obj) > 1:
report_name = safe_eval(report.print_report_name, {'object': obj, 'time': time})
filename = "%s.%s" % (report_name, extension)
if reportname == 'goexcel_customer_statement.cust_statement_template':
pattern = 'form%22%3A%5B'
wiz_ids = url.split(pattern)[1].split('%5D')[0]
partners = request.env['res.partner'].browse(int(wiz_ids))
report_name = safe_eval(report.print_report_name, {'object': partners, 'time': time})
filename = "%s.%s" % (report_name, extension)
response.headers.add('Content-Disposition', content_disposition(filename))
response.set_cookie('fileToken', token)
return response
else:
return
except Exception as e:
se = _serialize_exception(e)
error = {
'code': 200,
'message': "Odoo Server Error",
'data': se
}
return request.make_response(html_escape(json.dumps(error)))
ReportController.report_download = report_download
Click "Like" below to motivate us to share more Odoo tips.
Comments