Skip to content

Commit d8993d0

Browse files
committed
[IMP] estate: add actions for selling, cancelled properties and accepting refusing offers
Framework 101 tutorial: chapter 9 - Add actions for selling and cancelling estate properties - Add actions for accepting and refusing offers
1 parent f5d3f43 commit d8993d0

File tree

4 files changed

+59
-1
lines changed

4 files changed

+59
-1
lines changed

estate/models/estate_property.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from dateutil.relativedelta import relativedelta
22
from odoo import api, fields, models
3+
from odoo.exceptions import UserError
34

45

56
class EstateProperty(models.Model):
@@ -29,6 +30,7 @@ class EstateProperty(models.Model):
2930
selection=[("new", "New"), ("offer_received", "Offer Received"), ("offer_accepted", "Offer Accepted"), ("sold", "Sold"), ("cancelled", "Cancelled")],
3031
default="new",
3132
copy=False,
33+
string="Status",
3234
)
3335

3436
# Relations
@@ -61,3 +63,30 @@ def _compute_garden_defaults(self) -> None:
6163
else:
6264
self.garden_area = None
6365
self.garden_orientation = None
66+
67+
# Public methods
68+
def action_set_sold(self) -> bool:
69+
for record in self:
70+
if record.state == "sold":
71+
error_msg = "This property has already been sold."
72+
raise UserError(error_msg)
73+
74+
if record.state == "cancelled":
75+
error_msg = "Cancelled properties cannot be sold."
76+
raise UserError(error_msg)
77+
78+
record.state = "sold"
79+
return True
80+
81+
def action_set_cancelled(self) -> bool:
82+
for record in self:
83+
if record.state == "sold":
84+
error_msg = "Sold properties cannot be cancelled."
85+
raise UserError(error_msg)
86+
87+
if record.state == "cancelled":
88+
error_msg = "This property has already been cancelled."
89+
raise UserError(error_msg)
90+
91+
record.state = "cancelled"
92+
return True

estate/models/estate_property_offer.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from dateutil.relativedelta import relativedelta
44
from odoo import api, fields, models
5+
from odoo.exceptions import UserError
56

67

78
class EstatePropertyOffer(models.Model):
@@ -31,6 +32,27 @@ def _inverse_deadline(self) -> None:
3132
for record in self:
3233
record.validity = (record.date_deadline - _get_reference_date(record)).days
3334

35+
# Public methods
36+
def action_accept(self) -> bool:
37+
for record in self:
38+
if record.status == "accepted":
39+
error_msg = "This offer has already been accepted."
40+
raise UserError(error_msg)
41+
42+
if record.property_id.offer_ids.filtered(lambda r: r.status == "accepted"):
43+
error_msg = "Cannot accept this offer because another offer has already been accepted for the property."
44+
raise UserError(error_msg)
45+
46+
record.status = "accepted"
47+
record.property_id.selling_price = record.price
48+
record.property_id.buyer_id = record.partner_id
49+
return True
50+
51+
def action_refuse(self) -> bool:
52+
for record in self:
53+
record.status = "refused"
54+
return True
55+
3456

3557
def _get_reference_date(offer: EstatePropertyOffer) -> date:
3658
return fields.Date.today() if not offer.create_date else offer.create_date.date()

estate/views/estate_property_offer_views.xml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
<list>
88
<field name="price"/>
99
<field name="partner_id"/>
10-
<field name="status"/>
1110
<field name="validity"/>
1211
<field name="date_deadline"/>
12+
<button name="action_accept" type="object" icon="fa-check"/>
13+
<button name="action_refuse" type="object" icon="fa-times"/>
14+
<field name="status"/>
1315
</list>
1416
</field>
1517
</record>

estate/views/estate_property_views.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121
<field name="model">estate.property</field>
2222
<field name="arch" type="xml">
2323
<form>
24+
<header>
25+
<button name="action_set_sold" type="object" string="SOLD"/>
26+
<button name="action_set_cancelled" type="object" string="CANCEL"/>
27+
</header>
2428
<sheet>
2529
<h1>
2630
<field name="name" nolabel="true"/>
@@ -29,6 +33,7 @@
2933

3034
<group>
3135
<group>
36+
<field name="state"/>
3237
<field name="property_type_id"/>
3338
<field name="postcode"/>
3439
<field name="date_availability"/>

0 commit comments

Comments
 (0)