我需要在销售订单表单 View 中提供一个按钮,以将订单行导出为具有特定格式的 CSV。我搜索了很多,但我只找到了不满足解决方案的自定义模块,因为用户不必选择字段。
更新:解决方案
感谢@phillip-stack 和 his answer,我最终做了以下解决方案:
型号
# -*- coding: utf-8 -*-
import csv, sys
from openerp import api, fields, models, _
class sale_order_export_line(models.Model):
_inherit = 'sale.order'
_auto = False
@api.multi
def export_lines_to_csv(self):
return {
'type' : 'ir.actions.act_url',
'url': '/csv/download/sale_order/%s/supplier_name/%s'%(self.id,'American'),
'target': 'blank',
}
@api.model
def _csv_download(self,vals):
order_id = vals.get('order_id')
supplier_name = vals.get('supplier_name')
so = self.env['sale.order'].browse(order_id)
lines = so.order_line.search([('order_id','=',order_id),('supplier_name','ilike',supplier_name)])
columns = [u'Número pedido Dentaltix',u'Nombre de cliente',u'Dirección', u'Código postal', u'Población',
u'Provincia', u'País', u'Teléfono', u'Horario de entrega', u'Referencia', u'Cantidad', u'Envío']
csv = u','.join(columns)
csv += "\n"
if len(lines) > 0:
for ol in lines:
drupal_order_name = so.drupal_order_name if so.drupal_order_name else ''
client_notes = so.client_notes if so.client_notes else ''
supplier_ref = ol.supplier_ref if ol.supplier_ref else ''
picking_policy = DELIVERY_METHODS[so.picking_policy] if so.picking_policy else 'Directo'
product_uos_qty = str(int(ol.product_uos_qty)) if ol.product_uos_qty else '0'
csv_row = u'","'.join(data)
csv += u"\"{}\"\n".format(csv_row)
return csv
sale_order_export_line()
Controller
# -*- coding: utf-8 -*-
from openerp import http
from openerp.http import request
from openerp.addons.web.controllers.main import serialize_exception,content_disposition
class SaleOrderController(http.Controller):
@http.route('/csv/download/sale_order/<int:order_id>/supplier_name/<string:supplier_name>', auth='user')
def sale_order_lines_csv_download(self, order_id, supplier_name, **kw):
if supplier_name:
csv = http.request.env['sale.order']._csv_download({'order_id': order_id, 'supplier_name':supplier_name})
else:
csv = http.request.env['sale.order']._csv_download({'order_id': order_id, 'supplier_name': False})
filename = 'order_lines_%s_%s.csv'%(order_id,supplier_name)
return request.make_response(csv,
[('Content-Type', 'application/octet-stream'),
('Content-Disposition', 'attachment; filename="%s"'%(filename))])
最佳答案
我可能不应该承认这一点。但是我使用了一种带有 Controller 的技术,并添加了一个到表单的链接。可以修改 Controller 以执行您选择的自定义安全检查,然后您可以使用 sudo()
绕过对相关模型的字段限制。然后只需返回具有您选择的格式的 csv。
当然还有……一个例子!
Controller
@http.route('/csv/download/<int:rec_id>/', auth='user', website=True)
def csvdownload(self, rec_id, **kw):
return http.request.env['your_addon.your_model']._csv_download({'rec_id': rec_id})
模型方法
def _get_csv_url(self):
self.csv_url = "/csv/download/{}/".format(self.id)
csv_url = fields.Char(compute=_get_csv_url)
@api.model
def _csv_download(self,vals):
sql = """SELECT
quote_nullable(field_1),
quote_nullable(field_2),
quote_nullable(field_3),
quote_nullable(field_4)
FROM
table_name
WHERE id={}""".format(vals.get(rec_id))
self.env.cr.execute(sql)
rows = self.env.cr.fetchall()
csv = """'Field 1','Field 2','Field 3','Field 4'\n"""
if rows:
for row in rows:
csv_row = ""
for item in row:
csv_row+= "{},".format(item)
csv+="{}\n".format(csv_row[:-1])
return csv
在您的表单中有一个指向您的 Controller 的链接
<a id="csv_download" href="#" target="_blank" download="file.csv"/>
<div id="csv_url_div" style="display:none"><field name="csv_url"/></div>
<script>
$(document).ready(function(){
var csv_url = $("#csv_url_div").text();
$("#csv_download").attr("href", csv_url);
});
</script>
我承认这里发生的骇人听闻的程度。我敢肯定,如果我花更多时间在它上面,我可以用一个不错的 Odoo 小部件做一些事情,那会非常好。但这对我有用。
关于export-to-csv - 生成 Odoo 可下载 CSV 报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42022416/