Бывают случаи, когда необходимо как расширить или модернизировать страндартный экспорт в Odoo. И чтобы не забыть как это делать я решил написать текущую заметку.
У меня в возникло 3 кейса, которые я хотел бы зафиксировать:
Ограничение списка полей для экспорта
Чтобы ограничить список необходимо переопределить (или расширить) get_fields в классе Export:
from odoo.addons.web.controllers.main import Export
class CustomExport(Export):
@http.route('/web/export/get_fields', type='json', auth="user")
def get_fields(self, model, prefix='', parent_name= '',
import_compat=True, parent_field_type=None,
exclude=None):
# код для обработки списка нужных полей
return records
Изменить оформление Excel выгрузки
Для данного действия необходимо расширить функцию from_data в нужном классе ExcelExport или CSVExport:
# -*- coding: utf-8 -*-
from odoo.addons.web.controllers.main import ExcelExport
class ExtendExcelExport(ExcelExport):
def from_data(self, fields, rows):
workbook = xlwt.Workbook()
worksheet = workbook.add_sheet('Sheet 1')
# код с формированием excel с нужным оформлением
fp = StringIO()
workbook.save(fp)
fp.seek(0)
data = fp.read()
fp.close()
return data
Опитимизация запроса для выгрузки
Это бывает нужно когда у вас какая-то не стандартная модель или выроборка работает медленно. В таком случае для определенной модели хотелось бы использовать sql запрос написанный в ручную. Чтобы это реализовать нужно переопеределить метод base:
# -*- coding: utf-8 -*-
**from odoo.addons.web.controllers.main import ExcelExport
class ExtendExcelExport(ExcelExport):
def base(self, data, token):
# имя модели и прочие параметры лежат в data
import_data = []
columns_headers = []
# произвольное получение данных для экспорта в import_data
# заголовки для экспорта в columns_headers
return request.make_response(self.from_data(columns_headers, import_data),
headers=[('Content-Disposition',
content_disposition(self.filename(model))),
('Content-Type', self.content_type)],
cookies={'fileToken': token})
Экпорт нестандартно типа поля
Для этого нужно переопределить функцию convert_to_export в новом типе:
from odoo.fields import Field
class CustomField(Field):
def convert_to_export(self, value, record):
return str(val)