Skip to content

Commit a468553

Browse files
committed
[IMP] estate: Chapter 8 Computed fields and onchanges
1 parent 0f1ce9e commit a468553

File tree

8 files changed

+75
-28
lines changed

8 files changed

+75
-28
lines changed

estate/models/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
from . import estate_property
22
from . import estate_property_type
33
from . import estate_property_tag
4-
from . import estate_property_offer
4+
from . import estate_property_offer

estate/models/estate_property.py

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from odoo import fields, models
1+
from odoo import api, fields, models
22
from dateutil.relativedelta import relativedelta
33
from datetime import date
44

55

66
class EstatePropertyModel(models.Model):
7-
_name = "estate.property"
7+
_name = 'estate.property'
88
_description = "Real Estate property database"
99
name = fields.Char(required=True)
1010
description = fields.Text()
@@ -21,32 +21,59 @@ class EstatePropertyModel(models.Model):
2121
garden_area = fields.Integer()
2222
garden_orientation = fields.Selection(
2323
selection=[
24-
('north', 'North'),
25-
('east', 'East'),
26-
('south', 'South'),
27-
('west', 'West'),
24+
('north', "North"),
25+
('east', "East"),
26+
('south', "South"),
27+
('west', "West"),
2828
],
29-
string='Garden Orientation',
29+
string="Garden Orientation",
3030
default='south',
3131
)
3232
state = fields.Selection(
3333
selection=[
34-
('new', 'New'),
35-
('offer_received', 'Offer Received'),
36-
('offer_accepted', 'Offer Accepted'),
37-
('sold', 'Sold'),
38-
('cancel', 'Cancelled'),
34+
('new', "New"),
35+
('offer_received', "Offer Received"),
36+
('offer_accepted', "Offer Accepted"),
37+
('sold', "Sold"),
38+
('cancel', "Cancelled"),
3939
],
4040
required=True,
4141
copy=False,
4242
default='new',
4343
)
44-
property_type_id = fields.Many2one("estate.property.type", string="Property Type")
45-
buyer_id = fields.Many2one("res.partner", string="Buyer", copy=False)
44+
45+
property_type_id = fields.Many2one('estate.property.type', string="Property Type")
46+
buyer_id = fields.Many2one('res.partner', string="Buyer", copy=False)
4647
salesperson_id = fields.Many2one(
47-
"res.users",
48-
string="Salesperson",
48+
'res.users',
49+
string="Salesperson",
4950
default=lambda self: self.env.user
5051
)
51-
tag_ids = fields.Many2many("estate.property.tag", string="Tags")
52-
offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers")
52+
tag_ids = fields.Many2many('estate.property.tag', string="Tags")
53+
offer_ids = fields.One2many('estate.property.offer', 'property_id', string="Offers")
54+
55+
total_area = fields.Integer(compute='_compute_total_area', string="Total Area (sqm)")
56+
best_price = fields.Float(compute='_compute_best_price', string="Best Offer")
57+
58+
@api.depends('living_area', 'garden_area')
59+
def _compute_total_area(self):
60+
for record in self:
61+
record.total_area = record.living_area + record.garden_area
62+
63+
@api.depends('offer_ids.price')
64+
def _compute_best_price(self):
65+
for record in self:
66+
offers = record.offer_ids.mapped('price')
67+
if offers:
68+
record.best_price = max(offers)
69+
else:
70+
record.best_price = 0.0
71+
72+
@api.onchange('garden')
73+
def _onchange_garden(self):
74+
if self.garden:
75+
self.garden_area = 10
76+
self.garden_orientation = 'north'
77+
else:
78+
self.garden_area = 0
79+
self.garden_orientation = False
Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,29 @@
1-
from odoo import fields, models
1+
from odoo import api, fields, models
2+
from datetime import timedelta
23

34

45
class EstatePropertyOffer(models.Model):
5-
_name = "estate.property.offer"
6+
_name = 'estate.property.offer'
67
_description = "Property Offer"
78

89
price = fields.Float()
910
status = fields.Selection(
10-
selection=[('accepted', 'Accepted'), ('refused', 'Refused')],
11+
selection=[('accepted', "Accepted"), ('refused', "Refused")],
1112
copy=False
1213
)
13-
partner_id = fields.Many2one("res.partner", string="Partner", required=True)
14-
property_id = fields.Many2one("estate.property", string="Property", required=True)
14+
partner_id = fields.Many2one('res.partner', string="Partner", required=True)
15+
property_id = fields.Many2one('estate.property', string="Property", required=True)
16+
17+
validity = fields.Integer(string="Validity (days)", default=7)
18+
date_deadline = fields.Date(string="Deadline", compute='_compute_date_deadline', inverse='_inverse_date_deadline')
19+
20+
@api.depends('create_date', 'validity')
21+
def _compute_date_deadline(self):
22+
for record in self:
23+
start_date = record.create_date.date() if record.create_date else fields.Date.today()
24+
record.date_deadline = start_date + timedelta(days=record.validity)
25+
26+
def _inverse_date_deadline(self):
27+
for record in self:
28+
start_date = record.create_date.date() if record.create_date else fields.Date.today()
29+
record.validity = (record.date_deadline - start_date).days

estate/models/estate_property_tag.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@ class EstatePropertyTag(models.Model):
55
_name = "estate.property.tag"
66
_description = "Property Tag"
77

8-
name = fields.Char(required=True)
8+
name = fields.Char(required=True)
9+

estate/models/estate_property_type.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@
44
class EstatePropertyTypeModel(models.Model):
55
_name = "estate.property.type"
66
_description = "Real Estate property types database"
7-
name = fields.Char(required=True)
7+
name = fields.Char(required=True)
8+

estate/views/estate_property_offer_views.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
<list string="Offers">
88
<field name="price"/>
99
<field name="partner_id"/>
10+
<field name="validity"/>
11+
<field name="date_deadline"/>
1012
<field name="status"/>
1113
</list>
1214
</field>

estate/views/estate_property_type_views.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
<field name="res_model">estate.property.type</field>
66
<field name="view_mode">list,form</field>
77
</record>
8-
</odoo>
8+
</odoo>

estate/views/estate_property_views.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
</group>
3838
<group>
3939
<field name="expected_price"/>
40-
<field name="selling_price"/>
40+
<field name="best_price"/> <field name="selling_price"/>
4141
<field name="date_availability"/>
4242
</group>
4343
</group>
@@ -52,6 +52,7 @@
5252
<field name="garden"/>
5353
<field name="garden_area"/>
5454
<field name="garden_orientation"/>
55+
<field name="total_area"/>
5556
</group>
5657
</page>
5758
<page string="Offers">

0 commit comments

Comments
 (0)