I have a small custom module to add some fields to the sales order and to essentially allow the user to create a "revision" of a quotation. The revision duplicates all of the information from the quotation and then changes the name. So if I created a revision of SO-12345, the revision would be named SO-12345-r1 and so on.
Currently I have the module copying the information to a new popup form in edit mode and completing the name appropriately. However, when I click 'save' on this form, the record does not get saved. When creating a new quotation, the save button works just fine, but not in my custom form.
I don't want to create the revision automatically when the user clicks the 'Create New Revision' button. Instead, I want the record to be created only after the user clicks 'save'
Here's my code:
sale.py
# -*- encoding: utf-8 -*-
from odoo import models, fields, api
import logging
_logger = logging.getLogger(__name__)
try:
import re
except ImportError as err:
_logger.debug(err)
class SaleOrder(models.Model):
_inherit = 'sale.order'
# Add custom fields
estimated_lead_time = fields.Char('Estimated Lead Time')
projected_completion_date = fields.Date('Projected Completion Date')
rd_project = fields.Boolean('RD Project')
ec_requested = fields.Date(string='EC Requested')
engineering_verdict = fields.Selection(
string='Engineering Verdict', selection=[
('confirmed', 'Confirmed'),
('denied', 'Denied'),
])
verdict_given_on = fields.Char('Verdict Given on')
verdict_given_user_id = fields.Many2one(
'res.users', 'Verdict Given by')
additional_time = fields.Float('Additional Time')
shipping_greenlight = fields.Date(string='Shipping Greenlight')
payment_greenlight = fields.Date(string='Payment Greenlight')
ship_via = fields.Char('Ship Via')
shipping_expense = fields.Selection(
string='Shipping Expense',
selection=[
('sciencetech', 'Sciencetech'),
('customer_account', 'Customer Account'),
('hold_for_pickup', 'Hold for Pickup'),
('other', 'Other')])
customer_account = fields.Char('Customer Account')
primary_approval = fields.Date('Primary Approval')
proforma_invoice_sent = fields.Date('Pro-Forma Invoice Sent')
final_approval = fields.Date('Final Approval')
order_confirmation_sent = fields.Date('Order Confirmation Sent')
def _strip_revision(self, ref):
# Search for a sequence of 5 numbers
result = re.search(r'\d{5}', ref)
if result is None:
# There wasn't one, so check if there is one of 4 digits
result = re.search(r'\d{4}', ref)
if result is not None:
return result.group()
else:
return ref
@api.multi
def sale_order_revision(self):
# Get the values of all of the fields of the SO we want to duplicate
con = self.read(['payment_acquirer_id', 'company_id', 'pricelist_id', 'incoterm', 'exception_ids', 'amount_total', 'rule_group', 'name', 'invoice_ids', 'picking_policy', 'campaign_id', 'currency_id', 'partner_shipping_id', 'partner_id', 'amount_untaxed', 'partner_invoice_id', 'product_id', 'origin', 'payment_tx_id', 'carrier_id', 'ec_requested', 'invoice_shipping_on_delivery', 'tag_ids', 'amount_tax', 'opportunity_id', 'payment_term_id', 'fiscal_position_id', 'shipping_expense', 'invoice_count', 'medium_id', 'ship_via', 'order_line', 'customer_account', 'ignore_exception', 'validity_date', 'delivery_count', 'main_exception_id', 'source_id', 'website_order_line'])[0]
# Get the reference number without the 'SO' or '-r1' etc.
current_name = self._strip_revision(con['name'])
# Find the number of revisions (including the original)
# This will be the number we need to append to the SO we are duplicating
num_variants = self.search_count([('name', 'like', current_name)])
# Form the new name
new_name = 'SO-' + current_name + '-r' + str(num_variants)
# Update the fields with the new name
con['name'] = new_name
context = {'default_' + key: value for (key, value) in con.items()}
for (key, value) in context.items():
if type(value) is tuple:
context[key] = value[0]
return{
'name':("New Revision"),
'view_mode': 'form',
'view_type': 'form',
'view_id': False,
'res_model': 'sale.order',
'res_id': False,
'type': 'ir.actions.act_window',
'target': 'new',
'domain': '[]',
'flags': {'initial_mode': 'edit',} ,
'context': context,
}
class SaleOrderLine(models.Model):
_inherit = 'sale.order.line'
custom_name = fields.Char('Custom Display Name')
sale_order_view.xml
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="view_sale_order_form_inherit" model="ir.ui.view">
<field name="name">sale.order.inherit</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="/form/*" position="after">
<header>
<button name="sale_order_revision" type="object" string="Create New Version" states="sent" class="oe_highlight"/>
</header>
</xpath>
<xpath expr="//group/field[@name='payment_term_id']" position="after">
<field name="estimated_lead_time"/>
<field name="projected_completion_date" widget="date"/>
</xpath>
<xpath expr="//page[last()]" position="after">
<page name="sales_coordination" string="Sales Coordination">
<group>
<group string="Research & Development">
<field name="rd_project" type="checkbox"/>
<field name="ec_requested" widget="date"/>
<field name="engineering_verdict" />
<field name="verdict_given_on" />
<field name="verdict_given_user_id" />
<field name="additional_time" widget="float"/>
</group>
<group string="Shipping">
<field name="shipping_greenlight" widget="date"/>
<field name="payment_greenlight" widget="date"/>
<field name="ship_via" />
<field name="shipping_expense" />
<field name="customer_account" />
</group>
</group>
<group>
<group string="Status">
<field name="primary_approval" widget="date"/>
<field name="proforma_invoice_sent" widget="date"/>
<field name="final_approval" widget="date"/>
<field name="order_confirmation_sent" widget="date"/>
</group>
</group>
</page>
</xpath>
<xpath expr="//field[@name='order_line']/form/group/group/field[@name='product_id']" position="after">
<field name="custom_name"/>
</xpath>
</field>
</record>
</data>
</odoo>
Thanks for any help/advice!
Maybe a bit off topic but did you ever check the OCA module? It does nearly identically what you want so it seems. See https://apps.odoo.com/apps/modules/11.0/sale_order_revision/
@Yenthe Van Ginneken thank you, that is a great match!
I'm still going to try to figure things out as a learning, but this will get the job done for our production environment in the meantime. Thanks so much.