Skip to content

Commit f5d3f43

Browse files
committed
[IMP] estate: add computed fields and "onchange" handler method
Framework 101 tutorial: chapter 8 - Estate properties now have computed fields to display the best offer (i.e. best price) and the total area (i.e. sum of living area + garden) - Default values are set or cleared when clicking the garden checkbox - Introduced validity period fields for offers
1 parent bd767ca commit f5d3f43

File tree

4 files changed

+54
-4
lines changed

4 files changed

+54
-4
lines changed

estate/models/estate_property.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from dateutil.relativedelta import relativedelta
2-
from odoo import fields, models
2+
from odoo import api, fields, models
33

44

55
class EstateProperty(models.Model):
@@ -37,3 +37,27 @@ class EstateProperty(models.Model):
3737
buyer_id = fields.Many2one("res.partner", copy=False)
3838
tag_ids = fields.Many2many("estate.property.tag")
3939
offer_ids = fields.One2many("estate.property.offer", "property_id")
40+
41+
# Computed
42+
total_area = fields.Integer(compute="_compute_total_area", string="Total Area (sqm)")
43+
best_price = fields.Float(compute="_compute_best_price", string="Best Offer")
44+
45+
@api.depends("living_area", "garden_area")
46+
def _compute_total_area(self) -> None:
47+
for record in self:
48+
record.total_area = record.living_area + record.garden_area
49+
50+
@api.depends("offer_ids.price")
51+
def _compute_best_price(self) -> None:
52+
for record in self:
53+
record.best_price = max(record.offer_ids.mapped("price"), default=0)
54+
55+
# Methods that trigger on changes
56+
@api.onchange("garden")
57+
def _compute_garden_defaults(self) -> None:
58+
if self.garden:
59+
self.garden_area = 10
60+
self.garden_orientation = "north"
61+
else:
62+
self.garden_area = None
63+
self.garden_orientation = None

estate/models/estate_property_offer.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
from odoo import fields, models
1+
from datetime import date
2+
3+
from dateutil.relativedelta import relativedelta
4+
from odoo import api, fields, models
25

36

47
class EstatePropertyOffer(models.Model):
@@ -10,7 +13,24 @@ class EstatePropertyOffer(models.Model):
1013
selection=[("accepted", "Accepted"), ("refused", "Refused")],
1114
copy=False,
1215
)
16+
validity = fields.Integer(default=7, string="Validity (days)")
1317

1418
# Relations
1519
partner_id = fields.Many2one("res.partner", required=True)
1620
property_id = fields.Many2one("estate.property", required=True)
21+
22+
# Computed
23+
date_deadline = fields.Date(compute="_compute_deadline", inverse="_inverse_deadline", string="Deadline")
24+
25+
@api.depends("create_date", "validity")
26+
def _compute_deadline(self) -> None:
27+
for record in self:
28+
record.date_deadline = _get_reference_date(record) + relativedelta(days=record.validity)
29+
30+
def _inverse_deadline(self) -> None:
31+
for record in self:
32+
record.validity = (record.date_deadline - _get_reference_date(record)).days
33+
34+
35+
def _get_reference_date(offer: EstatePropertyOffer) -> date:
36+
return fields.Date.today() if not offer.create_date else offer.create_date.date()

estate/views/estate_property_offer_views.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
<field name="price"/>
99
<field name="partner_id"/>
1010
<field name="status"/>
11+
<field name="validity"/>
12+
<field name="date_deadline"/>
1113
</list>
1214
</field>
1315
</record>
@@ -22,9 +24,11 @@
2224
<field name="price"/>
2325
<field name="partner_id"/>
2426
<field name="status"/>
27+
<field name="validity"/>
28+
<field name="date_deadline"/>
2529
</group>
2630
</sheet>
2731
</form>
2832
</field>
2933
</record>
30-
</odoo>
34+
</odoo>

estate/views/estate_property_views.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
</group>
3636
<group>
3737
<field name="expected_price"/>
38+
<field name="best_price"/>
3839
<field name="selling_price"/>
3940
</group>
4041
</group>
@@ -49,6 +50,7 @@
4950
<field name="garden"/>
5051
<field name="garden_area"/>
5152
<field name="garden_orientation"/>
53+
<field name="total_area"/>
5254
</group>
5355
</page>
5456
<page string="Offers">
@@ -89,4 +91,4 @@
8991
<field name="res_model">estate.property</field>
9092
<field name="view_mode">list,form</field>
9193
</record>
92-
</odoo>
94+
</odoo>

0 commit comments

Comments
 (0)