Расширение и оптимизация экспорта в Odoo

Бывают случаи, когда необходимо как расширить или модернизировать страндартный экспорт в 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)
 
comments powered by Disqus