Skip to content

Commit bd01dfa

Browse files
committed
[ADD] real_estate: estate: enhance UI with sprinkles improvements
- Added statusbar widget and inline list views for better usability. - Defined default ordering on estate models. - Improved views with decorations, options, and conditional behavior.
1 parent 63068b7 commit bd01dfa

9 files changed

+110
-32
lines changed

real_estate/models/real_estate_properties.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ class real_estate(models.Model):
3737
offer_ids = fields.One2many(
3838
"real.estate.property.offer", "property_id", string="Offers")
3939
total_area = fields.Float(compute="_compute_total", store=True)
40-
total_area_square = fields.Float(compute="_compute_total_area_square", store=True)
4140
best_price = fields.Float(
4241
string="Best Offer",
4342
compute="_compute_best_price",
@@ -96,11 +95,6 @@ def _compute_total(self):
9695
for record in self:
9796
record.total_area = (record.living_area or 0) + (record.garden_area or 0)
9897

99-
@api.depends("total_area")
100-
def _compute_total_area_square(self):
101-
for record in self:
102-
record.total_area_square = (record.total_area or 0) ** 2
103-
10498
@api.onchange('garden')
10599
def _onchange_garden(self):
106100
if self.garden:
@@ -111,10 +105,12 @@ def _onchange_garden(self):
111105
self.garden_orientation = False
112106

113107
@api.ondelete(at_uninstall=False)
114-
def _unlink_if_accepted_offer(self):
115-
accepted_offer = self.offer_ids.filtered_domain([('status', '=', 'accepted')])
116-
if accepted_offer:
117-
raise UserError("Can't delete an active record!")
108+
def _check_property_delete(self):
109+
for record in self:
110+
if record.stage not in ('new', 'cancelled'):
111+
raise UserError(
112+
"You can only delete properties in New or Cancelled state."
113+
)
118114

119115
# @api.depends('create_date')
120116
# def _compute_create_date_ist(self):

real_estate/models/real_estate_properties_maintenance_request.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ class real_estate_properties_maintenance_request(models.Model):
1919
@api.onchange('status')
2020
def _check_cost_on_accepted_status(self):
2121
if self.status == 'approved' and self.cost <= 0:
22-
raise UserError(" Maintenance Request Approved cost must be greater than 0")
22+
raise UserError("Approved cost must be greater than 0")
2323

2424
@api.ondelete(at_uninstall=False)
2525
def _unlink_if_maintenance_request_not_done(self):
2626
maintenace_request = self.filtered_domain([('status', '!=', 'done')])
2727
if maintenace_request:
28-
raise UserError("Can't delete an active Maintenance Request Record.")
28+
raise UserError("Can't delete an active Maintenance Request Record!")

real_estate/models/real_estate_property_offer.py

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,14 @@
77
class real_estate_property_offer(models.Model):
88
_name = 'real.estate.property.offer'
99
_description = 'Real Estate Property Offer'
10+
_order = "price desc"
1011

1112
price = fields.Float(required=True)
12-
property_id = fields.Many2one('real.estate', string='Property', ondelete='cascade')
13+
property_id = fields.Many2one('real.estate', string='Property', ondelete='restrict')
14+
property_type_id = fields.Many2one(
15+
related="property_id.property_type_id",
16+
store=True
17+
)
1318
status = fields.Selection([
1419
('accepted', 'Accepted'),
1520
('refused', 'Refused'),
@@ -27,6 +32,23 @@ class real_estate_property_offer(models.Model):
2732
'The offer price must be strictly positive.',
2833
)
2934

35+
@api.model
36+
def create(self, vals):
37+
# property_id = vals.get('property_id')
38+
# price = vals.get('price')
39+
# if property_id and price:
40+
# property_rec = self.env['estate.property'].browse(property_id)
41+
# if property_rec.offer_ids:
42+
# max_offer = max(property_rec.offer_ids.mapped('price'))
43+
# if price < max_offer:
44+
# raise UserError(
45+
# "The offer must be higher than existing offers."
46+
# )
47+
offer = super().create(vals)
48+
if offer.property_id and offer.property_id.stage == 'new':
49+
offer.property_id.stage = 'offer_received'
50+
return offer
51+
3052
@api.depends('create_date', 'validity')
3153
def _compute_date_deadline(self):
3254
for offer in self:
@@ -40,6 +62,12 @@ def _inverse_date_deadline(self):
4062
if offer.create_date and offer.date_deadline:
4163
offer.validity = (offer.date_deadline - offer.create_date.date()).days
4264

65+
@api.ondelete(at_uninstall=False)
66+
def _unlink_if_accepted_offer(self):
67+
accepted_offer = self.filtered_domain([('status', '=', 'accepted')])
68+
if accepted_offer:
69+
raise UserError("Can't delete an active record!")
70+
4371
def action_accept(self):
4472
# accepted_offer = self.search([
4573
# ('property_id', '=', self.property_id.id),
@@ -51,14 +79,24 @@ def action_accept(self):
5179
accepted_offer = self.property_id.offer_ids.filtered_domain([
5280
('status', '=', 'accepted')
5381
])
82+
maintenace_request = self.property_id.maintenance_request_ids.filtered_domain([('status', '!=', 'done')])
5483
if accepted_offer:
5584
raise UserError(
56-
"Only one offer can be accepted for a property."
57-
)
85+
"Only one offer can be accepted for a property.")
86+
if maintenace_request:
87+
raise UserError("Property cannot be sold , there is any maintenance request not done")
5888
self.status = 'accepted'
59-
self.property_id.selling_price = self.price
60-
self.property_id.stage = 'sold'
61-
self.property_id.buyer_id = self.partner_id.id
89+
self.property_id.write({
90+
'selling_price': self.price,
91+
'stage': 'sold',
92+
'buyer_id': self.partner_id.id,
93+
})
94+
refused_offer = self.property_id.offer_ids.filtered_domain([
95+
('id', '!=', 'self.id'),
96+
('status', '!=', 'accepted')
97+
])
98+
for refuse in refused_offer:
99+
refuse.status = 'refused'
62100

63101
def action_refuse(self):
64102
self.status = 'refused'

real_estate/models/real_estate_property_type.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,28 @@
44
class RealEstateTag(models.Model):
55
_name = 'real.estate.property.type'
66
_description = 'Real Estate Property Type'
7+
_order = "sequence, name desc"
78

89
name = fields.Char(required=True)
10+
sequence = fields.Integer(string="Sequence", default=10)
911
property_ids = fields.One2many(
1012
'real.estate',
1113
'property_type_id',
1214
string='Properties'
1315
)
16+
offer_ids = fields.One2many(
17+
"real.estate.property.offer",
18+
"property_type_id",
19+
string="Offers"
20+
)
1421
_unique_type_name = models.Constraint(
1522
'UNIQUE(name)',
1623
'The property type name must be unique.',
1724
)
25+
offer_count = fields.Integer(
26+
compute="_compute_offer_count"
27+
)
28+
29+
def _compute_offer_count(self):
30+
for record in self:
31+
record.offer_count = len(record.offer_ids)

real_estate/models/real_estate_tag.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1+
from random import randint
2+
13
from odoo import fields, models
24

35

46
class RealEstateTag(models.Model):
57
_name = 'real.estate.tag'
68
_description = 'Real Estate Tag'
9+
_order = "name desc"
10+
11+
def _get_default_color(self):
12+
return randint(1, 11)
713

814
name = fields.Char(required=True)
15+
color = fields.Integer(default=_get_default_color)
916
_unique_tag_name = models.Constraint(
1017
'UNIQUE(name)',
1118
'The property tag name must be unique.',

real_estate/views/real_estate_properties_offer_views.xml

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,25 @@
44
<field name="name">real.estate.property.offer.view.tree</field>
55
<field name="model">real.estate.property.offer</field>
66
<field name="arch" type="xml">
7-
<list>
7+
<list decoration-danger="status == 'refused'"
8+
decoration-success="status == 'accepted'">
89
<field name="price"/>
910
<field name="partner_id"/>
1011
<field name="validity"/>
1112
<field name="date_deadline"/>
1213
<button
13-
name="action_accept"
14-
type="object"
15-
icon="fa-check"
16-
title="accept"
17-
invisible="status == 'refused'"
14+
name="action_accept"
15+
type="object"
16+
icon="fa-check"
17+
title="accept"
18+
invisible="status == 'refused'"
1819
/>
1920
<button
20-
name="action_refuse"
21-
type="object"
22-
icon="fa-times"
23-
title="refused"
24-
invisible="status == 'accepted'"
21+
name="action_refuse"
22+
type="object"
23+
icon="fa-times"
24+
title="refused"
25+
invisible="status == 'refused'"
2526
/>
2627
<field name="status" readonly="1"/>
2728
</list>
@@ -39,6 +40,7 @@
3940
<field name="partner_id"/>
4041
<field name="status"/>
4142
<field name="property_id"/>
43+
<field name="property_type_id"/>
4244
<field name="validity"/>
4345
<field name="date_deadline"/>
4446
</group>
@@ -53,4 +55,11 @@
5355
<field name="view_mode">list,form</field>
5456
</record>
5557

58+
<record id="real_estate_property_offer_action_view_state_button" model="ir.actions.act_window">
59+
<field name="name">Property Offer</field>
60+
<field name="res_model">real.estate.property.offer</field>
61+
<field name="view_mode">list</field>
62+
<field name="domain">[('property_type_id', '=', active_id)]</field>
63+
</record>
64+
5665
</odoo>

real_estate/views/real_estate_properties_views.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@
7575
<group string="Area Details">
7676
<field name="living_area"/>
7777
<field name="total_area"/>
78-
<field name="total_area_square"/>
7978
</group>
8079
<group string="Interior Details">
8180
<field name="bedrooms"/>
@@ -140,7 +139,7 @@
140139
string="Garden orientation"
141140
name="name"
142141
domain="['|',('garden_orientation', '=' , 'north'),
143-
('garden_orientation', '=' , 'south')]"
142+
('garden_orientation', '=' , 'south')]"
144143
/>
145144
<group>
146145
<filter

