Skip to content

Commit 1f41720

Browse files
committed
[IMP] estate: validation, computed fields and onchanges in fields
Added buttons for offer status Added buttons for Property status Added action for those buttons Demonstrated computed fields and onchanges fields Raised UserError exceptions for particular conditions
1 parent c41f21d commit 1f41720

File tree

4 files changed

+100
-15
lines changed

4 files changed

+100
-15
lines changed

estate/models/estate_property.py

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Part of Odoo. See LICENSE file for full copyright and licensing details.
22

33
from datetime import datetime, timedelta
4-
from odoo import models, fields
4+
from odoo import api, models, fields, exceptions
55

66

77
class EstateProperty(models.Model):
@@ -37,13 +37,52 @@ class EstateProperty(models.Model):
3737
required=True,
3838
selection=[
3939
('new', 'New'),
40-
('offer_recieved', 'Offer Received'),
40+
('offer_received', 'Offer Received'),
4141
('offer_accepted', 'Offer Accepted'),
42-
('sold_and_cancelled', 'Sold and Cancelled')
42+
('sold', 'Sold'),
43+
('cancel', 'Cancelled')
4344
],
4445
help='State of the property')
4546
property_type_id = fields.Many2one('estate.property.type', string='Property Type Id')
46-
buyer_id = fields.Many2one('res.users', string='Buyer', copy=False)
47-
salesman_id = fields.Many2one('res.partner', string='Salesman', default=lambda self: self.env.user)
47+
buyer_id = fields.Many2one('res.partner', string='Buyer', copy=False)
48+
salesman_id = fields.Many2one('res.users', string='Salesman', default=lambda self: self.env.user)
4849
tag_ids = fields.Many2many('estate.property.tag', string='Estate property Tag')
4950
offer_ids = fields.One2many('estate.property.offer', 'property_id', string='offer')
51+
total_area = fields.Float(compute="_compute_total_area")
52+
best_price = fields.Float(compute='_compute_best_price', string='Best Offer Price')
53+
54+
@api.depends('living_area', 'garden_area')
55+
def _compute_total_area(self):
56+
for record in self:
57+
record.total_area = record.garden_area + record.living_area
58+
59+
@api.depends('offer_ids.price')
60+
def _compute_best_price(self):
61+
for record in self:
62+
record.best_price = max(record.offer_ids.mapped('price'), default=0.0)
63+
64+
@api.onchange('garden')
65+
def _on_change_garden(self):
66+
for record in self:
67+
if self.garden:
68+
record.garden_area = 10
69+
record.garden_orientation = 'north'
70+
else:
71+
record.garden_area = False
72+
record.garden_orientation = False
73+
74+
def property_sold_action(self):
75+
for record in self:
76+
if record.state == 'cancel':
77+
raise exceptions.UserError('Cancelled property can not be sold')
78+
else:
79+
record.state = 'sold'
80+
return True
81+
82+
def property_cancel_action(self):
83+
for record in self:
84+
if record.state == 'sold':
85+
raise exceptions.UserError('Sold property can not be cancelled')
86+
else:
87+
record.state = 'cancel'
88+
return True
Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Part of Odoo. See LICENSE file for full copyright and licensing details.
22

3-
from odoo import fields, models
3+
from datetime import timedelta
4+
from odoo import api, fields, models
45

56

67
class EstatePropertyOffer(models.Model):
@@ -9,11 +10,41 @@ class EstatePropertyOffer(models.Model):
910

1011
price = fields.Float(string='Offer Price')
1112
status = fields.Selection(
12-
string='Status Of Offer',
13+
string='Status',
1314
copy=False,
1415
selection=[
1516
('accepted', 'Accepted'),
1617
('refused', 'Refused')
1718
])
1819
partner_id = fields.Many2one('res.partner', required=True)
1920
property_id = fields.Many2one('estate.property', required=True)
21+
created_date = fields.Date(default=fields.Date.context_today, string="Created Date")
22+
validity = fields.Integer(default=7, string="Validity (Days)")
23+
date_deadline = fields.Date(compute="_compute_date_deadline", inverse="_inverse_date_deadline", string="Deadline Date", store="True")
24+
25+
@api.depends('created_date', 'validity')
26+
def _compute_date_deadline(self):
27+
for record in self:
28+
if record.created_date and record.validity:
29+
record.date_deadline = record.created_date + timedelta(days=record.validity)
30+
else:
31+
record.date_deadline = False
32+
33+
def _inverse_date_deadline(self):
34+
for record in self:
35+
if record.date_deadline and record.created_date:
36+
record.validity = (record.date_deadline - record.created_date).days
37+
else:
38+
record.validity = 0
39+
40+
def offer_accepted_action(self):
41+
for record in self:
42+
record.status = 'accepted'
43+
record.property_id.buyer_id = record.partner_id
44+
record.property_id.selling_price = record.price
45+
return True
46+
47+
def offer_refused_action(self):
48+
for record in self:
49+
record.status = 'refused'
50+
return True

