Files
odoo_source/addons/report/controllers/main.py
T
Ravi Patel efdb5373c3 [IMP] *: Define pdf report name according to the business case
Purpose:

When downloading a document, the name by default is not clear at all because by default, the printed report name is empty.

Specification:

Change the Printed Report Name. In most of the cases, it should be the name of the object + the number.

For the following reports :

- BOM Structure ==> BOM-product_variant_name ===>  'BOM'+'-'+(object.product_id.name)

- BOM Cost ==> BOM Cost-product_variant_name ===>  'BOM Cost'+'-'+(object.product_id.name)

- Call for Tenders ==>Tender-TE00001 ===> 'Tender'+'-'+(object.name)

- Delivery Slip ==> Delivery Slip-Customer Name-Picking Number ===> 'Delivery Slip'+'-'+(object.partner_id.name)+'-'+(object.name)

- Expenses Report ==> Expenses-Employee Name-Travel By Air  ===> 'Expenses'+'-'+(object.employee_id.name)+'-'+(object.name)

- Inventory ===> Inventory-Starting Inventory  ====> 'Inventory'+'-'+(object.name)

- Invoice (pos.order)===> Invoice-Main-0002 ===> 'Invoice'+'-'+(object.name)

- Invoices (account.invoice):
	===> Invoice-INV-2016-0019  ====> ((object.type == 'out_invoice') and (object.state == 'open' or object.state == 'paid'))  ===> 'Invoice'+'-'+(object.number)
        ===> Vendor Bill-BILL-2016-003 ===> (object.type == 'in_invoice') ===> 'Vendor Bill'+'-'+(object.number)

- Location Barcode  ===> Order Processing-Location ===> (object.name)+'-'+'Location'

- Lot Barcode ===> Lot/Serial-0000018 ===> 'Lot/Serial'+'-'+(object.name)

- Payslip  ===>  Employee Name-Payslip ===>  (object.employee_id.name)+'-'+'Payslip'

- Print Batch Deposit ===> Bank- DEPOSIT/2016/0001 ===> (object.journal_id.name)+'-'+(object.name)

- Print Check (Top)  ==> check_Partner name_Draft Payment_top   ===>  'check_'+(object.partner_id.name)+'_'+(object.name)+'_top'

- Print Check (middle)  ==> check_Partner name_Draft Payment_middle ===>  'check_'+(object.partner_id.name)+'_'+(object.name)+'_middle'

- Print Check (Bottom)  ==>  check_Partner name_Draft Payment_bottom  ====>  'check_'+(object.partner_id.name)+'_'+(object.name)+'_bottom'

- Production Order ==>  Production Order-MO-00006  ====>  'Production Order'+'-'+(object.name)

- Quotation / Order (sale.order):
	 ==> Order-S00001  ===> (object.state not in ('draft', 'sent'))==> 'Order'+'-'+(object.name)
         ==> Quotation-S00002   ====>  (object.state in ('draft','sent'))===> 'Quotation'+'-'+(object.name)

- Quotation / Order (mrp.repair):
	 ==> Repair Order-RMA00005         ===>  (object.state != 'draft') ===> 'Repair Order'+'-'+(object.name)
         ==> Repair Ouotation-RMA00005    ===>  (object.state == 'draft') ===> 'Repair Quotation'+'-'+(object.name)

- Registration Badge ===> Registration Event-Attendee Name       ====>  'Registration Event'+'-'+(object.name)

- Web Quotation(sale.order):
	==> Order-S00001  ===>  (object.state not in ('draft', 'sent')) ===> 'Order'+'-'+(object.name)
        ==> Quotation-S00002   ====>  (object.state in ('draft','sent')) ===> 'Quotation'+'-'+(object.name)

- Payslip Details: ===> Payslip Name ===>(object.name)

- Purchase Order:
	===> Purchase Order-PO0012 ===>(object.state != 'draft') ===> 'Purchase Order'+'-'+(object.name)
        ===> Request for Quotation-PO0012 ===> (object.state == 'draft') ===> 'Request for Quotation'+'-'+(object.name)

- Request for Quotation:===> Request for Quotation-PO0012  ===> 'Request for Quotation'+'-'+(object.name)

- Due Payments ===> Due Payments-Partner Name  ====> 'Due Payments'+'-'+(object.name)

- Products Labels ===> Products Labels-Product Name ===> 'Products Labels'+'-'+(object.name)

- Picking Operations ===> Picking Operations-Customer Name-Picking Number ===> 'Picking Operations'+'-'+(object.partner_id.name)+'-'+(object.name)

