Skip to content

Commit c103eb9

Browse files
committed
[IMP] estate: Grant proper access rights to custom user group
1 parent af4ac8e commit c103eb9

20 files changed

+159
-67
lines changed

estate/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,4 @@
1+
# --coding: utf-8 --
2+
# Part of Odoo. See LICENSE file for full copyright and licensing details.
3+
14
from . import models

estate/__manifest__.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
{
22
'name': 'Estate',
33
"version": "1.0",
4-
'application': True,
5-
'installable': True,
6-
'auto_install': False,
74
"category": "Real Estate/Brokerage",
85
'data': [
96
'security/security.xml',
107
'security/ir.model.access.csv',
118
'views/estate_property_views.xml',
129
'views/estate_property_type_views.xml',
1310
'views/estate_property_tag_views.xml',
14-
'views/inherited_model_view.xml',
11+
'views/res_users_views.xml',
1512
'views/estate_menus.xml',
13+
'data/estate_property_type.xml',
14+
],
15+
'demo': [
16+
'demo/estate_property_demo.xml',
17+
'demo/estate_property_offer.xml'
1618
],
19+
'application': True,
20+
'installable': True,
1721
'license': 'LGPL-3',
1822
}

estate/data/estate_property_type.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<odoo>
3+
<record id="property_type_residential" model="estate.property.type">
4+
<field name="name">Residential</field>
5+
</record>
6+
7+
<record id="property_type_commercial" model="estate.property.type">
8+
<field name="name">Commercial</field>
9+
</record>
10+
11+
<record id="property_type_industrial" model="estate.property.type">
12+
<field name="name">Industrial</field>
13+
</record>
14+
15+
<record id="property_type_land" model="estate.property.type">
16+
<field name="name">Land</field>
17+
</record>
18+
</odoo>

estate/demo/estate_property_demo.xml

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<odoo>
3+
<record id="estate_property_demo_1" model="estate.property">
4+
<field name="name">Big Villa</field>
5+
<field name="state">new</field>
6+
<field name="description">A nice and big villa</field>
7+
<field name="postcode">12345</field>
8+
<field name="date_avaiblity">2020-02-02</field>
9+
<field name="expected_price">1600000</field>
10+
<field name="selling_price"></field>
11+
<field name="bedrooms">6</field>
12+
<field name="living_area">100</field>
13+
<field name="facades">4</field>
14+
<field name="garage">1</field>
15+
<field name="garden">1</field>
16+
<field name="garden_area">100000</field>
17+
<field name="garden_orientation">south</field>
18+
<field name="property_type_id" ref="property_type_residential"/>
19+
</record>
20+
21+
<record id="estate_property_demo_2" model="estate.property">
22+
<field name="name">Trailer Home</field>
23+
<field name="state">cancelled</field>
24+
<field name="description">Home in trailer park.</field>
25+
<field name="postcode">54321</field>
26+
<field name="date_avaiblity">1970-01-01</field>
27+
<field name="expected_price">100000</field>
28+
<field name="selling_price">120000</field>
29+
<field name="bedrooms">1</field>
30+
<field name="living_area">10</field>
31+
<field name="facades">4</field>
32+
<field name="garage">0</field>
33+
<field name="property_type_id" ref="property_type_residential"/>
34+
</record>
35+
36+
<record id="estate_property_demo_2" model="estate.property">
37+
<field name="name">Trailer House</field>
38+
<field name="state">cancelled</field>
39+
<field name="description">Home in trailer court.</field>
40+
<field name="postcode">54321</field>
41+
<field name="date_avaiblity">1970-01-01</field>
42+
<field name="expected_price">1000000</field>
43+
<field name="selling_price">1200000</field>
44+
<field name="bedrooms">6</field>
45+
<field name="living_area">1000</field>
46+
<field name="facades">4</field>
47+
<field name="garage">0</field>
48+
<field name="offer_ids"
49+
eval="[
50+
Command.create({
51+
'partner_id': ref('base.res_partner_2'),
52+
'price': 10000,
53+
'validity': 14,
54+
'date_deadline': (DateContext().today() + relativedelta(days=14)).isoformat(),
55+
}),
56+
Command.create({
57+
'partner_id': ref('base.res_partner_2'),
58+
'price': 1500000,
59+
'validity': 14,
60+
'date_deadline': (DateContext().today() + relativedelta(days=14)).isoformat(),
61+
}),
62+
Command.create({
63+
'partner_id': ref('base.res_partner_3'),
64+
'price': 1500001,
65+
'validity': 11,
66+
'date_deadline': (DateContext().today() + relativedelta(days=11)).isoformat(),
67+
}),
68+
]" />
69+
</record>
70+
</odoo>

