Skip to content

Commit d02d21f

Browse files
committed
[ADD] estate: added Cancel and Sold buttons to property, Accept/Refuse to offer
- Property page now has Cancel and Sold buttons for quick status updates - Cancelled properties cannot be marked sold and vice versa - Offer page includes Accept and Refuse buttons for better offer handling - Accepting an offer sets the buyer and selling price automatically - Ensures only one offer can be accepted per property
1 parent 830bfc6 commit d02d21f

11 files changed

+65
-48
lines changed

estate/__manifest__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@
1111
"views/estate_property_offer_views.xml",
1212
"views/estate_menus.xml",
1313
],
14+
"license": "LGPL-3"
1415
}

estate/models/estate_property.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
from odoo import models, fields, api
21
from datetime import timedelta
2+
from odoo import api, fields, models
3+
from odoo.exceptions import UserError
34

45

56
class EstateModel(models.Model):
@@ -45,7 +46,7 @@ class EstateModel(models.Model):
4546
help="Select the direction the garden faces",
4647
)
4748
property_type_id = fields.Many2one("estate.property.type")
48-
buyer = fields.Many2one("res.partner")
49+
buyer = fields.Many2one("res.partner", readonly=True)
4950
salesman = fields.Many2one("res.users")
5051
tag_ids = fields.Many2many("estate.property.tag")
5152
offer_ids = fields.One2many("estate.property.offer", inverse_name="property_id")
@@ -62,7 +63,6 @@ def _compute_best_price(self):
6263
for record in self:
6364
record.best_price = max(record.offer_ids.mapped("price"), default=0.0)
6465

65-
# the onchange method will access self which will hold the current form value object not all the value objects
6666
@api.onchange("garden")
6767
def _set_garden_default_values(self):
6868
if self.garden:
@@ -71,3 +71,13 @@ def _set_garden_default_values(self):
7171
else:
7272
self.garden_area = 0
7373
self.garden_orientation = ""
74+
75+
def action_property_sold(self):
76+
if self.state in ["Sold", "Cancelled"]:
77+
raise UserError(f"Property is already {self.state}")
78+
self.state = "Sold"
79+
80+
def action_property_cancelled(self):
81+
if self.state in ["Sold", "Cancelled"]:
82+
raise UserError(f"Property is already {self.state}")
83+
self.state = "Cancelled"

estate/models/estate_property_offer.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
from odoo import models, fields, api
21
from datetime import timedelta
2+
from odoo import api, fields, models
3+
from odoo.exceptions import UserError
34

45

56
class EstateOfferModel(models.Model):
@@ -29,3 +30,23 @@ def _inverse_date_deadline(self):
2930
if record.date_deadline
3031
else 0
3132
)
33+
34+
def action_offer_confirm(self):
35+
for record in self:
36+
if record.status in ["Accepted", "Refused"]:
37+
raise UserError(f"Offer is already {record.status}")
38+
39+
for offer in record.property_id.offer_ids:
40+
if offer.id == record.id:
41+
record.status = "Accepted"
42+
record.property_id.state = "Offer Accepted"
43+
record.property_id.buyer = record.partner_id
44+
record.property_id.selling_price = record.price
45+
else:
46+
offer.status = "Refused"
47+
48+
def action_offer_cancel(self):
49+
for record in self:
50+
if record.status in ["Accepted", "Refused"]:
51+
raise UserError(f"Offer is already {record.status}")
52+
record.status = "Refused"

estate/models/estate_property_tag.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from odoo import models, fields
1+
from odoo import fields, models
22

33

44
class EstateTagModel(models.Model):

estate/models/estate_property_type.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from odoo import models, fields
1+
from odoo import fields, models
22

33

44
class EstateTypeModel(models.Model):

estate/security/ir.model.access.csv

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,3 @@ access_estate_property_user,model_estate_property,model_estate_property,base.gro
33
access_estate_property_type_user,model_estate_property_type,model_estate_property_type,base.group_user,1,1,1,1
44
access_estate_property_tag_user,model_estate_property_tag,model_estate_property_tag,base.group_user,1,1,1,1
55
access_estate_property_offer_user,model_estate_property_offer,model_estate_property_offer,base.group_user,1,1,1,1
6-

estate/views/estate_menus.xml

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,13 @@
22

33
<odoo>
44
<menuitem id="estate_menu_root" name="Real Estate">
5-
65
<menuitem id="estate_advertisements_menu" name="Advertisements">
7-
<menuitem id="estate_property_adv_menu_action" action="action_estate_property"
8-
name="Property" />
6+
<menuitem id="estate_property_adv_menu_action" action="action_estate_property" name="Property" />
97
</menuitem>
10-
118
<menuitem id="estate_settings_menu" name="Settings">
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" />
9+
<menuitem id="estate_property_menu_action" action="action_estate_property" name="Property" />
10+
<menuitem id="estate_property_type_menu_action" action="action_estate_property_type" name="Property Types" />
11+
<menuitem id="estate_property_tag_menu_action" action="action_estate_property_tag" name="Property Tags" />
1812
</menuitem>
19-
2013
</menuitem>
21-
</odoo>
14+
</odoo>

estate/views/estate_property_offer_views.xml

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,19 @@
1111
</p>
1212
</field>
1313
</record>
14-
15-
<!-- list view -->
1614
<record id="list_view_estate_property_offer" model="ir.ui.view">
1715
<field name="name">Estate Properties Offer list</field>
1816
<field name="model">estate.property.offer</field>
1917
<field name="arch" type="xml">
2018
<list>
2119
<field name="price" string="Price" />
2220
<field name="partner_id" string="Partner" />
23-
<field name="status" string="Status" />
24-
<field name="date_deadline" string="Deadline" />
2521
<field name="validity" string="Validity" />
22+
<field name="date_deadline" string="Deadline" />
23+
<button name="action_offer_confirm" type="object" icon="fa-check" />
24+
<button name="action_offer_cancel" type="object" icon="fa-times" />
25+
<field name="status" string="Status" />
2626
</list>
2727
</field>
2828
</record>
29-
30-
</odoo>
29+
</odoo>

estate/views/estate_property_tag_views.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,4 @@
1111
</p>
1212
</field>
1313
</record>
14-
15-
</odoo>
14+
</odoo>

estate/views/estate_property_type_views.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,4 @@
1111
</p>
1212
</field>
1313
</record>
14-
15-
</odoo>
14+
</odoo>

0 commit comments

Comments
 (0)