Skip to content

Commit 5403072

Browse files
committed
[IMP] estate: adding CRUD rules for properties and offers + adding properties list in user form
1 parent e790194 commit 5403072

10 files changed

+67
-22
lines changed

estate/__manifest__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,7 @@
1010
'views/estate_property_tag_views.xml',
1111
'views/estate_property_views.xml',
1212
'views/estate_menu_views.xml',
13-
]
13+
'views/res_users_views.xml',
14+
],
15+
'license': 'OEEL-1',
1416
}

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 res_users

estate/models/estate_property.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from odoo import api, fields, models
1+
from odoo import api, fields, models, _
22
from odoo.exceptions import UserError, ValidationError
33
from odoo.tools.float_utils import float_compare, float_is_zero
44
from dateutil.relativedelta import relativedelta
@@ -45,7 +45,7 @@ class EstateProperty(models.Model):
4545
default='new'
4646
)
4747

48-
property_type_id = fields.Many2one('estate.property.type', string="Property Type", options="{'no_create':True}")
48+
property_type_id = fields.Many2one('estate.property.type', string="Property Type")
4949
buyer_id = fields.Many2one('res.partner', string="Buyer", copy=False)
5050
salesperson_id = fields.Many2one('res.users', string="Sales Person", default=lambda self: self.env.user)
5151
property_tag_ids = fields.Many2many('estate.property.tag')
@@ -65,6 +65,7 @@ def _check_selling_price(self):
6565
if not float_is_zero(record.selling_price, precision_digits=2) and float_compare(record.selling_price, record.expected_price * 0.9, precision_digits=2) <= 0:
6666
raise ValidationError("The selling price cannot be lower than 90 percent of the expected price.")
6767

68+
6869
@api.depends('living_area', 'garden_area')
6970
def _compute_tot_area(self):
7071
for record in self:
@@ -75,6 +76,13 @@ def _compute_best_price(self):
7576
for record in self:
7677
record.best_price = max(record.property_offer_ids.mapped('price'), default=0)
7778

79+
80+
@api.ondelete(at_uninstall=False)
81+
def _prevent_property_deletion(self):
82+
for record in self:
83+
if record.state not in ('new', 'cancelled'):
84+
raise UserError(_("Only new or cancelled properties can be deleted."))
85+
7886
@api.onchange('garden')
7987
def _onchange_garden(self):
8088
if self.garden:
@@ -89,14 +97,13 @@ def action_set_sold(self):
8997
if record.state != 'cancelled':
9098
record.state = 'sold'
9199
else:
92-
raise UserError("Sold properties cannot be cancelled.")
100+
raise UserError(_("Sold properties cannot be cancelled."))
93101
return True
94102

95103
def action_set_cancelled(self):
96104
for record in self:
97105
if record.state != 'sold':
98106
record.state = 'cancelled'
99107
else:
100-
raise UserError("Sold properties cannot be cancelled.")
108+
raise UserError(_("Sold properties cannot be cancelled."))
101109
return True
102-

estate/models/estate_property_offer.py

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

45

@@ -27,6 +28,14 @@ def _compute_date_deadline(self):
2728
start_date = record.create_date or fields.Date.today()
2829
record.date_deadline = start_date + relativedelta(days=record.validity)
2930

31+
@api.model_create_multi
32+
def create(self, vals_list):
33+
for vals in vals_list:
34+
if self.price < self.env['estate.property'].browse(vals['property_id']).best_price:
35+
raise UserError(_("You cannot put in an offer that is lower than the current best price."))
36+
self.env['estate.property'].browse(vals['property_id']).state = 'offer_received'
37+
return super(EstatePropertyOffer, self).create(vals_list)
38+
3039
def _inverse_date_deadline(self):
3140
for record in self:
3241
record.validity = (record.date_deadline - record.create_date.date()).days