real_estate/views/real_estate_property_type.xml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<field name="arch" type="xml">
77
<list>
88
<field name="name"/>
9+
<field name="sequence" widget="handle"/>
910
</list>
1011
</field>
1112
</record>
@@ -16,14 +17,25 @@
1617
<field name="arch" type="xml">
1718
<form>
1819
<sheet>
20+
<div class="oe_button_box" name="button_box">
21+
<button name="%(real_estate_property_offer_action_view_state_button)d"
22+
type="action"
23+
icon="fa-tag">
24+
<div class="o_form_field o_stat_info">
25+
<span class="o_stat_value">
26+
<field name="offer_count" string="Offers" widget="statinfo"/>
27+
</span>
28+
</div>
29+
</button>
30+
</div>
1931
<group>
2032
<field name="name"/>
2133
</group>
2234
<notebook>
2335
<page string="Property Details">
2436
<group>
2537
<field name="property_ids">
26-
<list editable="bottom">
38+
<list editable="bottom" default_order="expected_price desc">
2739
<field name="name"/>
2840
<field name="expected_price"/>
2941
<field name="stage"/>

real_estate/views/real_estate_tag_views.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<field name="arch" type="xml">
77
<list>
88
<field name="name"/>
9+
<field name="color"/>
910
</list>
1011
</field>
1112
</record>
@@ -18,11 +19,13 @@
1819
<sheet>
1920
<group>
2021
<field name="name"/>
22+
<field name="color" widget="color_picker"/>
2123
</group>
2224
</sheet>
2325
</form>
2426
</field>
2527
</record>
28+
2629
<record id="real_estate_tag_action_view" model="ir.actions.act_window">
2730
<field name="name">Property Tag</field>
2831
<field name="res_model">real.estate.tag</field>

0 commit comments

Comments
 (0)