Skip to content

Commit 1d0c31f

Browse files
committed
[IMP] estate: added constrains and made changes in all views
Added the following constraints to their corresponding models: A property expected price must be strictly positive A property selling price must be positive An offer price must be strictly positive A property tag name and property type name must be unique Added a python constraint so that the selling price cannot be lower than 90% of the expected price. Used the statusbar widget in order to display the state of the estate.property Added ordering to each model as per requirement. Added manual ordering to property type field. Added widget options to color the tag. Added conditional display of buttons Using the invisible attribute Made property tag and offers list view editable Made the field date_availability on the estate.property list view optional and hidden by default Added conditional decoration to property and offer list view. Added availability to the default search filter Added a stat button to the property type to view offers for each property. Added kanban view to the estate property
1 parent d7bc586 commit 1d0c31f

18 files changed

+151
-47
lines changed

estate/__manifest__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@
1414
'data': [
1515
'security/ir.model.access.csv',
1616
'views/estate_property_views.xml',
17+
'views/estate_property_offer_views.xml',
1718
'views/estate_property_type_views.xml',
1819
'views/estate_property_tag_views.xml',
19-
'views/estate_property_offer_views.xml',
20+
'views/estate_res_user_views.xml',
2021
'views/estate_menus.xml',
2122
]
2223

23-
}
24+
}

estate/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
from . import estate_property_type
33
from . import estate_property_tag
44
from . import estate_property_offer
5+
from . import estate_res_user

estate/models/estate_property.py

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ class EstateProperty(models.Model):
77
_name = "estate.property"
88
_description = "Details of all the properties will be stored over here."
99
_order = "id desc"
10-
11-
12-
name = fields.Char('Name', required=True,default='Unknown Property')
10+
name = fields.Char('Name', required=True, default='Unknown Property')
1311
description = fields.Text('Description')
1412
postcode = fields.Char('Postcode')
1513
date_availability = fields.Date(
@@ -41,18 +39,6 @@ class EstateProperty(models.Model):
4139
offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers")
4240
total_area = fields.Float(compute="_compute_total_area", string="Total Area", readonly=True)
4341
best_price = fields.Float(compute="_compute_best_price", string="Best Price", readonly=True)
44-
state = fields.Selection(
45-
string="State",
46-
selection=[
47-
("new", "New"),
48-
("offer_received", "Offer Received"),
49-
("offer_accepted", "Offer Accepted"),
50-
("sold", "Sold"),
51-
("canceled", "Canceled"),
52-
],
53-
default="new",
54-
copy=False,
55-
)
5642

5743
_sql_constraints = [
5844
('check_expected_price', 'CHECK(expected_price > 0)', 'The expected price must strictly Positive.'),
@@ -82,6 +68,7 @@ def _onchange_garden(self):
8268
def action_sold(self):
8369
if self.state != "canceled":
8470
self.state = "sold"
71+
print("Log by KDES", flush=True)
8572
else:
8673
raise UserError("Canceled properties can't be sold")
8774
return True
@@ -103,3 +90,7 @@ def _check_price(self):
10390
if float_utils.float_compare(record.selling_price, record.expected_price * 0.9, precision_rounding=3) == -1:
10491
raise ValidationError(_('The selling cannot be lower than 90% of the expected price.'))
10592

93+
@api.ondelete(at_uninstall=False)
94+
def _unlink_if_state_check(self):
95+
if any(record.state not in ('new', 'canceled') for record in self):
96+
raise UserError(_("You cannot delete a property that is not in the 'New' or 'Canceled' state."))

estate/models/estate_property_offer.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from odoo import api, fields, models, api
1+
from odoo import api, fields, models, _
22
from odoo.exceptions import UserError
33

44

@@ -23,7 +23,7 @@ class EstatePropertyOffer(models.Model):
2323
_sql_constraints = [
2424
("check_price", "CHECK(price > 0)", "The price must be strictly positive.")
2525
]
26-
26+
2727
@api.depends("validity")
2828
def _compute_date_deadline(self):
2929
for record in self:
@@ -39,15 +39,6 @@ def _inverse_date_deadline(self):
3939
for record in self:
4040
record.validity = (record.date_deadline - record.create_date.date()).days
4141

42-
def action_accept_offer(self):
43-
self.ensure_one()
44-
self.status = "accepted"
45-
self.property_id.selling_price = self.price
46-
self.property_id.buyer_id = self.partner_id
47-
self.property_id.state = "offer_accepted"
48-
return True
49-
50-
5142
def action_accept_offer(self):
5243
if self.property_id.state in {'accepted', 'sold'}:
5344
raise UserError(_('An offer as already been accepted.'))
@@ -63,3 +54,12 @@ def action_refuse_offer(self):
6354
self.ensure_one()
6455
self.status = "refused"
6556
return True
57+
58+
@api.model_create_multi
59+
def create(self, vals_list):
60+
for vals in vals_list:
61+
property = self.env["estate.property"].browse(vals["property_id"])
62+
property.state = "offer_received"
63+
if property.best_price > vals["price"]:
64+
raise UserError("The offer must be higher than the existing offer")
65+
return super().create(vals_list)

estate/models/estate_property_tag.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ class EstatePropertyTag(models.Model):
1111

1212
_sql_constraints = [
1313
('check_name', 'UNIQUE(name)', 'A tag must be unique.'),
14-
]
14+
]

estate/models/estate_property_type.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
from odoo import models, fields, api
22

3+
34
class EstatePropertyType(models.Model):
45
_name = "estate.property.type"
56
_description = "Types of properties available in the estate module."
67
_order = "name"
78

8-
9-
109
name = fields.Char('Name', required=True)
1110
property_ids = fields.One2many("estate.property", "property_type_id", string="Property")
1211
sequence = fields.Integer("Sequence", default=1, help="Used to order types. Lower is better.")
@@ -20,4 +19,4 @@ class EstatePropertyType(models.Model):
2019
@api.depends('offer_ids')
2120
def compute_offer_count(self):
2221
for record in self:
23-
record.offer_count = len(record.offer_ids)
22+
record.offer_count = len(record.offer_ids)

estate/models/estate_res_user.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from odoo import fields, models
2+
3+
4+
class User(models.Model):
5+
_inherit = "res.users"
6+
7+
property_ids = fields.One2many("estate.property", inverse_name="salesperson_id")
8+
domain = ["|", ("state", "=", "new"), ("state", "=", "offer_received")]

estate/views/estate_menus.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@
2626
name="Properties Tags"
2727
parent="menu_estate_settings"
2828
action="action_estate_property_tag"/>
29-
</odoo>
29+
</odoo>

estate/views/estate_property_offer_views.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,4 @@
4141
</form>
4242
</field>
4343
</record>
44-
</odoo>
44+
</odoo>

estate/views/estate_property_tag_views.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@
2929
</form>
3030
</field>
3131
</record>
32-
</odoo>
32+
</odoo>

0 commit comments

Comments
 (0)