estate/models/estate_property_type.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@ class EstatePropertyType(models.Model):
77
_order = 'sequence'
88

99
name = fields.Char(required=True)
10-
sequence = fields.Integer('Sequence')
10+
sequence = fields.Integer()
1111
property_ids = fields.One2many('estate.property', 'property_type_id')
1212
offer_ids = fields.One2many('estate.property.offer', 'property_type_id')
13-
offer_count = fields.Integer(compute="_compute_count_offers")
13+
offer_count = fields.Integer(compute="_compute_offer_count")
1414

1515
_sql_constraints = [
1616
('unique_property_type_name_check', 'UNIQUE(name)',
1717
'Type name should be unique.'),
1818
]
1919

2020
@api.depends('offer_ids')
21-
def _compute_count_offers(self):
21+
def _compute_offer_count(self):
2222
for record in self:
2323
record.offer_count = len(record.offer_ids)

estate/models/res_users.py

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

estate/security/ir.model.access.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
22
estate.access_estate_property,access_estate_property,estate.model_estate_property,base.group_user,1,1,1,1
33
estate.access_estate_property_type,access_estate_property_type,estate.model_estate_property_type,base.group_user,1,1,1,1
44
estate.access_estate_property_tag,access_estate_property_tag,estate.model_estate_property_tag,base.group_user,1,1,1,1
5-
estate.access_estate_property_offer,access_estate_property_offer,estate.model_estate_property_offer,base.group_user,1,1,1,1
5+
estate.access_estate_property_offer,access_estate_property_offer,estate.model_estate_property_offer,base.group_user,1,1,1,1

estate/views/estate_property_type_views.xml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@
2121
<sheet>
2222
<div name="button_box" class="oe_button_box">
2323
<button
24-
type="action"
25-
name="estate.estate_property_offer_action"
26-
class="oe_stat_button"
27-
icon="fa-money"
28-
string="Offers"
29-
/>
24+
type="action"
25+
name="estate.estate_property_offer_action"
26+
class="oe_stat_button"
27+
icon="fa-money"
28+
>
29+
<field name="offer_count" string="Offers" widget="statinfo"/>
30+
</button>
3031
</div>
3132
<h1>
3233
<field name="name"/>

estate/views/estate_property_views.xml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
<field name="arch" type="xml">
99
<list
1010
string="Properties"
11-
decoration-success="state == 'offer_received'"
12-
decoration-primary="state == 'offer_accepted'"
11+
decoration-success="state in ('offer_received', 'offer_accepted')"
12+
decoration-bf="state == 'offer_accepted'"
1313
decoration-muted="state == 'sold'">
1414
<field name="name"/>
1515
<field name="property_type_id"/>
@@ -58,7 +58,7 @@
5858
/>
5959
<group>
6060
<group>
61-
<field name="property_type_id"/>
61+
<field name="property_type_id" options="{'no_create':True}"/>
6262
<field name="postcode"/>
6363
<field name="date_availability"/>
6464
</group>
@@ -86,8 +86,7 @@
8686
<field
8787
name="property_offer_ids"
8888
readonly="state in ('offer_accepted','sold','cancelled')"
89-
>
90-
</field>
89+
/>
9190
</page>
9291
<page string="Other Info">
9392
<group>

estate/views/res_users_views.xml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<odoo>
3+
<data>
4+
5+
<record id="res_users_view_form_inherit_estate" model="ir.ui.view">
6+
<field name="name">res.users.view.form.inherit.estate</field>
7+
<field name="model">res.users</field>
8+
<field name="inherit_id" ref="base.view_users_form"/>
9+
<field name="arch" type="xml">
10+
<xpath expr="//page[@name='account_security']" position="after">
11+
<page string="Real Estate Properties">
12+
<field name="property_ids"/>
13+
</page>
14+
</xpath>
15+
</field>
16+
</record>
17+
18+
</data>
19+
</odoo>

0 commit comments

Comments
 (0)