Skip to content

Commit 155c627

Browse files
committed
[IMP] estate: add compute and on change field and add object type action
compute field like total area best offer add validate and deadline fields with computation add object type action on sold and cancel button and buyer field add accept and refuse button in offer form
1 parent d0ab7e7 commit 155c627

File tree

7 files changed

+132
-28
lines changed

7 files changed

+132
-28
lines changed

estate/__manifest__.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
'views/estate_property_views.xml',
88
'views/estate_menus.xml',
99
'views/estate_property_type_views.xml',
10-
'views/estate_property_tag_views.xml'
11-
]
10+
'views/estate_property_tag_views.xml',
11+
'views/estate_property_offer_views.xml'
12+
],
13+
'application': True,
14+
'installable': True
1215
}

estate/models/estate_property.py

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
from odoo import models, fields
1+
from odoo import models, fields, api
22
from dateutil.relativedelta import relativedelta
3+
from odoo.exceptions import UserError
34

45

56
class EstateProperty(models.Model):
@@ -13,11 +14,11 @@ class EstateProperty(models.Model):
1314
expected_price = fields.Float(required=True)
1415
selling_price = fields.Float(readonly=True, copy=False)
1516
bedrooms = fields.Integer(default=2)
16-
living_area = fields.Integer(string="Living Area (sqm)")
17+
living_area = fields.Float(string="Living Area (sqm)")
1718
facades = fields.Integer()
1819
garage = fields.Boolean()
1920
garden = fields.Boolean()
20-
garden_area = fields.Integer(string="Garden Area (sqm)")
21+
garden_area = fields.Float(string="Garden Area (sqm)")
2122
garden_orientation = fields.Selection(
2223
string="Garden Orientation",
2324
selection=[('north', 'North'),
@@ -38,6 +39,45 @@ class EstateProperty(models.Model):
3839
)
3940
property_type_id = fields.Many2one("estate.property.type")
4041
buyer = fields.Many2one("res.partner", copy=False)
41-
salesperson = fields.Many2one("res.users")
42+
salesperson = fields.Many2one("res.users", default=lambda self: self.env.user)
4243
tag_ids = fields.Many2many("estate.property.tag")
4344
offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers")
45+
46+
total_area = fields.Float(compute="_compute_total_area")
47+
@api.depends('living_area', 'garden_area')
48+
def _compute_total_area(self):
49+
for record in self:
50+
record.total_area = record.living_area + record.garden_area
51+
52+
best_offer = fields.Float(compute="_compute_best_offer")
53+
@api.depends('offer_ids.price')
54+
def _compute_best_offer(self):
55+
for record in self:
56+
if not record.mapped('offer_ids.price'):
57+
record.best_offer = 0
58+
else:
59+
record.best_offer = max(record.mapped('offer_ids.price'))
60+
61+
@api.onchange('garden')
62+
def _onchange_garden(self):
63+
if self.garden:
64+
self.garden_area = 10
65+
self.garden_orientation = 'north'
66+
else:
67+
self.garden_area = 0
68+
self.garden_orientation = None
69+
70+
def cancel_property(self):
71+
for record in self:
72+
if record.state == 'sold':
73+
raise UserError("sold property cannot be cancelled.")
74+
else:
75+
record.state = 'cancelled'
76+
77+
def sold_property(self):
78+
for record in self:
79+
if record.state == 'cancelled':
80+
raise UserError("cancelled property cannot be sold.")
81+
else:
82+
record.state = 'sold'
83+

estate/models/estate_property_offer.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
from odoo import models,fields
1+
from odoo import models,fields, api
2+
from dateutil.relativedelta import relativedelta
3+
from odoo.exceptions import UserError
24

35

46
class EstatePropertyOffer(models.Model):
@@ -14,4 +16,35 @@ class EstatePropertyOffer(models.Model):
1416
)
1517
partner_id = fields.Many2one("res.partner", required=True)
1618
property_id = fields.Many2one("estate.property", required=True)
19+
validity = fields.Integer(default=7)
20+
date_deadline = fields.Date(compute="_compute_deadline", inverse="_inverse_deadline")
21+
22+
@api.depends('validity')
23+
def _compute_deadline(self):
24+
for record in self:
25+
if record.create_date:
26+
record.date_deadline = fields.Date.to_date(record.create_date) + relativedelta(days=record.validity)
27+
else:
28+
record.date_deadline = 0
29+
30+
def _inverse_deadline(self):
31+
for record in self:
32+
if record.create_date:
33+
record.validity = (record.date_deadline - fields.Date.to_date(record.create_date)).days
34+
else:
35+
record.validity = 0
36+
37+
def action_accept(self):
38+
for record in self:
39+
if record.property_id.buyer:
40+
raise UserError("Property already accepted")
41+
else:
42+
record.status = 'accepted'
43+
record.property_id.selling_price = record.price
44+
record.property_id.state = 'offer_accepted'
45+
record.property_id.buyer = record.partner_id
46+
47+
def action_refuse(self):
48+
for record in self:
49+
record.status = 'refused'
1750

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?xml version="1.0"?>
2+
<odoo>
3+
<record id="estate_property_offer_list" model="ir.ui.view">
4+
<field name="model">estate.property.offer</field>
5+
<field name="arch" type="xml">
6+
<list>
7+
<field name="price" />
8+
<field name="partner_id" />
9+
<field name="validity"/>
10+
<field name="date_deadline"/>
11+
<button name="action_accept" string="Accept" type="object" icon="fa-check"/>
12+
<button name="action_refuse" string="Cancelled" type="object" icon="fa-times"/>
13+
<field name="status"/>
14+
</list>
15+
</field>
16+
</record>
17+
18+
<record id="estate_property_offer_form" model="ir.ui.view">
19+
<field name="model">estate.property.offer</field>
20+
<field name="arch" type="xml">
21+
<form>
22+
<sheet>
23+
<group>
24+
<field name="price"/>
25+
<field name="partner_id"/>
26+
<field name="validity"/>
27+
<field name="date_deadline"/>
28+
<field name="status"/>
29+
</group>
30+
</sheet>
31+
</form>
32+
</field>
33+
</record>
34+
</odoo>

