Skip to content

Commit 1d2d753

Browse files
committed
[IMP] estate : add statusbar, helper text and refined sold constrains
- status will not change to sold/cancelled unless an offer is accepted. - helper text added to visibility field. - state field is added at the header of form view.
1 parent 5782473 commit 1d2d753

7 files changed

+78
-30
lines changed

estate/models/estate_property.py

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
class EstateModel(models.Model):
88
_name = "estate.property"
99
_description = "Real Estate Advertisement Model"
10+
_order = "id desc"
1011

1112
name = fields.Char(required=True)
1213
description = fields.Text()
@@ -25,15 +26,15 @@ class EstateModel(models.Model):
2526
garden_area = fields.Integer()
2627
state = fields.Selection(
2728
string="state",
28-
default="New",
29+
default="new",
2930
required=True,
3031
copy=False,
3132
selection=[
32-
("New", "New"),
33-
("Offer Received", "Offer Received"),
34-
("Offer Accepted", "Offer Accepted"),
35-
("Sold", "Sold"),
36-
("Cancelled", "Cancelled"),
33+
("new", "New"),
34+
("offer_received", "Offer Received"),
35+
("offer_accepted", "Offer Accepted"),
36+
("sold", "Sold"),
37+
("cancelled", "Cancelled"),
3738
],
3839
)
3940
garden_orientation = fields.Selection(
@@ -51,8 +52,8 @@ class EstateModel(models.Model):
5152
salesman = fields.Many2one("res.users")
5253
tag_ids = fields.Many2many("estate.property.tag")
5354
offer_ids = fields.One2many("estate.property.offer", inverse_name="property_id")
54-
total_area = fields.Float(compute="_compute_total_area")
55-
best_price = fields.Float(compute="_compute_best_price")
55+
total_area = fields.Float(compute="_compute_total_area", store=True)
56+
best_price = fields.Float(compute="_compute_best_price", store=True)
5657

5758
_sql_constraints = [
5859
(
@@ -97,18 +98,20 @@ def _compute_best_price(self):
9798
@api.onchange("garden")
9899
def _set_garden_default_values(self):
99100
if self.garden:
100-
self.garden_area = 10
101-
self.garden_orientation = "north"
101+
self.write({"garden_area": 10, "garden_orientation": "north"})
102102
else:
103-
self.garden_area = 0
104-
self.garden_orientation = ""
103+
self.write({"garden_area": 0, "garden_orientation": ""})
105104

106105
def action_property_sold(self):
107-
if self.state in ["Sold", "Cancelled"]:
106+
if self.state in ["sold", "cancelled"]:
108107
raise UserError(f"Property is already {self.state}")
109-
self.state = "Sold"
108+
if float_is_zero(self.selling_price, precision_rounding=0.01):
109+
raise UserError(
110+
"Atleast one offer must be accepted before selling the property"
111+
)
112+
self.state = "sold"
110113

111114
def action_property_cancelled(self):
112-
if self.state in ["Sold", "Cancelled"]:
115+
if self.state in ["sold", "cancelled"]:
113116
raise UserError(f"Property is already {self.state}")
114-
self.state = "Cancelled"
117+
self.state = "cancelled"

estate/models/estate_property_offer.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,18 @@
66
class EstateOfferModel(models.Model):
77
_name = "estate.property.offer"
88
_description = "Real Estate Property Offer Model"
9+
_order = "price desc"
910

1011
price = fields.Float()
1112
status = fields.Selection(
12-
[("Accepted", "Accepted"), ("Refused", "Refused")], copy=False
13+
[("accepted", "Accepted"), ("refused", "Refused")], copy=False
1314
)
1415
partner_id = fields.Many2one("res.partner", required=True)
1516
property_id = fields.Many2one("estate.property", required=True)
16-
validity = fields.Integer(default=7)
17+
validity = fields.Integer(
18+
default=7,
19+
help="offer validity period in days; the offer will be automatically refused when this expires.",
20+
)
1721
date_deadline = fields.Date(default=fields.Date.today() + timedelta(days=7))
1822

1923
_sql_constraints = [
@@ -41,20 +45,24 @@ def _inverse_date_deadline(self):
4145

4246
def action_offer_confirm(self):
4347
for record in self:
44-
if record.status in ["Accepted", "Refused"]:
48+
if record.status in ["accepted", "refused"]:
4549
raise UserError(f"Offer is already {record.status}")
46-
50+
# breakpoint()
4751
for offer in record.property_id.offer_ids:
4852
if offer.id == record.id:
49-
record.status = "Accepted"
50-
record.property_id.state = "Offer Accepted"
51-
record.property_id.buyer = record.partner_id
52-
record.property_id.selling_price = record.price
53+
record.status = "accepted"
54+
record.property_id.write(
55+
{
56+
"state": "offer_accepted",
57+
"buyer": record.partner_id,
58+
"selling_price": record.price,
59+
}
60+
)
5361
else:
54-
offer.status = "Refused"
62+
offer.status = "refused"
5563

5664
def action_offer_cancel(self):
5765
for record in self:
58-
if record.status in ["Accepted", "Refused"]:
66+
if record.status in ["accepted", "refused"]:
5967
raise UserError(f"Offer is already {record.status}")
60-
record.status = "Refused"
68+
record.status = "refused"

estate/models/estate_property_tag.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
class EstateTagModel(models.Model):
55
_name = "estate.property.tag"
66
_description = "Real Estate Property Tag Model"
7+
_order = "name"
78

89
name = fields.Char(required=True)
910

estate/models/estate_property_type.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
class EstateTypeModel(models.Model):
55
_name = "estate.property.type"
66
_description = "Real Estate Property Type Model"
7+
_order = "name"
78

89
name = fields.Char(required=True)
10+
property_ids = fields.One2many("estate.property", "property_type_id")
11+
sequence = fields.Integer("Sequence", default=1, help="Used to change the sequence of Property Types")
912

1013
_sql_constraints = [
1114
(

estate/views/estate_property_offer_views.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
<field name="partner_id" string="Partner" />
2121
<field name="validity" string="Validity" />
2222
<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" />
23+
<button name="action_offer_confirm" type="object" icon="fa-check" invisible="status == 'refused'" />
24+
<button name="action_offer_cancel" type="object" icon="fa-times" invisible="status == 'refused'" />
2525
<field name="status" string="Status" />
2626
</list>
2727
</field>

estate/views/estate_property_type_views.xml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
11
<?xml version="1.0"?>
22

33
<odoo>
4+
5+
<record id="estate_property_type_view_list" model="ir.ui.view">
6+
<field name="name">estate.property.type.view.list</field>
7+
<field name="model">estate.property.type</field>
8+
<field name="arch" type="xml">
9+
<list name="estate_property_type_list" string="Estate Property Type">
10+
<field name="sequence" widget="handle" />
11+
<field name="name"></field>
12+
</list>
13+
</field>
14+
</record>
415
<record id="action_estate_property_type" model="ir.actions.act_window">
516
<field name="name">Property Types</field>
617
<field name="res_model">estate.property.type</field>
@@ -11,4 +22,25 @@
1122
</p>
1223
</field>
1324
</record>
25+
<record id="action_estate_property_type_form" model="ir.ui.view">
26+
<field name="name">Properties by Types</field>
27+
<field name="model">estate.property.type</field>
28+
<field name="arch" type="xml">
29+
<form>
30+
<sheet>
31+
<notebook>
32+
<page name="properties" string="Properties">
33+
<field name="property_ids">
34+
<list>
35+
<field name="name" string="Title" />
36+
<field name="expected_price" string="Expected Price" />
37+
<field name="state" string="State" />
38+
</list>
39+
</field>
40+
</page>
41+
</notebook>
42+
</sheet>
43+
</form>
44+
</field>
45+
</record>
1446
</odoo>

estate/views/estate_property_views.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
<header>
3535
<button name="action_property_sold" type="object" string="Sold"/>
3636
<button name="action_property_cancelled" type="object" string="Cancelled"/>
37+
<field name="state" widget="statusbar" statusbar_visible="new,offer_received,offer_accepted,sold" />
3738
</header>
3839
<sheet>
3940
<div>
@@ -98,7 +99,7 @@
9899
<field name="bedrooms" string="Bedrooms" />
99100
<field name="living_area" string="Living Area (sqm)" />
100101
<field name="facades" string="Facades" />
101-
<filter string="Available" name="state" domain="['|', ('state', '=', 'New'), ('state', '=', 'Offer Received')]"/>
102+
<filter string="Available" name="state" domain="['|', ('state', '=', 'new'), ('state', '=', 'offer_received')]"/>
102103
<group>
103104
<filter string="Postcode" name="postcode" context="{'group_by': 'postcode'}"/>
104105
</group>

0 commit comments

Comments
 (0)