export-to-csv - 生成 Odoo 可下载 CSV 报告

标签 export-to-csv odoo-8

我需要在销售订单表单 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/

相关文章:

python - 使用自定义名称将多个 pandas DataFrames 输出到 CSV

python - 如何在 Odoo 8 中包含 View

python - 单击后禁用按钮 - Odoo v8

php - 如何使用 xml-rpc 在 odoo 中插入 one2many 值

xml - 如何在 Odoo 8 的 fom View 中对树/ ListView 进行分组?

powershell - Export-CSV 导出长度但不导出名称

csv - SAS CSV 导出在每行中都有不需要的前导逗号

python - 将抓取的数据导出到具有特定列的 CSV

vba - 将 Excel Range 导出到 .txt 文件时出现额外的空行

python - Odoo v8 中的独特电子邮件字段