19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:32:12 +01:00
parent 79f83631d5
commit 73afc09215
6267 changed files with 1534193 additions and 1130106 deletions

View file

@ -1,30 +1,13 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
from odoo.addons.website.models import ir_http
from odoo import _, api, models
from odoo.fields import Domain
from odoo.http import request
class ResPartner(models.Model):
_inherit = 'res.partner'
last_website_so_id = fields.Many2one('sale.order', compute='_compute_last_website_so_id', string='Last Online Sales Order')
def _compute_last_website_so_id(self):
SaleOrder = self.env['sale.order']
for partner in self:
is_public = partner.is_public
website = ir_http.get_request_website()
if website and not is_public:
partner.last_website_so_id = SaleOrder.search([
('partner_id', '=', partner.id),
('pricelist_id', '=', partner.property_product_pricelist.id),
('website_id', '=', website.id),
('state', '=', 'draft'),
], order='write_date desc', limit=1)
else:
partner.last_website_so_id = SaleOrder # Not in a website context or public User
@api.onchange('property_product_pricelist')
def _onchange_property_product_pricelist(self):
open_order = self.env['sale.order'].sudo().search([
@ -45,22 +28,47 @@ class ResPartner(models.Model):
),
}}
def _get_current_partner(self, *, order_sudo=False, **kwargs):
""" Override `portal` to get current partner from order_sudo if user is not signed up. """
if order_sudo:
return (
(not order_sudo._is_anonymous_cart() and order_sudo.partner_id)
or self.env['res.partner'] # Avoid returning public user's partner
)
return super()._get_current_partner(order_sudo=order_sudo, **kwargs)
def _get_frontend_writable_fields(self):
""" Override `portal` to make website whitelist fields writable in portal address. """
frontend_writable_fields = super()._get_frontend_writable_fields()
frontend_writable_fields.update(
self.env['ir.model']._get('res.partner')._get_form_writable_fields().keys()
)
return frontend_writable_fields
def _get_order_fiscal_position_recompute_domain(self):
"""Return a domain of sale orders for which we should recompute fiscal position after address update."""
return Domain([
('state', '=', 'draft'),
('website_id', '!=', False),
'|', ('partner_id', 'in', self.ids),
('partner_shipping_id', 'in', self.ids),
])
def write(self, vals):
res = super().write(vals)
if {'country_id', 'vat', 'zip'} & vals.keys():
if {'country_id', 'vat', 'zip'} & vals.keys() and self:
# Recompute fiscal position for open website orders
orders_sudo = self.env['sale.order'].sudo().search([
('state', '=', 'draft'),
('website_id', '!=', False),
'|', ('partner_id', 'in', self.ids), ('partner_shipping_id', 'in', self.ids),
])
if orders_sudo:
fpos_by_order = {so.id: so.fiscal_position_id.id for so in orders_sudo}
order_fpos_recompute_domain = self._get_order_fiscal_position_recompute_domain()
if orders_sudo := self.env['sale.order'].sudo().search(order_fpos_recompute_domain):
orders_by_fpos = orders_sudo.grouped('fiscal_position_id')
self.env.add_to_compute(orders_sudo._fields['fiscal_position_id'], orders_sudo)
fpos_changed = orders_sudo.filtered(
lambda so: so.fiscal_position_id.id != fpos_by_order[so.id],
)
if fpos_changed:
if fpos_changed := orders_sudo.filtered(
lambda so: so not in orders_by_fpos.get(so.fiscal_position_id, []),
):
fpos_changed._recompute_taxes()
fpos_changed._recompute_prices()
# other modules may extend the orders to recompute for
# non-draft orders (for ex. sale_subscription), we need
# to ensure to only recompute prices for draft orders
fpos_changed.filtered(lambda order: order.state == 'draft')._recompute_prices()
return res