estate/views/estate_property_tag_views.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<record id="estate_property_type_form" model="ir.ui.view">
2222
<field name="model">estate.property.tag</field>
2323
<field name="arch" type="xml">
24-
<form string="form1">
24+
<form>
2525
<sheet>
2626
<group>
2727
<group>

estate/views/estate_property_type_views.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<record id="estate_property_type_form" model="ir.ui.view">
2222
<field name="model">estate.property.type</field>
2323
<field name="arch" type="xml">
24-
<form string="test">
24+
<form>
2525
<sheet>
2626
<group>
2727
<group>

estate/views/estate_property_views.xml

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<search string="Search Properties">
77
<field name="postcode"/>
88
<field name="bedrooms"/>
9-
<field name="living_area"/>
9+
<field name="total_area"/>
1010
<field name="expected_price"/>
1111
<field name="selling_price"/>
1212
<field name="facades"/>
@@ -23,7 +23,7 @@
2323
<field name="name"/>
2424
<field name="postcode"/>
2525
<field name="bedrooms"/>
26-
<field name="living_area"/>
26+
<field name="total_area"/>
2727
<field name="selling_price"/>
2828
<field name="date_availability"/>
2929
<field name="property_type_id"/>
@@ -34,18 +34,24 @@
3434
<record id="estate_property_form" model="ir.ui.view">
3535
<field name="model">estate.property</field>
3636
<field name="arch" type="xml">
37-
<form string="test">
37+
<form>
38+
<header>
39+
<button name="cancel_property" type="object" string="Cancel"/>
40+
<button name="sold_property" type="object" string="Sold"/>
41+
</header>
3842
<sheet>
3943
<group>
4044
<group>
4145
<field name="tag_ids" widget="many2many_tags"/>
4246
<field name="name"/>
47+
<field name="state"/>
4348
<field name="date_availability"/>
4449
</group>
4550
<group>
4651

4752
<field name="expected_price"/>
4853
<field name="selling_price"/>
54+
<field name="best_offer"/>
4955
</group>
5056
</group>
5157
<notebook>
@@ -58,32 +64,20 @@
5864
<field name="bedrooms"/>
5965
<field name="facades"/>
6066
<field name="state"/>
61-
67+
<field name="active"/>
6268
</group>
6369
<group>
6470
<field name="living_area"/>
6571
<field name="garage"/>
6672
<field name="garden"/>
6773
<field name="garden_area"/>
6874
<field name="garden_orientation"/>
75+
<field name="total_area"/>
6976
</group>
7077
</group>
7178
</page>
72-
<page string="Offers">
73-
<field name="offer_ids">
74-
<list>
75-
<field name="price" />
76-
<field name="partner_id" />
77-
<field name="status" />
78-
</list>
79-
<form>
80-
<group>
81-
<field name="price" />
82-
<field name="partner_id" />
83-
<field name="status" />
84-
</group>
85-
</form>
86-
</field>
79+
<page string="Offers">
80+
<field name="offer_ids"/>
8781
</page>
8882
<page string="Other Info">
8983
<group>

0 commit comments

Comments
 (0)