Skip to content

Commit ebbd036

Browse files
committed
[IMP] (Chapter: 8) estate: compute fields and onchange behavior for estate
Add compute, inverse, and onchange methods to the estate model. Introduce @api.depends to compute the total area and best price, and use @api.onchange to automatically fill garden_area and orientation when the garden field is modified.
1 parent 03ff1e8 commit ebbd036

File tree

4 files changed

+57
-11
lines changed

4 files changed

+57
-11
lines changed

estate/models/estate_property.py

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

44

@@ -46,3 +46,27 @@ class EstateProperty(models.Model):
4646
)
4747
tag_ids = fields.Many2many("estate.property.tag", string="Property Tags")
4848
offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offer")
49+
total_area = fields.Integer(compute="_compute_area")
50+
best_price = fields.Integer(compute="_compute_highest")
51+
52+
@api.depends("living_area", "garden_area")
53+
def _compute_area(self):
54+
for record in self:
55+
record.total_area = record.living_area + record.garden_area
56+
57+
@api.depends("offer_ids.price")
58+
def _compute_highest(self):
59+
for record in self:
60+
if not record.mapped("offer_ids.price"):
61+
record.best_price = 0
62+
else:
63+
record.best_price = max(record.mapped("offer_ids.price"))
64+
65+
@api.onchange("garden")
66+
def _onchange_garden(self):
67+
if self.garden:
68+
self.garden_area = 10
69+
self.garden_orientation = "north"
70+
else:
71+
self.garden_area = 0
72+
self.garden_orientation = None

estate/models/estate_property_offer.py

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

34

45
class EstatePropertyOffer(models.Model):
@@ -11,3 +12,16 @@ class EstatePropertyOffer(models.Model):
1112
)
1213
partner_id = fields.Many2one("res.partner", string="Partner", required=True)
1314
property_id = fields.Many2one("estate.property", string="Property", required=True)
15+
validity = fields.Integer(default=7)
16+
date_deadline = fields.Date(compute="_compute_deadline", inverse="_inverse_date")
17+
18+
@api.depends("validity")
19+
def _compute_deadline(self):
20+
for record in self:
21+
base_date = record.create_date or fields.Date.today()
22+
record.date_deadline = base_date + relativedelta(days=record.validity)
23+
24+
def _inverse_date(self):
25+
for record in self:
26+
base_date = record.create_date or fields.Date.today()
27+
record.validity = (record.date_deadline - fields.Date.to_date(base_date)).days

estate/views/estate_property_offer_views.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
<field name="price"/>
1515
<field name="partner_id"/>
1616
<field name="status"/>
17+
<field name="validity" string="Validity(days)"/>
18+
<field name="date_deadline"/>
1719
</list>
1820
</field>
1921
</record>
@@ -28,6 +30,8 @@
2830
<field name="price" />
2931
<field name="partner_id" />
3032
<field name="status" />
33+
<field name="validity" string="Validity(days)"/>
34+
<field name="date_deadline"/>
3135
</group>
3236
</sheet>
3337
</form>

estate/views/estate_property_views.xml

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,21 @@
2323
<field name="model">estate.property</field>
2424
<field name="arch" type="xml">
2525
<form string="Property">
26-
<sheet>
27-
<h1>
28-
<field name="name" string="Title"/>
26+
<sheet>
27+
<h1>
28+
<field name="name" string="Title" />
2929
</h1>
3030
<field name="tag_ids" widget="many2many_tags" />
3131
<group>
3232
<group>
33-
<field name="postcode"/>
34-
<field name="expected_price"/>
35-
<field name="selling_price"/>
33+
<field name="property_type_id" string="Property Type" options="{'no_create': true}"/>
34+
<field name="postcode" />
35+
<field name="date_availability" string="Available From" />
3636
</group>
3737
<group>
38-
<field name="property_type_id" options="{'no_create': true}"/>
39-
<field name="date_availability" string="Available From"/>
38+
<field name="expected_price" />
39+
<field name="selling_price" />
40+
<field name="best_price"/>
4041
</group>
4142
</group>
4243
<notebook>
@@ -51,8 +52,11 @@
5152
<field name="garden"/>
5253
<field name="garden_area" string="Garden Area(sqm)"/>
5354
<field name="garden_orientation"/>
55+
<field name="total_area" string="Total Area(sqm)"/>
56+
</group>
57+
<group>
5458
<field name="active"/>
55-
<field name="state"/>
59+
<field name="state"/>
5660
</group>
5761
</group>
5862
</page>

0 commit comments

Comments
 (0)