Skip to content

Commit 11ab1a4

Browse files
committed
[IMP] estate: implement chapter 9
Chapter 9 actions
1 parent 27e01ee commit 11ab1a4

File tree

4 files changed

+102
-14
lines changed

4 files changed

+102
-14
lines changed

estate/models/property.py

+39-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from dateutil.relativedelta import relativedelta
22

33
from odoo import models, fields, api
4+
from odoo.exceptions import UserError
45

56

67
class Property(models.Model):
@@ -32,8 +33,8 @@ class Property(models.Model):
3233
('offer_received', 'Offer Received'),
3334
('offer_accepted', 'Offer Accepted'),
3435
('sold', 'Sold'),
35-
('cancelled', 'Cancelled')
36-
])
36+
('canceled', 'Canceled')
37+
], default='new', required=True)
3738
property_type_id = fields.Many2one('estate.property.type', string='Property Type', required=True)
3839
buyer_id = fields.Many2one('res.partner', string='Buyer', copy=False)
3940
salesperson_id = fields.Many2one('res.users', string='Sales Person', default=lambda self: self.env.user)
@@ -63,3 +64,39 @@ def _onchange_garden(self):
6364
else:
6465
self.garden_orientation = None
6566
self.garden_area = 0
67+
68+
def action_sold(self):
69+
for record in self:
70+
if record.state in ['sold', 'canceled']:
71+
raise UserError('Cannot mark as sold.')
72+
record.state = 'sold'
73+
return True
74+
75+
def action_canceled(self):
76+
for record in self:
77+
if record.state in ['sold', 'canceled']:
78+
raise UserError('Cannot mark as canceled.')
79+
record.state = 'canceled'
80+
return True
81+
82+
def action_reset(self):
83+
for record in self:
84+
if record.state not in ['sold', 'canceled']:
85+
raise UserError('Cannot reset.')
86+
record.state = 'new'
87+
return True
88+
89+
# Make sure that only one offer is accepted
90+
def set_accepted_offer(self, offer):
91+
for record in self:
92+
if offer is not None:
93+
record.state = 'offer_accepted'
94+
record.selling_price = offer.price
95+
record.buyer_id = offer.partner_id
96+
else:
97+
record.state = 'offer_received'
98+
record.selling_price = 0
99+
record.buyer_id = None
100+
for o in record.offer_ids:
101+
if o.state == 'accepted' and (offer is None or o.id != offer.id):
102+
o.action_reset(propagate=False)

estate/models/property_offer.py

+22-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class PropertyOffer(models.Model):
1111
('received', 'Received'),
1212
('accepted', 'Accepted'),
1313
('refused', 'Refused')
14-
], default='received', required=True)
14+
], default='received', required=True, readonly=True)
1515
partner_id = fields.Many2one('res.partner', string='Partner', required=True)
1616
price = fields.Float()
1717
property_id = fields.Many2one('estate.property', string='Property', required=True)
@@ -29,3 +29,24 @@ def _compute_deadline_date(self):
2929
def _inverse_deadline_date(self):
3030
for record in self:
3131
record.validity = (record.deadline_date - record.create_date).days
32+
33+
def action_accept(self, propagate=True):
34+
for record in self:
35+
if propagate:
36+
record.property_id.set_accepted_offer(record)
37+
record.state = 'accepted'
38+
return True
39+
40+
def action_refuse(self, propagate=True):
41+
for record in self:
42+
if record.state == 'accepted' and propagate:
43+
record.property_id.set_accepted_offer(None)
44+
record.state = 'refused'
45+
return True
46+
47+
def action_reset(self, propagate=True):
48+
for record in self:
49+
if record.state == 'accepted' and propagate:
50+
record.property_id.set_accepted_offer(None)
51+
record.state = 'received'
52+
return True

estate/views/estate_property_offer_views.xml

+20-4
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,19 @@
55
<field name="model">estate.property.offer</field>
66
<field name="arch" type="xml">
77
<list string="Property offers">
8-
<field name="price"/>
8+
<field name="price" optional="show"/>
99
<field name="partner_id"/>
10-
<field name="deadline_date"/>
11-
<field name="validity"/>
12-
<field name="state"/>
10+
<field name="deadline_date" optional="show"/>
11+
<field name="validity" optional="hide"/>
12+
<button name="action_accept" string="Accept" invisible="state in ['accepted', 'refused']" type="object"
13+
icon="fa-check"/>
14+
<button name="action_refuse" string="Refuse" invisible="state in ['accepted', 'refused']" type="object"
15+
icon="fa-times"/>
16+
<field name="state" widget="badge"
17+
decoration-success="state == 'accepted'"
18+
decoration-info="state == 'received'"
19+
decoration-danger="state == 'refused'"
20+
optional="show"/>
1321
</list>
1422
</field>
1523
</record>
@@ -19,6 +27,14 @@
1927
<field name="model">estate.property.offer</field>
2028
<field name="arch" type="xml">
2129
<form string="Property offers">
30+
<header>
31+
<button name="action_accept" invisible="state in ['accepted', 'refused']" string="Accept"
32+
type="object" class="btn-primary"/>
33+
<button name="action_refuse" invisible="state in ['accepted', 'refused']" string="Refuse"
34+
type="object"/>
35+
<button name="action_reset" invisible="state not in ['accepted', 'refused']" string="Reset"
36+
type="object"/>
37+
</header>
2238
<sheet>
2339
<group>
2440
<field name="price"/>

estate/views/estate_property_views.xml

+21-7
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,18 @@
66
<field name="arch" type="xml">
77
<list string="Properties">
88
<field name="name"/>
9-
<field name="property_type_id"/>
10-
<field name="postcode"/>
11-
<field name="bedrooms"/>
12-
<field name="living_area"/>
13-
<field name="expected_price"/>
14-
<field name="selling_price"/>
15-
<field name="date_availability"/>
9+
<field name="property_type_id" optional="show"/>
10+
<field name="postcode" optional="show"/>
11+
<field name="bedrooms" optional="hide"/>
12+
<field name="living_area" optional="hide"/>
13+
<field name="expected_price" optional="show"/>
14+
<field name="selling_price" optional="show"/>
15+
<field name="date_availability" optional="hide"/>
16+
<field name="state" widget="badge"
17+
decoration-info="state == 'offer_received'"
18+
decoration-success="state in ['sold', 'offer_accepted']"
19+
decoration-danger="state == 'canceled'"
20+
optional="show"/>
1621
</list>
1722
</field>
1823
</record>
@@ -22,6 +27,15 @@
2227
<field name="model">estate.property</field>
2328
<field name="arch" type="xml">
2429
<form string="Properties">
30+
<header>
31+
<button name="action_sold" type="object" class="btn-primary" string="Sold"
32+
invisible="state in ['sold', 'canceled']"/>
33+
<button name="action_canceled" type="object" string="Cancel"
34+
invisible="state in ['sold', 'canceled']"/>
35+
<button name="action_reset" type="object" string="Reset"
36+
invisible="state not in ['sold', 'canceled']"/>
37+
<field name="state" widget="statusbar" statusbar_visible="new,offer_received,offer_accepted,sold"/>
38+
</header>
2539
<sheet>
2640
<div class="oe_title">
2741
<h1>

0 commit comments

Comments
 (0)