Skip to content

Commit 313ec7d

Browse files
committed
[IMP] estate: Added actions, some refactoring
Added actions as mentioned in chapter 9 did some refactoring to follow latest comments
1 parent 4dd2cd8 commit 313ec7d

File tree

5 files changed

+76
-26
lines changed

5 files changed

+76
-26
lines changed

estate/models/estate_property.py

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
from odoo import fields, models, api
2-
from odoo.tools import date_utils as du
31
from datetime import date
42

3+
from odoo import fields, models, api
4+
from odoo.tools import date_utils
5+
from odoo.exceptions import UserError
6+
57

68
class EstateProperty(models.Model):
79
_name = "estate.property"
@@ -10,7 +12,9 @@ class EstateProperty(models.Model):
1012
name = fields.Char(required=True)
1113
description = fields.Text()
1214
postcode = fields.Char()
13-
date_availability = fields.Date(copy=False, default=du.add(date.today(), months=3))
15+
date_availability = fields.Date(
16+
copy=False, default=lambda _: date_utils.add(date.today(), months=3)
17+
)
1418
expected_price = fields.Float(required=True)
1519
selling_price = fields.Float(readonly=True, copy=False)
1620
bedrooms = fields.Integer(default=2)
@@ -28,7 +32,7 @@ class EstateProperty(models.Model):
2832
("west", "West"),
2933
],
3034
)
31-
total_area = fields.Float(compute="_compute_area")
35+
total_area = fields.Float(compute="_compute_total_area")
3236
active = fields.Boolean(default=True)
3337
state = fields.Selection(
3438
string="State",
@@ -56,18 +60,22 @@ class EstateProperty(models.Model):
5660
compute="_compute_best_price", readonly=True, string="Best Offer"
5761
)
5862

59-
@api.depends("living_area", "garden", "garden_area")
60-
def _compute_area(self):
61-
for record in self:
62-
record.total_area = record.living_area + record.garden_area
63+
@api.depends("living_area", "garden_area")
64+
def _compute_total_area(self):
65+
for single_property in self:
66+
single_property.total_area = (
67+
single_property.living_area + single_property.garden_area
68+
)
6369

6470
@api.depends("offers_ids.price")
6571
def _compute_best_price(self):
66-
for record in self:
67-
if record.offers_ids:
68-
record.best_price = max(record.offers_ids.mapped("price"))
72+
for single_property in self:
73+
if single_property.offers_ids:
74+
single_property.best_price = max(
75+
single_property.offers_ids.mapped("price")
76+
)
6977
else:
70-
record.best_price = 0
78+
single_property.best_price = 0
7179

7280
@api.onchange("garden")
7381
def _onchange_garden(self):
@@ -77,3 +85,19 @@ def _onchange_garden(self):
7785
else:
7886
self.garden_area = 0
7987
self.garden_orientation = None
88+
89+
def action_property_cancel(self):
90+
for single_property in self:
91+
if single_property.state == "sold":
92+
raise UserError("Sold properties cannot be cancelled!")
93+
return False
94+
single_property.state = "cancelled"
95+
return True
96+
97+
def action_property_sold(self):
98+
for single_property in self:
99+
if single_property.state == "cancelled":
100+
raise UserError("Cancelled properties cannot be sold!")
101+
return False
102+
single_property.state = "sold"
103+
return True

estate/models/estate_property_offer.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
from odoo import fields, models, api
2-
from odoo.tools import date_utils as du
31
from datetime import date
42

3+
from odoo import fields, models, api
4+
from odoo.tools import date_utils
5+
from odoo.exceptions import UserError
6+
57

68
class EstatePropertyOffer(models.Model):
79
_name = "estate.property.offer"
@@ -23,18 +25,37 @@ class EstatePropertyOffer(models.Model):
2325
inverse="_inverse_date_deadline",
2426
string="Deadline",
2527
)
28+
sold = fields.Boolean(default="false")
2629

2730
@api.depends("validity")
2831
def _compute_date_deadline(self):
29-
for record in self:
32+
for offer in self:
3033
create_date_actual = (
31-
date.today() if not record.create_date else record.create_date.date()
34+
date.today() if not offer.create_date else offer.create_date.date()
35+
)
36+
offer.date_deadline = date_utils.add(
37+
create_date_actual, days=offer.validity
3238
)
33-
record.date_deadline = du.add(create_date_actual, days=record.validity)
3439

3540
def _inverse_date_deadline(self):
36-
for record in self:
41+
for offer in self:
3742
create_date_actual = (
38-
date.today() if not record.create_date else record.create_date.date()
43+
date.today() if not offer.create_date else offer.create_date.date()
3944
)
40-
record.validity = (record.date_deadline - create_date_actual).days
45+
offer.validity = (offer.date_deadline - create_date_actual).days
46+
47+
def action_offer_accept(self):
48+
for offer in self:
49+
if offer.sold:
50+
raise UserError("An offer has already been accepted!")
51+
return False
52+
offer.status = "accepted"
53+
offer.property_id.selling_price = offer.price
54+
offer.property_id.buyer_id = offer.partner_id
55+
offer.sold = False
56+
return True
57+
58+
def action_offer_refuse(self):
59+
for offer in self:
60+
offer.status = "refused"
61+
return True

estate/views/estate_menus.xml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,8 @@
66
action="estate_property_action"/>
77
</menuitem>
88
<menuitem id="estate_settings_menu" name="Settings">
9-
<menuitem id="estate_property_type_menu_action"
10-
action="estate_property_type_action"/>
11-
<menuitem id="estate_property_tag_menu_action"
12-
action="estate_property_tag_action"/>
9+
<menuitem id="estate_property_type_menu_action" action="estate_property_type_action"/>
10+
<menuitem id="estate_property_tag_menu_action" action="estate_property_tag_action"/>
1311
</menuitem>
1412
</menuitem>
1513
</odoo>

estate/views/estate_offer_views.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
<field name="partner_id" string="Partner"/>
2525
<field name="validity"/>
2626
<field name="date_deadline"/>
27+
<button name="action_offer_accept" type="object" icon="fa-check"/>
28+
<button name="action_offer_refuse" type="object" icon="fa-times"/>
2729
<field name="status"/>
2830
</list>
2931
</field>

estate/views/estate_property_views.xml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
<field name="living_area" string="Living Area (sqm)"/>
1313
<field name="facades"/>
1414
<separator/>
15-
<filter string="Available" name="state" domain="['|', ('state', '=', 'new'), ('state', '=', 'offer-received')]"/>
15+
<filter string="Available" name="state" domain="[('state', 'in', ['new', 'offer-received'])]"/>
1616
<group expand="1" string="Group By">
17-
<filter name="postcode" context="{'group_by':'postcode', 'residual_visible':True}"/>
17+
<filter name="postcode" context="{'group_by':'postcode'}"/>
1818
</group>
1919
</search>
2020
</field>
@@ -25,13 +25,18 @@
2525
<field name="model">estate.property</field>
2626
<field name="arch" type="xml">
2727
<form string="Listing">
28+
<header>
29+
<button name="action_property_cancel" string="Cancel" type="object" class="oe_highlight"/>
30+
<button name="action_property_sold" string="Sold" type="object" class="oe_highlight"/>
31+
</header>
2832
<sheet>
2933
<h1>
3034
<field name="name"/>
3135
</h1>
3236
<field name="tag_ids" widget="many2many_tags"/>
3337
<group>
3438
<group>
39+
<field name="state" string="Status"/>
3540
<field name="property_type_id"/>
3641
<field name="postcode"/>
3742
<field name="date_availability" string="Available From"/>

0 commit comments

Comments
 (0)