Files
enterprise-addons/spreadsheet_sale_management/models/sale_order_spreadsheet.py
T

139 lines
4.3 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.fields import Domain
SALE_ORDER_LINE_FIELDS = [
'product_id',
'product_uom_qty',
'qty_delivered',
'qty_invoiced',
'qty_to_invoice',
'product_uom_id',
'price_unit',
'price_tax',
'price_subtotal',
]
class SaleOrderSpreadsheet(models.Model):
_name = 'sale.order.spreadsheet'
_inherit = ['spreadsheet.mixin']
_description = 'Quotation Spreadsheet'
name = fields.Char(required=True, default=lambda self: self.env._('Untitled spreadsheet'))
company_id = fields.Many2one('res.company', default=lambda self: self.env.company)
order_id = fields.Many2one('sale.order', index='btree_not_null', ondelete='cascade')
def get_formview_action(self, access_uid=None):
return self.action_open_spreadsheet()
@api.model_create_multi
def create(self, vals_list):
spreadsheets = super().create(vals_list)
for spreadsheet, vals in zip(spreadsheets, vals_list):
if not spreadsheet.order_id and not ('spreadsheet_binary_data' in vals or 'spreadsheet_data' in vals):
spreadsheet._dispatch_insert_list_revision()
return spreadsheets
def action_open_spreadsheet(self):
return {
'type': 'ir.actions.client',
'tag': 'action_sale_order_spreadsheet',
'params': {
'spreadsheet_id': self.id,
},
}
def _get_spreadsheet_metadata(self, access_token=None):
data = super()._get_spreadsheet_metadata(access_token)
data["order_id"] = self.order_id.id
data["order_display_name"] = self.order_id.display_name
return data
def _empty_spreadsheet_data(self):
data = super()._empty_spreadsheet_data()
data['lists'] = {
'1': {
'columns': SALE_ORDER_LINE_FIELDS,
'domain': [('display_type', '=', False)],
'model': 'sale.order.line',
'context': {},
'orderBy': [],
'id': '1',
'name': _("Sale order lines"),
'fieldMatching': {
'order_filter_id': {
'chain': 'order_id',
'type': 'many2one'
}
}
}
}
data['globalFilters'] = [
{
'id': 'order_filter_id',
'type': 'relation',
'label': _("Quote"),
'modelName': 'sale.order',
}
]
return data
def _dispatch_insert_list_revision(self):
command = {
'sheetId': 'sheet1',
'col': 0,
'row': 0,
'id': '1',
'linesNumber': 100,
'columns': [
{
'name': field_name,
'type': self.env['sale.order.line']._fields[field_name].type
} for field_name in SALE_ORDER_LINE_FIELDS
],
'type': 'RE_INSERT_ODOO_LIST',
}
table_command = {
'type': 'CREATE_TABLE',
'sheetId': 'sheet1',
'tableType': 'static',
'ranges': [{
'_sheetId': 'sheet1',
'_zone': {
'top': 0,
'bottom': 100,
'left': 0,
'right': len(SALE_ORDER_LINE_FIELDS) - 1,
},
}],
'config': {
'firstColumn': False,
'hasFilters': False,
'totalRow': False,
'lastColumn': False,
'numberOfHeaders': 1,
'bandedRows': True,
'bandedColumns': False,
'styleId': 'TableStyleMedium5',
}
}
self._dispatch_commands([command, table_command])
@api.readonly
@api.model
def get_spreadsheets(self, domain=(), offset=0, limit=None):
domain = Domain.AND([domain, [("order_id", "=", False)]])
return super().get_spreadsheets(domain, offset, limit)
@api.model
def _get_spreadsheet_selector(self):
return {
'model': self._name,
'display_name': _("Quotation templates"),
'sequence': 20,
'allow_create': False,
}