- Duplicates Invoices (account.invoice):
	===> Duplicate Invoice-INV-2016-0019  ====> ((object.type == 'out_invoice') and (object.state == 'open' or object.state == 'paid'))  ===> 'Duplicate Invoice'+'-'+(object.number)
        ===> Duplicate Vendor Bill-BILL-2016-003 ===> (object.type == 'in_invoice') ===> 'Duplicate Vendor Bill'+'-'+(object.number)

- Intrastat Invoices (account.invoice):
	===> Intrastat Invoice-INV-2016-0019  ====> ((object.type == 'out_invoice') and (object.state == 'open' or object.state == 'paid'))  ===> 'Intrastat Invoice'+'-'+(object.number)
        ===> Intrastat Vendor Bill-BILL-2016-003 ===> (object.type == 'in_invoice') ===> 'Intrastat Vendor Bill'+'-'+(object.number)

- Cost Structure Analysis ==> Cost Structure Analysis-Product Name ===> 'Cost Structure Analysis'+'-'+(object.name)

- Cost Analysis  ===> Cost Analysis-Product Name  ====> 'Cost Analysis'+'-'+(object.name)

- Print Badge  ===> Print Badge-Employee Name ===> 'Print Badge'+'-'+(object.name)

- Event Badge ==>  this report is in html format so ,there is no need to give the print_report_name.

- The following reports are print through wizard so there is no need to give the print_report_name

Budgets ===>
Financial Report ==>
General Ledger  ===>
Leaves Summary  ===>
2016-11-07 16:57:18 +01:00

132 lines
6.1 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import json
import time
from werkzeug import exceptions, url_decode
from werkzeug.datastructures import Headers
from werkzeug.test import Client
from werkzeug.wrappers import BaseResponse
from odoo.http import Controller, route, request
from odoo.tools import html_escape
from odoo.addons.web.controllers.main import _serialize_exception, content_disposition
from odoo.tools.safe_eval import safe_eval
class ReportController(Controller):
#------------------------------------------------------
# Report controllers
#------------------------------------------------------
@route([
'/report/<converter>/<reportname>',
'/report/<converter>/<reportname>/<docids>',
], type='http', auth='user', website=True)
def report_routes(self, reportname, docids=None, converter=None, **data):
report_obj = request.env['report']
context = dict(request.env.context)
if docids:
docids = [int(i) for i in docids.split(',')]
if data.get('options'):
data.update(json.loads(data.pop('options')))
if data.get('context'):
# Ignore 'lang' here, because the context in data is the one from the webclient *but* if
# the user explicitely wants to change the lang, this mechanism overwrites it.
data['context'] = json.loads(data['context'])
if data['context'].get('lang'):
del data['context']['lang']
context.update(data['context'])
if converter == 'html':
html = report_obj.with_context(context).get_html(docids, reportname, data=data)
return request.make_response(html)
elif converter == 'pdf':
pdf = report_obj.with_context(context).get_pdf(docids, reportname, data=data)
pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(pdf))]
return request.make_response(pdf, headers=pdfhttpheaders)
else:
raise exceptions.HTTPException(description='Converter %s not implemented.' % converter)
#------------------------------------------------------
# Misc. route utils
#------------------------------------------------------
@route(['/report/barcode', '/report/barcode/<type>/<path:value>'], type='http', auth="user")
def report_barcode(self, type, value, width=600, height=100, humanreadable=0):
"""Contoller able to render barcode images thanks to reportlab.
Samples:
<img t-att-src="'/report/barcode/QR/%s' % o.name"/>
<img t-att-src="'/report/barcode/?type=%s&amp;value=%s&amp;width=%s&amp;height=%s' %
('QR', o.name, 200, 200)"/>
:param type: Accepted types: 'Codabar', 'Code11', 'Code128', 'EAN13', 'EAN8', 'Extended39',
'Extended93', 'FIM', 'I2of5', 'MSI', 'POSTNET', 'QR', 'Standard39', 'Standard93',
'UPCA', 'USPS_4State'
:param humanreadable: Accepted values: 0 (default) or 1. 1 will insert the readable value
at the bottom of the output image
"""
try:
barcode = request.env['report'].barcode(type, value, width=width, height=height, humanreadable=humanreadable)
except (ValueError, AttributeError):
raise exceptions.HTTPException(description='Cannot convert into barcode.')
return request.make_response(barcode, headers=[('Content-Type', 'image/png')])
@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 = json.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')
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))
report = request.env['report']._get_report_from_name(reportname)
filename = "%s.%s" % (report.name, "pdf")
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, "pdf")
response.headers.add('Content-Disposition', content_disposition(filename))
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(json.dumps(error)))
@route(['/report/check_wkhtmltopdf'], type='json', auth="user")
def check_wkhtmltopdf(self):
return request.env['report']._check_wkhtmltopdf()