我在Odoo 8中使用qWeb进行报告。那些生成的PDF文件以“默认”名称保存。我想为每个生成的文件设置一个特定的名称(不是在文件保存后,而是在“生成”时间)。如何在qWeb报告中设置PDF名称,Odoo?
这可能吗?如果是这样,怎么做?
在此先感谢。
我在Odoo 8中使用qWeb进行报告。那些生成的PDF文件以“默认”名称保存。我想为每个生成的文件设置一个特定的名称(不是在文件保存后,而是在“生成”时间)。如何在qWeb报告中设置PDF名称,Odoo?
这可能吗?如果是这样,怎么做?
在此先感谢。
一般来说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文件的您定制名字 然后根据您的甜蜜报告名称更改名称属性。
我希望这应该对你有帮助.. :)
在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
我可以确认它的魅力。 –
插件\报告\控制器\ 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)
你好Usman Maqbool,我批准你最后的编辑建议。我想建议,编辑时,不要将编程语言的名称放在'code markdown'中,并从帖子中删除“谢谢”。亲切的问候! –
al-right,下次我会照顾的。 –
@ S.L。巴特现在请取消禁令,我得到了我的错误...请。 –
改变它,我觉得这是它被定格在9版只需更换插件内容的错误\报告\控制器\ MAIN。PY这一https://github.com/odoo/odoo/blob/9.0/addons/report/controllers/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"
/>
是字符串名称正确完成
打印PDF名称可以使用“自定义文件名”模块
选择您的报告并更改名称..
您可以使用配置给动态报表的名字,但是当你打印一份报告,它将应用。
下面的例子在报告打印自定义名称。 中ir.actions.report.xml,其中用户可以配置报告名称创建一个字段。
from openerp import models, fields
class IrActionsReportXml(models.Model):
_inherit = 'ir.actions.report.xml'
download_filename = fields.Char(
'Download filename')
现在您需要创建两个文件。
报告控制器
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/ 这可能会帮助你。
简单的方法来在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
是你的销售或引用数。
谢谢克莱门斯.... –
感谢。真的有帮助,但我需要打印一个自定义名称“每一个” PDF。例如:我想用数据库中的名称打印每个任务。那么,有什么帮助? – Breba
可能是它的可能,但我不知道如果我将来找到它,那么肯定会问你。 –