estate/demo/estate_property_offer.xml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<odoo>
3+
<record id="estate_property_offer_1" model="estate.property.offer">
4+
<field name="price">1000000000</field>
5+
<field name="validity">14</field>
6+
<field name="property_id" ref="estate_property_demo_1" />
7+
<field name="partner_id" ref="base.res_partner_1" />
8+
</record>
9+
<record id="estate_property_offer_2" model="estate.property.offer">
10+
<field name="price">1500000000000</field>
11+
<field name="validity">14</field>
12+
<field name="property_id" ref="estate_property_demo_1" />
13+
<field name="partner_id" ref="base.res_partner_1" />
14+
</record>
15+
<record id="estate_property_offer_3" model="estate.property.offer">
16+
<field name="price">15000000000001</field>
17+
<field name="validity">11</field>
18+
<field name="property_id" ref="estate_property_demo_1" />
19+
<field name="partner_id" ref="base.res_partner_2" />
20+
</record>
21+
<function model="estate.property.offer" name="action_confirm">
22+
<value eval="[ref('estate_property_offer_1')]" />
23+
</function>
24+
<function model="estate.property.offer" name="action_refuse">
25+
<value eval="[ref('estate_property_offer_2')]" />
26+
</function>
27+
<function model="estate.property.offer" name="action_refuse">
28+
<value eval="[ref('estate_property_offer_3')]" />
29+
</function>
30+
</odoo>

estate/models/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
# --coding: utf-8 --
2+
# Part of Odoo. See LICENSE file for full copyright and licensing details.
3+
14
from . import estate_property
25
from . import estate_property_type
36
from . import estate_property_tag
47
from . import estate_property_offer
5-
from . import inherited_model
8+
from . import res_users

estate/models/estate_property.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class EstateProperty(models.Model):
3838
total_area = fields.Float(compute="_compute_total")
3939
best_price = fields.Float(compute="_compute_best_price", string="Best Offer Price", readonly=True)
4040
active = fields.Boolean(default=True)
41+
company_id = fields.Many2one("res.company", required=True, default=lambda self: self.env.company)
4142

4243
@api.depends("garden_area", "living_area")
4344
def _compute_total(self):
@@ -80,7 +81,6 @@ def action_cancel(self):
8081
raise UserError("Sold properties cannot be cancelled.")
8182
record.state = 'cancelled'
8283

83-
# SOLD button logic
8484
def action_sold(self):
8585
for record in self:
8686
if record.state == 'cancelled':

estate/models/estate_property_offer.py

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@ class EstatePropertyOffer(models.Model):
1313
]
1414

1515
price = fields.Float()
16-
status = fields.Selection(
17-
selection=[('accepted', 'Accepted'), ('refused', 'Refuse')],
18-
copy=False,
19-
)
2016
partner_id = fields.Many2one(
2117
"res.partner", string='Partner', index=True, default=lambda self: self.env.user.partner_id.id
2218
)
@@ -33,7 +29,6 @@ class EstatePropertyOffer(models.Model):
3329
@api.depends('create_date', 'validity')
3430
def _compute_date_deadline(self):
3531
for record in self:
36-
# Use create_date if available, otherwise fallback to today
3732
create_date = record.create_date or fields.Date.today()
3833
record.date_deadline = create_date + timedelta(days=record.validity)
3934

@@ -43,32 +38,26 @@ def _inverse_date_deadline(self):
4338
if record.date_deadline:
4439
record.validity = (record.date_deadline.day - create_date.day)
4540

41+
status = fields.Selection(
42+
selection=[('accepted', 'Accepted'), ('refused', 'Refuse')],
43+
copy=False,
44+
)
45+
4646
def action_confirm(self):
4747
for record in self:
48-
# Ensure only one accepted offer per property
4948
if any(
5049
offer.status == 'accepted'
5150
for offer in record.property_id.offer_ids
5251
):
5352
raise UserError("Only one offer can be accepted per property.")
54-
5553
min_price = record.property_id.expected_price * 0.9
56-
5754
if float_compare(record.price, min_price, precision_digits=2) < 0:
5855
raise ValidationError("Offer must be at least 90% of the expected price to be accepted.")
59-
6056
record.status = 'accepted'
61-
6257
record.property_id.state = 'offer accepted'
63-
64-
# Refuse all other offers
6558
other_offers = record.property_id.offer_ids - record
66-
6759
other_offers.write({'status': 'refused'})
68-
69-
# Set buyer and selling price on property
7060
record.property_id.selling_price = record.price
71-
7261
record.property_id.buyer_id = record.partner_id
7362

7463
def action_refuse(self):
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from odoo import models, fields
22

33

4-
class InheritedModel(models.Model):
4+
class ResUsers(models.Model):
55
_inherit = 'res.users'
66

77
property_ids = fields.One2many('estate.property', 'salesman_id', domain=[('state', 'not in', ['sold', 'cancelled'])])

estate/security/security.xml

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,14 @@
1313
<field name="implied_ids" eval="[(4, ref('estate_group_user'))]"/>
1414
</record>
1515

16-
<record id="rule_id" model="ir.rule">
17-
<field name="name">Agents: see or modify properties with no salesman or themselves as
18-
salesman</field>
16+
<record id="company_rule_id" model="ir.rule">
17+
<field name="name">company: see or modify properties of my company only</field>
1918
<field name="model_id" ref="model_estate_property" />
2019
<field name="perm_read" eval="True" />
2120
<field name="perm_write" eval="True" />
2221
<field name="perm_create" eval="True" />
2322
<field name="perm_unlink" eval="False" />
2423
<field name="groups" eval="[Command.link(ref('estate_group_user'))]" />
25-
<field name="domain_force">[
26-
'|',
27-
'|', ('salesman_id', '=', user.id),
28-
('salesman_id', '=', False),
29-
('write_uid', '=', user.id)
30-
]</field>
24+
<field name="domain_force">[('company_id', '=', user.company_id.id)]</field>
3125
</record>
32-
</odoo>
26+
</odoo>

0 commit comments

Comments
 (0)