def download_file(self, file_id, **kwargs): file = file_manager.get_file(file_id) if file is None: return request.not_found() return request.make_response( file.data, [('Content-Type', 'application/octet-stream'), ('Content-Disposition', content_disposition(file.filename))])
def download_outlook_add_in(self, debug=None): dir_path = os.path.dirname(os.path.realpath(__file__)) with open(os.path.join(dir_path, '..', 'bin', 'OutlookAddInInstaller.exe'), 'rb') as installer: db = request.db base_url = request.env['ir.config_parameter'].get_param('web.base.url') return request.make_response(installer.read(), [('Content-Type', 'application/octet-stream'), ('Content-Disposition', content_disposition('OutlookAddInInstaller.exe'))])
def download_document(self, model, filename=None, **kw): obj = request.env[model] filecontent = obj.get_content() response = request.make_response( filecontent, [('Content-Type', 'application/octet-stream;charset=utf-8;'), ('Content-Disposition', content_disposition(filename))]) return response
def unlisted_wh_items_by_brand_report(self, **post): wizard_id = request.env[ 'sale.unlisted.wh.items.by.brand.wizard'].browse( [int(post.get('id'))]) fp = StringIO() writer = csv.writer(fp, quoting=csv.QUOTE_ALL) columns = ['Part Number', 'Partslink', 'Mfg Label', 'Quantity', 'Cost'] writer.writerow([name.encode('utf-8') for name in columns]) sql = (""" SELECT TEMPLATE.name, TEMPLATE.partslink, TEMPLATE.mfg_label, RES2.qty, RES1.cost FROM ( SELECT QUANT.product_id, SUM(QUANT.qty) as qty FROM stock_quant QUANT LEFT JOIN stock_location LOC on QUANT.location_id = LOC.id WHERE LOC.usage = 'internal' AND QUANT.qty > 0 GROUP BY QUANT.product_id ) as RES2 LEFT JOIN (SELECT QUANT.product_id, SUM(QUANT.qty) as qty, SUM(QUANT.qty * QUANT.cost) / SUM(QUANT.qty) as cost FROM stock_quant QUANT LEFT JOIN stock_location LOC on QUANT.location_id = LOC.id WHERE LOC.usage = 'internal' AND QUANT.cost > 0 AND QUANT.qty > 0 GROUP BY QUANT.product_id ) as RES1 on RES1.product_id = RES2.product_id LEFT JOIN product_product PRODUCT on PRODUCT.id = RES2.product_id LEFT JOIN product_template TEMPLATE on TEMPLATE.id = PRODUCT.product_tmpl_id WHERE TEMPLATE.type = 'product' AND TEMPLATE.part_number IS NOT NULL AND NOT EXISTS ( SELECT product_tmpl_id FROM product_listing PL WHERE PL.product_tmpl_id = TEMPLATE.id AND PL.brand = %s ) ORDER BY RES2.qty DESC """) cr = request.env.cr params = [wizard_id.brand] cr.execute(sql, params) results = cr.dictfetchall() for res in results: row = [ res['name'], res['partslink'] if res['partslink'] else '', res['mfg_label'] if res['mfg_label'] else '', res['qty'], "{0:.2f}".format(float(res['cost'])) if res['cost'] else '0.00' ] writer.writerow(row) fp.seek(0) data = fp.read() fp.close() today = datetime.today().strftime('%Y-%m-%d') valid_fname = '%s_unlisted_wh_items_%s.csv' % (wizard_id.brand.replace( ' ', ''), today) return request.make_response( data, [('Content-Type', 'text/csv'), ('Content-Disposition', content_disposition(valid_fname))])
def document(self, filename, filecontent): if not filecontent: return request.not_found() headers = [ ("Content-Type", "application/xml"), ("Content-Disposition", content_disposition(filename)), ("charset", "utf-8"), ] return request.make_response(filecontent, headers=headers, cookies=None)
def unsold_wh_items_report(self, **post): wizard_id = request.env['sale.unsold.wh.items.wizard'].browse( [int(post.get('id'))]) from_date = ( datetime.now() - timedelta(days=wizard_id.days)).strftime('%Y-%m-%d %H:%M:%S') store_ids = tuple(wizard_id.store_ids.ids) fp = StringIO() writer = csv.writer(fp, quoting=csv.QUOTE_ALL) columns = ['Part Number', 'Mfg Label', 'Quantity'] writer.writerow([name.encode('utf-8') for name in columns]) sql = (""" SELECT TEMPLATE.name, TEMPLATE.mfg_label, RES1.qty FROM ( SELECT QUANT.product_id, SUM(QUANT.qty) as qty FROM stock_quant QUANT LEFT JOIN stock_location LOC on QUANT.location_id = LOC.id WHERE LOC.usage = 'internal' AND QUANT.qty > 0 AND QUANT.reservation_id IS NULL GROUP BY QUANT.product_id ) as RES1 LEFT JOIN product_product PRODUCT on PRODUCT.id = RES1.product_id LEFT JOIN product_template TEMPLATE on TEMPLATE.id = PRODUCT.product_tmpl_id WHERE ( --TEMPLATE.oversized IS NULL OR TEMPLATE.oversized = False) TEMPLATE.part_number IS NOT NULL AND PRODUCT.id not in ( SELECT SOL.product_id FROM sale_order_line SOL LEFT JOIN sale_order SO on SO.id = SOL.order_id WHERE SO.store_id IN %s AND SO.create_date >= %s) ORDER BY RES1.qty DESC """) cr = request.env.cr params = [store_ids, from_date] cr.execute(sql, params) results = cr.dictfetchall() for res in results: row = [ res['name'], res['mfg_label'] if res['mfg_label'] else '', res['qty'] ] writer.writerow(row) fp.seek(0) data = fp.read() fp.close() today = datetime.today().strftime('%Y-%m-%d') valid_fname = 'unsold_wh_items_%s_%s.csv' % (today, wizard_id.id) return request.make_response( data, [('Content-Type', 'text/csv'), ('Content-Disposition', content_disposition(valid_fname))])
def document(self, filename, filecontent): if not filecontent: return request.not_found() headers = [ ('Content-Type', 'application/xml'), ('Content-Disposition', content_disposition(filename)), ('charset', 'utf-8'), ] return request.make_response( filecontent, headers=headers, cookies=None)
def download_shk(self, id, filename=None, **kwargs): shk = request.env['intern.hokhau'].browse(int(id)) return request.make_response( shk.generate_shk(), headers= [('Content-Disposition', content_disposition('hokhau.docx')), ('Content-Type', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' )])
def get_courrier(self, **kwargs): """ URL permettant de renvoyer une action de téléchargement :param kwargs: Dictionnaire contenant les valeurs présentes dans la route :return: Action de téléchargement du pdf générer """ if not isinstance(kwargs, dict): return template_id = int(kwargs['courrierid']) if not template_id: return False model_ids = [int(id_str) for id_str in kwargs['modelids'].split(',')] models = request.env[kwargs['model']].browse(model_ids) template = request.env['of.mail.template'].browse(template_id) all_files = [] for model in models: if template.file: generated_file = self.print_acrobat(template, model) else: generated_file = self.print_report(template, model) all_files.append(generated_file) if len(all_files) > 1: """ """ temp_file = all_files.pop() fd, order_pdf = tempfile.mkstemp() os.write(fd, temp_file) os.close(fd) file_paths = [order_pdf] for mail_data in all_files: fd, mail_pdf = tempfile.mkstemp() os.write(fd, mail_data) os.close(fd) file_paths.append(mail_pdf) result_file_path = request.env['report']._merge_pdf(file_paths) try: result_file = file(result_file_path, "rb") generated_file = result_file.read() result_file.close() for file_path in file_paths: os.remove(file_path) os.remove(result_file_path) except Exception: pass pdfhttpheaders = [('Content-Type', 'application/pdf'), ('Content-Length', len(generated_file))] response = request.make_response(generated_file, headers=pdfhttpheaders) filename = "%s.%s" % (template.name, "pdf") response.headers.add('Content-Disposition', content_disposition(filename)) return response
def report_download(self, data, token, context=None): requestcontent = json.loads(data) url, type = requestcontent[0], requestcontent[1] try: if type == 'qweb-docx_to_x': converter = 'docx_to_x' default_output_file = 'docx' pattern = '/report/docx_to_x/' 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, context=context) else: # Particular report: data = url_decode( url.split('?') [1]).items() # decoding the args represented in JSON response = self.report_routes(reportname, converter=converter, context=context, **dict(data)) report = request.env[ 'ir.actions.report']._get_report_from_name(reportname) extension = report.output_file or default_output_file 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) response.headers.add('Content-Disposition', content_disposition(filename)) response.set_cookie('fileToken', token) return response 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))) return super(ReportControllerExtend, self).report_download(data, token, context)
def get_avatar(self, **kwargs): intern_id = kwargs.get('intern', False) intern = request.env['intern.intern'].sudo().browse(int(intern_id)) streamAvatar = BytesIO() if intern.avatar is not None: streamAvatar = BytesIO(intern.avatar.decode("base64")) return request.make_response( streamAvatar, [('Content-Type', 'image/jpeg'), ('Content-Disposition', content_disposition('avatar.jpeg'))])
def download_document(self, model, field, id, filename=None, **kw): env = Environment(request.cr, SUPERUSER_ID, {}) res = env[str(model)].search([('id', '=', int(id))]).sudo().read()[0] filecontent = base64.b64decode(res.get(field) or '') if not filename: filename = '%s_%s' % (model.replace('.', '_'), id) if not filecontent: return request.not_found() return request.make_response( filecontent, [('Content-Type', 'application/octet-stream'), ('Content-Disposition', content_disposition(filename))])
def transfert_compta_csv_download(self, csv, filename): #filename = 'testcompta.csv' response = http.HttpRequest.make_response( csv, [('Content-Type', 'text/csv'), ('Content-Disposition', content_disposition(filename))]) #response = http.HttpRequest.make_response(csv, # [('Content-Type', 'text/csv'), # ('Content-Disposition','attachment; filename="%s"'%(filename))]) return response
def download_cv_new(self, model, id, filename=None,gender=None, **kwargs): invoice = request.env[model].browse(int(id)) document = request.env['intern.document'].search([('name', '=', 'CV')], limit=1) finalDoc = invoice.createHeaderDocNew(gender) reponds = BytesIO() archive = zipfile.ZipFile(reponds, 'w', zipfile.ZIP_DEFLATED) # merge_doc = None if finalDoc is not None: archive.write(finalDoc.name, u"名簿リスト.docx") os.unlink(finalDoc.name) else: return listtmp = invoice.interns_exam_doc if gender == None: for i, intern in enumerate(sorted(listtmp,key=lambda x: x.sequence_exam)): childDoc = invoice.createCVDoc(document[0], intern, i) archive.write(childDoc.name, 'cv_%d_%s.docx' % ((i + 1), intern_utils.name_with_underscore(intern.name))) os.unlink(childDoc.name) else: counter=0 for i, intern in enumerate(sorted(listtmp, key=lambda x: x.sequence_exam)): if intern.gender==gender: childDoc = invoice.createCVDoc(document[0], intern, counter) archive.write(childDoc.name, 'cv_%d_%s.docx' % ((counter + 1), intern_utils.name_with_underscore(intern.name))) os.unlink(childDoc.name) counter+=1 archive.close() reponds.flush() ret_zip = reponds.getvalue() reponds.close() return request.make_response(ret_zip, [('Content-Type', 'application/zip'), ('Content-Disposition', content_disposition(filename))]) # @http.route('/web/binary/download_list_intern_exam_new', type='http', auth="public") # def download_list_intern_exam(self, model, id, filename=None, **kwargs): # invoice = request.env[model].browse(int(id)) # # return request.make_response(invoice.create_list_exam_excel_data(), # headers=[('Content-Disposition', # content_disposition('test.xlsx')), # ('Content-Type', 'application/vnd.ms-excel')])
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 as e: se = _serialize_exception(e) error = { 'code': 200, 'message': "Odoo Server Error", 'data': se } return request.make_response(html_escape(json.dumps(error)))
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)))
def download_bo_report_simple_stock_card(self, model, record_id, filename=None, **kw): obj = request.env[model] record_id = obj.browse([int(record_id)]) filecontent = record_id.get_bo_report_simple_stock_card() response = request.make_response( filecontent, [('Content-Type', 'application/octet-stream;charset=utf-8;'), ('Content-Disposition', content_disposition(filename))]) return response
def download_document(self, model, field, id, filename=None, **kw): Model = request.env[model] res = Model.browse([int(id)]) filecontent = base64.b64decode(res.datas) if not filecontent: res.unlink() return request.not_found() else: res.unlink() return request.make_response( filecontent, [('Content-Type', 'application/octet-stream'), ('Content-Disposition', content_disposition(filename))])
def invoice_download(self, **data): record_id = http.request.env['arc.invoice'].search([('id', '=', data.get('id'))]) if record_id: filecontent = base64.b64decode(record_id.report_pdf) filename = record_id.file_name if filecontent and filename: return request.make_response( filecontent, headers=[('Content-Type', 'application/pdf'), ('Content-Disposition', content_disposition(filename))]) return request.not_found()
def download_(self, rec_id, unlink=False, **kwargs): rec = request.env["rg.backup"].search([('id', '=', rec_id)]) if rec: data = base64.b64decode(rec._get_encoded()) file_name = rec.file_name if unlink: rec.unlink() return http.request.make_response( data, headers=[('Content-Length', len(data)), ('Content-Type', mimetypes.guess_type(file_name)[0] or 'application/octet-stream'), ('Content-Disposition', content_disposition(file_name))])
def download_document(self, model, field, id, filename=None, **kw): """Download link for excel files stored as binary fields.""" record = request.env[model].browse([int(id)]) res = record.read([field])[0] filecontent = base64.b64decode(res.get(field) or '') if not filecontent: return request.not_found() else: if not filename: filename = '%s_%s' % (model.replace('.', '_'), id) return request.make_response( filecontent, [('Content-Type', 'application/octet-stream'), ('Content-Disposition', content_disposition(filename))])
def generate_correspondence_pdf(self, object_id=None, **parameters): if object_id is None: raise BadRequest() correspondence = request.env['correspondence'].browse(int(object_id)) binary = correspondence and correspondence.get_image() if not binary: raise NotFound() return request.make_response( binary, [('Content-Type', 'application/pdf'), ('Content-Disposition', content_disposition(correspondence.file_name))])
def download_document(self, doc_id=None, **kw): """ Download link for files stored as binary fields. :param str id: field holding the ID of vb_document table :returns: :class:`werkzeug.wrappers.Response` """ #Getting the document directory path document_directory_path = request.env[ 'npa.document'].get_document_directory_path() if doc_id: #Getting Document Record document_rec = request.env['npa.document'].search([('id', '=', int(doc_id))]) #Checking if the file exists, and then fetching the document. if os.path.exists(document_rec.file_loc): with open(document_rec.file_loc, 'rb') as doc_file: filecontent = doc_file.read() if not filecontent: return request.not_found() else: if document_rec.file_name[-3:] == 'pdf': #Return the file and filename to the browser. return request.make_response( filecontent, [('Content-Type', 'application/pdf'), ('Content-Disposition', content_disposition(document_rec.file_name))]) else: return request.make_response( filecontent, [('Content-Type', 'attachment'), ('Content-Disposition', content_disposition(document_rec.file_name))]) else: msg = 'File document {0} not found in NFS server. Please check the file or upload again.'.format( document_rec.file_loc) return request.not_found(msg)
def download_document(self, model, field, id, filename=None, **kw): """ Download link for files stored as binary fields. :param str model: name of the model to fetch the binary from :param str field: binary field :param str id: id of the record from which to fetch the binary :param str filename: field holding the file's name, if any :returns: :class:`werkzeug.wrappers.Response` """ Model = request.registry[model] env = api.Environment(request.cr, request.uid, request.context) res = env['ir.attachment'].search([('id', '=', id)]) filecontent = base64.b64decode(res.datas or '') if not filecontent: return request.not_found() else: if not filename: filename = '%s_%s' % (model.replace('.', '_'), id) return request.make_response(filecontent, [('Content-Type', 'application/octet-stream'), ('Content-Disposition', content_disposition(filename))]) else: return request.make_response(filecontent, [('Content-Type', 'application/vnd.ms-excel'), ('Content-Disposition', content_disposition(filename))])
def download_document(self, model, field, id, filename=None, **kw): Model = request.env[model] #invoice_number = Model.browse(int(id)).number invoice_number = id filecontent = base64.b64decode(Model.get_file_content(int(id))) if not filecontent: return request.not_found() else: if not filename: #filename = '%s.%s' % (invoice_number,'txt') filename = Model.get_file_name(int(id)) return request.make_response( filecontent, [('Content-Type', 'text/plain'), ('Content-Disposition', content_disposition(filename))])
def ac_index_base(self, listType, file_name): ''''自定义直接下载''' # 表头 columns_headers = listType.get_colums_headers(fields=[]) self.column_count = len(columns_headers) # 表体 export_data = listType.get_export_data([]) self.row_count = len(export_data) response_data = self.from_data(columns_headers, export_data, listType) return request.make_response( response_data, headers=[('Content-Disposition', content_disposition(self.filename(file_name))), ('Content-Type', self.content_type)], cookies={'fileToken': ""})
def download_list_intern(self, **kwargs): invoices = request.env['intern.invoice'].search([]) workbook = xlwt.Workbook() worksheet = workbook.add_sheet('Sheet 1') base_style = xlwt.easyxf('align: wrap yes') date_style = xlwt.easyxf('align: wrap yes', num_format_str='YYYY-MM-DD') worksheet.write(0, 0, u'Tên', base_style) worksheet.write(0, 1, u'CMND/Thẻ CC', base_style) worksheet.write(0, 2, u'Đơn hàng', base_style) worksheet.write(0, 3, u'Ngày lập hồ sơ', base_style) worksheet.write(0, 4, u'Ngày sinh', base_style) worksheet.write(0, 5, u'Tuổi', base_style) counter = 1 for invoice in invoices: for intern in invoice.interns_pass: if intern.cmnd_or_tcc != None and invoice.date_create_letter_promotion_short != None: worksheet.write(counter, 0, u'%s' % intern.name, base_style) worksheet.write(counter, 1, intern.cmnd_or_tcc, base_style) worksheet.write(counter, 2, u'%s' % invoice.name, base_style) worksheet.write(counter, 3, invoice.date_create_letter_promotion_short, date_style) worksheet.write(counter, 4, intern.date_of_birth_short, date_style) worksheet.write( counter, 5, u'%s' % str( intern_utils.get_age_jp( invoice.date_create_letter_promotion_short, intern.day, intern.month, intern.year)), base_style) counter = counter + 1 fp = StringIO() workbook.save(fp) fp.seek(0) data = fp.read() fp.close() return request.make_response( data, headers=[('Content-Disposition', content_disposition('test.xls')), ('Content-Type', 'application/vnd.ms-excel')])
def download_bin(self, d, filename=None, **kw): sol = request.env['sale.order.line'] # _logger.info('input d :%s' % d) res = sol.sudo().search_read( [('remark1', 'not in', [u'上線預扣']), ('state', 'in', ['sent', 'sale', 'done']), ('p_date', '=', d), ('note', '=', False)], self.search_fields, order='booking_start') # _logger.info('res:%s' % res) return request.make_response(self.from_data_xls(res), headers=[('Content-Disposition', content_disposition(filename)), ('Content-Type', 'application/vnd.ms-excel')])
def consultar_ple(self, mes, year, tipo_reporte, compania,**k): reporte_ple = request.env['report.biosis_cont_report.report_ple'] filename, filename_v, filecontent = reporte_ple.generate_txt_report(mes, year, tipo_reporte, compania) f1 = StringIO.StringIO() f1.write(filecontent.encode('utf-8')) content = f1.getvalue() if not filecontent: return request.not_found() else: if not filename: filename = "Nuevo.txt" return request.make_response(content, [('Content-Type', 'application/octet-stream'), ('Content-Disposition', content_disposition(filename + u'.txt'))])
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 """ response = super(DownloadedReportFilename, self).report_download(data, token) requestcontent = json.loads(data) url, type = requestcontent[0], requestcontent[1] if type == 'qweb-pdf': reportname = url.split('/report/pdf/')[1].split('?')[0] docids = None if '/' in reportname: reportname, docids = reportname.split('/') report = request.env['report']._get_report_from_name(reportname) xreport =None if docids and len(docids) == 1: # Generic report: xreport = request.env[report.model].browse([int(docids)]) filename = None if xreport: if report.model == 'account.invoice' and xreport.number: filename = ( (xreport.type in ['out_invoice'] and 'Invoice' or 'Bill') + '-' + xreport.number.replace(' ','_').replace('/', '_' )) elif report.model == 'purchase.order' and xreport.name: filename = ( (xreport.state in ['draft', 'sent', 'to approve'] and 'RFQ' or 'Purchase_Order') + '-' + xreport.name.replace(' ', '_' ).replace('/', '_' )) elif report.model == 'sale.order' and xreport.name: filename = ( (xreport.state in ['draft', 'sent'] and 'Quotation' or 'Sale_Order') + '-' + xreport.name.replace(' ', '_' ).replace('/', '_' )) elif report.model in ['stock.inventory','res.partner','mrp.production', 'stock.picking', 'stock.production.lot', 'stock.quant.package'] and xreport.name: filename = ( report.name.replace(' ','_').replace('/', '_' ) + '-' +xreport.name.replace(' ', '_' ).replace('/', '_' )) else: filename = ( report.name.replace(' ','_').replace('/', '_' )) if filename: filename = '{}.pdf'.format(filename) response.headers.remove('Content-Disposition') response.headers.add('Content-Disposition', content_disposition(filename)) return response
def download_binary(self, model, id, field, fname, fnamefield, **kwargs): """ Route http untuk download binary """ fs = [field] if fnamefield: fs.append(fname) record = request.env[model].browse(int(id)).read(fs)[0] data = b64decode(record.get(field, False) or False) filename = record.get(fname, "unknown") if fnamefield else fname if not data: return request.not_found() return request.make_response( data, [('Content-Type', 'application/octet-stream'), ('Content-Disposition', content_disposition(filename))])