Skip to content

Commit ceeae76

Browse files
committed
[Add] estate: added computed fields
1 parent 6eb9eaf commit ceeae76

10 files changed

+108
-48
lines changed

estate/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
from . import models
1+
from . import models

estate/__manifest__.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
{
2-
'name': 'Real Estate',
3-
'application': True,
4-
'installable': True,
5-
'category': 'Real Estate/Brokerage',
6-
'data': [
7-
'security/ir.model.access.csv',
8-
'views/estate_property_views.xml',
9-
'views/estate_property_type_views.xml',
10-
'views/estate_property_tag_views.xml',
11-
'views/estate_property_offer_views.xml',
12-
'views/estate_menus.xml',
13-
]
14-
}
2+
"name": "Real Estate",
3+
"application": True,
4+
"installable": True,
5+
"category": "Real Estate/Brokerage",
6+
"data": [
7+
"security/ir.model.access.csv",
8+
"views/estate_property_views.xml",
9+
"views/estate_property_type_views.xml",
10+
"views/estate_property_tag_views.xml",
11+
"views/estate_property_offer_views.xml",
12+
"views/estate_menus.xml",
13+
],
14+
}

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: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
from odoo import models, fields
1+
from odoo import models, fields, api
22
from datetime import timedelta
33

4+
45
class EstateModel(models.Model):
56
_name = "estate.property"
67
_description = "Real Estate Advertisement Model"
@@ -9,10 +10,9 @@ class EstateModel(models.Model):
910
description = fields.Text()
1011
postcode = fields.Char()
1112
date_availability = fields.Date(
12-
copy=False,
13-
default= fields.Date.today() + timedelta(days=90)
14-
)
15-
active= fields.Boolean(default=True)
13+
copy=False, default=fields.Date.today() + timedelta(days=90)
14+
)
15+
active = fields.Boolean(default=True)
1616
expected_price = fields.Float(required=True)
1717
selling_price = fields.Float(readonly=True, copy=False)
1818
bedrooms = fields.Integer(default=2)
@@ -21,22 +21,53 @@ class EstateModel(models.Model):
2121
garage = fields.Boolean()
2222
garden = fields.Boolean()
2323
garden_area = fields.Integer()
24-
state= fields.Selection(
25-
string='state',
24+
state = fields.Selection(
25+
string="state",
2626
default="New",
2727
required=True,
2828
copy=False,
29-
selection=[('New', 'New'),('Offer Received', 'Offer Received'),('Offer Accepted', 'Offer Accepted'),('Sold', 'Sold'), ('Cancelled', 'Cancelled'),
30-
]
29+
selection=[
30+
("New", "New"),
31+
("Offer Received", "Offer Received"),
32+
("Offer Accepted", "Offer Accepted"),
33+
("Sold", "Sold"),
34+
("Cancelled", "Cancelled"),
35+
],
3136
)
3237
garden_orientation = fields.Selection(
33-
string='Garden Orientation',
34-
selection=[('north', 'North'),('south', 'South'),('east', 'East'),('west', 'West'),
38+
string="Garden Orientation",
39+
selection=[
40+
("north", "North"),
41+
("south", "South"),
42+
("east", "East"),
43+
("west", "West"),
3544
],
36-
help="Select the direction the garden faces"
45+
help="Select the direction the garden faces",
3746
)
38-
property_type_id= fields.Many2one("estate.property.type")
39-
buyer= fields.Many2one("res.partner")
40-
salesman= fields.Many2one("res.users")
41-
tag_ids= fields.Many2many("estate.property.tag")
42-
offer_ids= fields.One2many("estate.property.offer", inverse_name="property_id")
47+
property_type_id = fields.Many2one("estate.property.type")
48+
buyer = fields.Many2one("res.partner")
49+
salesman = fields.Many2one("res.users")
50+
tag_ids = fields.Many2many("estate.property.tag")
51+
offer_ids = fields.One2many("estate.property.offer", inverse_name="property_id")
52+
total_area = fields.Float(compute="_compute_total_area")
53+
best_price = fields.Float(compute="_compute_best_price")
54+
55+
@api.depends("living_area", "garden_area")
56+
def _compute_total_area(self):
57+
for record in self:
58+
record.total_area = record.living_area + record.garden_area
59+
60+
@api.depends("offer_ids.price")
61+
def _compute_best_price(self):
62+
for record in self:
63+
record.best_price = max(record.offer_ids.mapped("price"), default=0.0)
64+
65+
# the onchange method will access self which will hold the current form value object not all the value objects
66+
@api.onchange("garden")
67+
def _set_garden_default_values(self):
68+
if self.garden:
69+
self.garden_area = 10
70+
self.garden_orientation = "north"
71+
else:
72+
self.garden_area = 0
73+
self.garden_orientation = ""
Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,31 @@
1-
from odoo import models, fields
1+
from odoo import models, fields, api
2+
from datetime import timedelta
3+
24

35
class EstateOfferModel(models.Model):
46
_name = "estate.property.offer"
57
_description = "Real Estate Property Offer Model"
68

79
price = fields.Float()
8-
status = fields.Selection([
9-
('Accepted', 'Accepted'),
10-
('Refused', 'Refused')
11-
], copy=False)
12-
partner_id= fields.Many2one('res.partner', required=True)
13-
property_id= fields.Many2one('estate.property', required=True)
10+
status = fields.Selection(
11+
[("Accepted", "Accepted"), ("Refused", "Refused")], copy=False
12+
)
13+
partner_id = fields.Many2one("res.partner", required=True)
14+
property_id = fields.Many2one("estate.property", required=True)
15+
validity = fields.Integer(default=7)
16+
date_deadline = fields.Date(default=fields.Date.today() + timedelta(days=7))
17+
18+
@api.depends("validity", "create_date")
19+
def _compute_date_deadline(self):
20+
for record in self:
21+
record.date_deadline = fields.Date.add(
22+
(record.create_date or fields.date.today()), days=record.validity
23+
)
24+
25+
def _inverse_date_deadline(self):
26+
for record in self:
27+
record.validity = (
28+
(record.date_deadline - record.create_date.date()).days
29+
if record.date_deadline
30+
else 0
31+
)

estate/models/estate_property_tag.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from odoo import models, fields
22

3+
34
class EstateTagModel(models.Model):
45
_name = "estate.property.tag"
56
_description = "Real Estate Property Tag Model"
67

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

estate/models/estate_property_type.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from odoo import models, fields
22

3+
34
class EstateTypeModel(models.Model):
45
_name = "estate.property.type"
56
_description = "Real Estate Property Type Model"
67

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

estate/views/estate_menus.xml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@
44
<menuitem id="estate_menu_root" name="Real Estate">
55

66
<menuitem id="estate_advertisements_menu" name="Advertisements">
7-
<menuitem id="estate_property_adv_menu_action" action="action_estate_property" name="Property"/>
7+
<menuitem id="estate_property_adv_menu_action" action="action_estate_property"
8+
name="Property" />
89
</menuitem>
910

1011
<menuitem id="estate_settings_menu" name="Settings">
11-
<menuitem id="estate_property_menu_action" action="action_estate_property" name="Property"/>
12-
<menuitem id="estate_property_type_menu_action" action="action_estate_property_type" name="Property Types"/>
13-
<menuitem id="estate_property_tag_menu_action" action="action_estate_property_tag" name="Property Tags"/>
12+
<menuitem id="estate_property_menu_action" action="action_estate_property"
13+
name="Property" />
14+
<menuitem id="estate_property_type_menu_action" action="action_estate_property_type"
15+
name="Property Types" />
16+
<menuitem id="estate_property_tag_menu_action" action="action_estate_property_tag"
17+
name="Property Tags" />
1418
</menuitem>
1519

1620
</menuitem>
17-
</odoo>
21+
</odoo>

estate/views/estate_property_offer_views.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
<field name="price" string="Price" />
2222
<field name="partner_id" string="Partner" />
2323
<field name="status" string="Status" />
24+
<field name="date_deadline" string="Deadline" />
25+
<field name="validity" string="Validity" />
2426
</list>
2527
</field>
2628
</record>

estate/views/estate_property_views.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
</group>
5353
<group>
5454
<field name="expected_price" string="Expected Price" />
55+
<field name="best_price" string="Best Offer" />
5556
<field name="selling_price" string="Selling Price" />
5657
</group>
5758
</group>
@@ -67,11 +68,13 @@
6768
<field name="garden_area" string="Garden Area (sqm)" />
6869
<field name="garden_orientation" string="Garden Orientation" />
6970
<field name="state" string="State" />
71+
<field name="total_area" string="Total Area (sqm)" />
7072
</group>
7173
</page>
7274
<page string="Offers">
73-
<!-- <field name="offer_ids" readonly="status in ['offer_accepted', 'sold', 'cancelled']"></field> -->
74-
<field name="offer_ids" />
75+
<group>
76+
<field name="offer_ids" />
77+
</group>
7578
</page>
7679
<page string="Other Info">
7780
<group>

0 commit comments

Comments
 (0)