estate/views/estate_property_offer_views.xml

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@
77
<field name="model">estate.property.offer</field>
88
<field name="arch" type="xml">
99
<list>
10-
<field name="price" />
11-
<field name="partner_id" />
10+
<field name="price" string="Price" />
11+
<field name="partner_id" string="Partner" />
12+
<field name="validity" string="Validity (days)" />
13+
<field name="date_deadline" string="Deadline" />
14+
<button string="" name="offer_accepted_action" type="object" icon="fa-check"/>
15+
<button string="" name="offer_refused_action" type="object" icon="fa-times"/>
1216
<field name="status" />
1317
</list>
1418
</field>
1519
</record>
16-
20+
1721
<!-- Form View -->
1822
<record id="estate_property_offer_view_form" model="ir.ui.view">
1923
<field name="name">estate.property.offer.form</field>
@@ -22,13 +26,16 @@
2226
<form string="Offer Price Form">
2327
<sheet>
2428
<group>
25-
<field name="price" string="Offer Price" />
29+
<field name="price" string="Price" />
2630
<field name="status" string="Offer Status" />
27-
<field name="partner_id" string="Offer Partner" />
31+
<field name="partner_id" string="Partner" />
32+
<field name="validity" string="Validity (days) " />
33+
<field name="date_deadline" string="Deadline" />
34+
<field name="status" />
2835
</group>
2936
</sheet>
3037
</form>
3138
</field>
3239
</record>
3340

34-
</odoo>
41+
</odoo>

estate/views/estate_property_views.xml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@
3333
<field name="model">estate.property</field>
3434
<field name="arch" type="xml">
3535
<form string="Estate Property Form">
36+
<header>
37+
<button string="Cancel" name="property_cancel_action" type="object" class="oe_highlight"/>
38+
<button string="Sold" name="property_sold_action" type="object" class="oe_highlight"/>
39+
</header>
3640
<sheet>
3741
<div>
3842
<h1>
@@ -41,15 +45,18 @@
4145
</h1>
4246
<field name="tag_ids" string="Property Tags" widget="many2many_tags" />
4347
</div>
48+
<br />
4449
<group>
4550
<group>
51+
<field name="state" string="State"/>
4652
<field name="property_type_id" string="Property Type" />
4753
<field name="postcode" string="Postcode" />
4854
<field name="date_availability" string="Available from" />
4955
</group>
5056
<group>
5157
<field name="expected_price" string="Expected Price" />
5258
<field name="selling_price" string="Selling Price" />
59+
<field name="best_price" string="Best Price" />
5360
</group>
5461
</group>
5562
<notebook>
@@ -64,6 +71,7 @@
6471
<field name="garden_area" string="Garden Area (sqm)" />
6572
<field name="garden_orientation" string="Garden orientation" />
6673
<field name="state" string="Current state" />
74+
<field name="total_area" string="Total Area (sqm)" />
6775
</group>
6876
</page>
6977
<page string="Offers">
@@ -72,8 +80,8 @@
7280
</page>
7381
<page string="Page Info">
7482
<group>
75-
<field name="buyer_id" string="Buyer" />
7683
<field name="salesman_id" string="Salesman" />
84+
<field name="buyer_id" string="Buyer" />
7785
</group>
7886
</page>
7987
</notebook>
@@ -96,7 +104,7 @@
96104
<field name="facades" string="Facades" />
97105
<separator />
98106
<filter string="Available" name="state"
99-
domain="[('state', 'in', ['new', 'offer_recieved'])]" />
107+
domain="[('state', 'in', ['new', 'offer_received'])]" />
100108
<filter name="postcode" string="Postcode" context="{'group_by': 'postcode'}" />
101109
</search>
102110
</field>

0 commit comments

Comments
 (0)