1- from odoo import models , fields , api , exceptions
1+ from odoo import models , fields , api
2+ from odoo .exceptions import ValidationError , UserError
3+ from odoo .tools .float_utils import float_compare , float_is_zero
24
35
46class EstateProperty (models .Model ):
@@ -35,15 +37,24 @@ class EstateProperty(models.Model):
3537 total_area = fields .Float ('Total Area' , compute = '_compute_total_area' )
3638 best_price = fields .Float ('Best Offer' , compute = '_compute_best_price' )
3739
40+ _check_positive_selling_price = models .Constraint (
41+ 'CHECK(selling_price >= 0)' ,
42+ 'The selling price must be positive.' ,
43+ )
44+ _check_positive_expected_price = models .Constraint (
45+ 'CHECK(expected_price > 0)' ,
46+ 'The expected price must be positive.' ,
47+ )
48+
3849 @api .depends ('garden_area' , 'living_area' )
3950 def _compute_total_area (self ):
4051 for record in self :
4152 record .total_area = record .garden_area + record .living_area
42-
53+
4354 @api .depends ('offer_ids.price' )
4455 def _compute_best_price (self ):
4556 for record in self :
46- record .best_price = max (record .offer_ids , key = lambda p : p .price ).price
57+ record .best_price = max (record .offer_ids , key = lambda p : p .price , default = 0 ).price
4758
4859 @api .onchange ('garden' )
4960 def _onchange_garden (self ):
@@ -53,19 +64,33 @@ def _onchange_garden(self):
5364 else :
5465 self .garden_area = 10
5566 self .garden_orientation = 'north'
56-
67+
5768 def action_cancel_property (self ):
5869 for record in self :
5970 if record .state == 'sold' :
60- raise exceptions . UserError ('Sold properties cannot be cancelled' )
71+ raise UserError ('Sold properties cannot be cancelled' )
6172 else :
6273 record .state = 'cancelled'
6374 return True
6475
6576 def action_sold_property (self ):
6677 for record in self :
6778 if record .state == 'cancelled' :
68- raise exceptions . UserError ('Cancelled properties cannot be sold' )
79+ raise UserError ('Cancelled properties cannot be sold' )
6980 else :
7081 record .state = 'sold'
71- return True
82+ return True
83+
84+ @api .constrains ('selling_price' , 'expected_price' )
85+ def _check_selling_price (self ):
86+ for record in self :
87+ if float_is_zero (record .selling_price , precision_rounding = 0.0001 ):
88+ continue
89+ if float_compare (
90+ record .selling_price ,
91+ record .expected_price * 0.9 ,
92+ precision_rounding = 0.01 ,
93+ ) == - 1 :
94+ raise ValidationError (
95+ "The selling price cannot be lower than 90 precent of the expected price."
96+ )
0 commit comments