[IMP] make export extensible

bzr revid: xmo@openerp.com-20110830130632-t96hsz4jxjp69crh
This commit is contained in:
Xavier Morel 2011-08-30 15:06:32 +02:00
parent e53d25ef17
commit c276c2d67c
2 changed files with 101 additions and 64 deletions

View File

@ -1063,57 +1063,6 @@ class TreeView(View):
req,'action', 'tree_but_open',[(model, id)],
False)
def export_csv(fields, result):
fp = StringIO()
writer = csv.writer(fp, quoting=csv.QUOTE_ALL)
writer.writerow(fields)
for data in result:
row = []
for d in data:
if isinstance(d, basestring):
d = d.replace('\n',' ').replace('\t',' ')
try:
d = d.encode('utf-8')
except:
pass
if d is False: d = None
row.append(d)
writer.writerow(row)
fp.seek(0)
data = fp.read()
fp.close()
return data
def export_xls(fieldnames, table):
import xlwt
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet('Sheet 1')
for i, fieldname in enumerate(fieldnames):
worksheet.write(0, i, str(fieldname))
worksheet.col(i).width = 8000 # around 220 pixels
style = xlwt.easyxf('align: wrap yes')
for row_index, row in enumerate(table):
for cell_index, cell_value in enumerate(row):
cell_value = str(cell_value)
cell_value = re.sub("\r", " ", cell_value)
worksheet.write(row_index + 1, cell_index, cell_value, style)
fp = StringIO()
workbook.save(fp)
fp.seek(0)
data = fp.read()
fp.close()
#return data.decode('ISO-8859-1')
return data
class Export(View):
_cp_path = "/base/export"
@ -1238,11 +1187,34 @@ class Export(View):
return _fields
return rec(fields)
#noinspection PyPropertyDefinition
@property
def content_type(self):
""" Provides the format's content type """
raise NotImplementedError()
def filename(self, base):
""" Creates a valid filename for the format (with extension) from the
provided base name (exension-less)
"""
raise NotImplementedError()
def from_data(self, fields, rows):
""" Conversion method from OpenERP's export data to whatever the
current export class outputs
:params list fields: a list of fields to export
:params list rows: a list of records to export
:returns:
:rtype: bytes
"""
raise NotImplementedError()
@openerpweb.httprequest
def export_data(self, req, data, token):
model, fields, ids, domain, import_compat, export_format = \
def index(self, req, data, token):
model, fields, ids, domain, import_compat = \
operator.itemgetter('model', 'fields', 'ids', 'domain',
'import_compat', 'export_format')(
'import_compat')(
simplejson.loads(data))
context = req.session.eval_context(req.context)
@ -1256,12 +1228,77 @@ class Export(View):
field = [val.strip() for val in fields.values()]
req.httpresponse.headers['Content-Disposition'] = \
'attachment; filename="%s.%s"' % (model, export_format)
'attachment; filename="%s"' % self.filename(model)
req.httpresponse.cookie['fileToken'] = int(token)
req.httpresponse.cookie['fileToken']['path'] = '/'
if export_format == 'xls':
req.httpresponse.headers['Content-Type'] = 'application/vnd.mx-excel'
return export_xls(field, result)
else:
req.httpresponse.headers['Content-Type'] = 'text/csv;charset=utf8'
return export_csv(field, result)
req.httpresponse.headers['Content-Type'] = self.content_type
return self.from_data(field, result)
class CSVExport(Export):
_cp_path = '/base/export/csv'
@property
def content_type(self):
return 'text/csv;charset=utf8'
def filename(self, base):
return base + '.csv'
def from_data(self, fields, rows):
fp = StringIO()
writer = csv.writer(fp, quoting=csv.QUOTE_ALL)
writer.writerow(fields)
for data in rows:
row = []
for d in data:
if isinstance(d, basestring):
d = d.replace('\n',' ').replace('\t',' ')
try:
d = d.encode('utf-8')
except:
pass
if d is False: d = None
row.append(d)
writer.writerow(row)
fp.seek(0)
data = fp.read()
fp.close()
return data
class ExcelExport(Export):
_cp_path = '/base/export/xls'
@property
def content_type(self):
return 'application/vnd.ms-excel'
def filename(self, base):
return base + '.xls'
def from_data(self, fields, rows):
import xlwt
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet('Sheet 1')
for i, fieldname in enumerate(fields):
worksheet.write(0, i, str(fieldname))
worksheet.col(i).width = 8000 # around 220 pixels
style = xlwt.easyxf('align: wrap yes')
for row_index, row in enumerate(rows):
for cell_index, cell_value in enumerate(row):
cell_value = str(cell_value)
cell_value = re.sub("\r", " ", cell_value)
worksheet.write(row_index + 1, cell_index, cell_value, style)
fp = StringIO()
workbook.save(fp)
fp.seek(0)
data = fp.read()
fp.close()
return data

View File

@ -383,16 +383,16 @@ openerp.base.DataExport = openerp.base.Dialog.extend({
return;
}
var export_format = this.$element.find("#export_format").val();
this.session.get_file({
url: '/base/export/export_data',
url: '/base/export/' + export_format,
data: {data: JSON.stringify({
model: this.dataset.model,
fields: exported_fields,
ids: this.dataset.ids,
domain: this.dataset.domain,
import_compat: parseInt(
this.$element.find("#import_compat").val(), 10),
export_format: this.$element.find("#export_format").val()
this.$element.find("#import_compat").val(), 10)
})},
complete: $.unblockUI
});