Skip to content

Commit 51f40b8

Browse files
committed
[IMP] estate: updated security constraints by company and group
security is a very challenging assignment. last time security was not completed. faced many errros that time. Completed this topic by creating compannies. groups and category was already created last time. Learned how to add security constraints by groups and company. also by user. Tested by creating 2 managers and 2 agents. 1 manager have 2 company allowed. both agent have diffrent company. Updated property model to show users by company. Agents can only access their properties and can sold it. Manager can have all access to property except unlink it. Learned about visbility and hide the setting menu for agents which is can only be modified by the manages.
1 parent 6ce5b2b commit 51f40b8

14 files changed

+175
-62
lines changed

estate/__manifest__.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
part of technical training
99
""",
1010
"data": [
11+
# security
12+
"security/security.xml",
13+
"security/ir.model.access.csv",
1114
# reports
1215
"report/paperformat.xml",
1316
"report/company_details_templates.xml",
@@ -24,11 +27,10 @@
2427
"views/estate_property_tag_views.xml",
2528
"views/estate_property_offer_views.xml",
2629
"views/res_users_views.xml",
27-
# security
28-
"security/security.xml",
29-
"security/ir.model.access.csv",
3030
],
3131
"demo": [
32+
"demo/demo_res_company.xml",
33+
"demo/demo_res_users.xml",
3234
"demo/estate.property.types.csv",
3335
"demo/estate.property.tags.csv",
3436
"demo/estate_property_demo.xml",

estate/demo/demo_res_company.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<odoo>
2+
<record id="estate_company_2" model="res.company">
3+
<field name="name">Estate Company</field>
4+
<field name="street">123 Estate Lane</field>
5+
<field name="city">Estate City</field>
6+
<field name="state_id" ref="base.state_us_12"/> <!-- Example state (California, adjust as needed) -->
7+
<field name="country_id" ref="base.us"/> <!-- Example country (USA, adjust as needed) -->
8+
<field name="zip">90210</field>
9+
<field name="phone">+1 234 567 8900</field>
10+
<field name="email">[email protected]</field>
11+
</record>
12+
</odoo>

estate/demo/demo_res_users.xml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<odoo>
2+
<!-- Manager Users -->
3+
<record id="estate_manager_user_1" model="res.users">
4+
<field name="name">Manager 1 Estate</field>
5+
<field name="login">m1</field>
6+
<field name="password">p</field>
7+
<field name="groups_id" eval="[ref('base.group_user'), ref('estate.group_estate_user_manager')]"/>
8+
<field name="company_id" ref="base.main_company"/>
9+
<field name="company_ids" eval="[ref('base.main_company'), ref('estate_company_2')]"/>
10+
</record>
11+
12+
<record id="estate_manager_user_2" model="res.users">
13+
<field name="name">Manager 2 Estate</field>
14+
<field name="login">m2</field>
15+
<field name="password">p</field>
16+
<field name="groups_id" eval="[ref('base.group_user'), ref('estate.group_estate_user_manager')]"/>
17+
<field name="company_id" ref="estate_company_2"/>
18+
<field name="company_ids" eval="[ref('estate_company_2')]"/>
19+
</record>
20+
21+
<!-- Agent Users -->
22+
<record id="estate_agent_user_1" model="res.users">
23+
<field name="name">Agent 1 Estate</field>
24+
<field name="login">a1</field>
25+
<field name="password">p</field>
26+
<field name="groups_id" eval="[ref('base.group_user'), ref('estate.group_estate_user_agent')]"/>
27+
<field name="company_id" ref="base.main_company"/>
28+
<field name="company_ids" eval="[ref('base.main_company')]"/>
29+
</record>
30+
31+
<record id="estate_agent_user_2" model="res.users">
32+
<field name="name">Agent 2 Estate</field>
33+
<field name="login">a2</field>
34+
<field name="password">p</field>
35+
<field name="groups_id" eval="[ref('base.group_user'), ref('estate.group_estate_user_agent')]"/>
36+
<field name="company_id" ref="estate_company_2"/>
37+
<field name="company_ids" eval="[ref('estate_company_2')]"/>
38+
</record>
39+
</odoo>

estate/demo/estate_property_demo.xml

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
<field name="garage">True</field>
1515
<field name="garden">True</field>
1616
<field name="garden_area">100000</field>
17-
<field name="user_id" ref="base.user_admin" />
17+
<field name="user_id" ref="estate.estate_agent_user_1" />
18+
<field name="company_id" ref="base.main_company" />
1819
<field name="garden_orientation">south</field>
1920
<field name="property_type_id" ref="estate_property_type_villa" />
2021
</record>
@@ -33,7 +34,8 @@
3334
<field name="garage">False</field>
3435
<field name="garden">False</field>
3536
<field name="garden_area">0</field>
36-
<field name="user_id" ref="base.user_admin" />
37+
<field name="user_id" ref="estate.estate_agent_user_1" />
38+
<field name="company_id" ref="base.main_company" />
3739
<field name="garden_orientation" />
3840
<field name="property_type_id" ref="estate_property_type_apartment" />
3941
</record>
@@ -49,7 +51,8 @@
4951
<field name="bedrooms">15</field>
5052
<field name="living_area">10000</field>
5153
<field name="facades">4</field>
52-
<field name="user_id" ref="base.user_admin" />
54+
<field name="user_id" ref="estate.estate_agent_user_1" />
55+
<field name="company_id" ref="base.main_company" />
5356
<field name="garage">False</field>
5457
<field name="garden">False</field>
5558
<field name="garden_area">0</field>
@@ -89,7 +92,8 @@
8992
<field name="bedrooms">5</field>
9093
<field name="living_area">350</field>
9194
<field name="facades">3</field>
92-
<field name="user_id" ref="base.user_admin" />
95+
<field name="user_id" ref="estate.estate_agent_user_1" />
96+
<field name="company_id" ref="base.main_company" />
9397
<field name="garage">True</field>
9498
<field name="garden">True</field>
9599
<field name="garden_area">500</field>
@@ -109,7 +113,8 @@
109113
<field name="selling_price">0.00</field>
110114
<field name="bedrooms">0</field>
111115
<field name="living_area">1000</field>
112-
<field name="user_id" ref="base.user_admin" />
116+
<field name="user_id" ref="estate.estate_agent_user_1" />
117+
<field name="company_id" ref="base.main_company" />
113118
<field name="facades">2</field>
114119
<field name="garage">False</field>
115120
<field name="garden">False</field>
@@ -131,7 +136,9 @@
131136
<field name="living_area">80</field>
132137
<field name="facades">1</field>
133138
<field name="garage">True</field>
134-
<field name="user_id" ref="base.user_admin" />
139+
<field name="user_id" ref="estate.estate_agent_user_2" />
140+
<field name="company_id" ref="estate_company_2" />
141+
<field name="partner_id" ref="base.res_partner_5" />
135142
<field name="garden">False</field>
136143
<field name="garden_area">0</field>
137144
<field name="garden_orientation" />
@@ -166,7 +173,9 @@
166173
<field name="bedrooms">0</field>
167174
<field name="living_area">0</field>
168175
<field name="facades">4</field>
169-
<field name="user_id" ref="base.user_admin" />
176+
<field name="user_id" ref="estate.estate_agent_user_2" />
177+
<field name="company_id" ref="estate_company_2" />
178+
<field name="partner_id" ref="base.res_partner_18" />
170179
<field name="garage">False</field>
171180
<field name="garden">False</field>
172181
<field name="garden_area">0</field>
@@ -186,7 +195,9 @@
186195
<field name="bedrooms">0</field>
187196
<field name="living_area">2000</field>
188197
<field name="facades">2</field>
189-
<field name="user_id" ref="base.user_admin" />
198+
<field name="user_id" ref="estate.estate_agent_user_2" />
199+
<field name="company_id" ref="estate_company_2" />
200+
<field name="partner_id" ref="base.res_partner_12" />
190201
<field name="garage">False</field>
191202
<field name="garden">False</field>
192203
<field name="garden_area">0</field>
@@ -208,7 +219,9 @@
208219
<field name="facades">5</field>
209220
<field name="garage">True</field>
210221
<field name="active">false</field>
211-
<field name="user_id" ref="base.user_admin" />
222+
<field name="user_id" ref="estate.estate_agent_user_2" />
223+
<field name="company_id" ref="estate_company_2" />
224+
<field name="partner_id" ref="base.res_partner_4" />
212225
<field name="garden_area">2000</field>
213226
<field name="garden_orientation">west</field>
214227
<field name="property_type_id" ref="estate_property_type_villa" />

estate/models/estate_property.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
class EstateProperty(models.Model):
99
_name = "estate.property"
1010
_description = "Real Estate Property"
11+
_check_company_auto = True
1112

1213
name = fields.Char(required=True, string="Name")
1314
postcode = fields.Char(string="Pincode")
@@ -53,6 +54,7 @@ class EstateProperty(models.Model):
5354
string="Salesperson",
5455
index=True,
5556
default=lambda self: self.env.user,
57+
check_company=True
5658
)
5759
partner_id = fields.Many2one("res.partner", string="Buyer", copy=False)
5860
tag_ids = fields.Many2many("estate.property.tags", string="Tags")
@@ -62,6 +64,13 @@ class EstateProperty(models.Model):
6264
string="Offers",
6365
)
6466
best_price = fields.Float(compute="_compute_best_price")
67+
68+
company_id = fields.Many2one(
69+
'res.company',
70+
string="Company",
71+
required=True,
72+
default=lambda self: self.env.company,
73+
)
6574

6675
@api.depends("living_area", "garden_area")
6776
def _compute_total_area(self):
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2-
estate.manager_access_estate_property,access_estate_property,estate.model_estate_property,estate.estate_group_manager,1,1,1,0
3-
estate.manager_access_estate_property_types,access_estate_property_types,estate.model_estate_property_types,estate.estate_group_manager,1,1,1,1
4-
estate.manager_access_estate_property_tags,access_estate_property_tags,estate.model_estate_property_tags,estate.estate_group_manager,1,1,1,1
5-
estate.manager_access_estate_property_offers,access_estate_property_offers,estate.model_estate_property_offers,estate.estate_group_manager,1,1,1,1
2+
estate.manager_access_estate_property,manager_access_estate_property_name,estate.model_estate_property,estate.group_estate_user_manager,1,1,1,0
3+
estate.manager_access_estate_property_types,manager_access_estate_property_types_name,estate.model_estate_property_types,estate.group_estate_user_manager,1,1,1,1
4+
estate.manager_access_estate_property_tags,manager_access_estate_property_tags_name,estate.model_estate_property_tags,estate.group_estate_user_manager,1,1,1,1
5+
estate.manager_access_estate_property_offers,manager_access_estate_property_offers_name,estate.model_estate_property_offers,estate.group_estate_user_manager,1,1,1,1
66

7-
estate.agent_access_estate_property,access_estate_property,estate.model_estate_property,estate.estate_group_user,1,1,1,0
8-
estate.agent_access_estate_property_types,access_estate_property_types,estate.model_estate_property_types,estate.estate_group_user,1,0,0,0
9-
estate.agent_access_estate_property_tags,access_estate_property_tags,estate.model_estate_property_tags,estate.estate_group_user,1,0,0,0
10-
estate.agent_access_estate_property_offers,access_estate_property_offers,estate.model_estate_property_offers,estate.estate_group_user,1,1,1,0
7+
estate.agent_access_estate_property,agent_access_estate_property_name,estate.model_estate_property,estate.group_estate_user_agent,1,1,1,0
8+
estate.agent_access_estate_property_types,agent_access_estate_property_types_name,estate.model_estate_property_types,estate.group_estate_user_agent,1,0,0,0
9+
estate.agent_access_estate_property_tags,agent_access_estate_property_tags_name,estate.model_estate_property_tags,estate.group_estate_user_agent,1,0,0,0
10+
estate.agent_access_estate_property_offers,agent_access_estate_property_offers_name,estate.model_estate_property_offers,estate.group_estate_user_agent,1,1,1,0

estate/security/security.xml

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,44 @@
11
<odoo>
2-
<record id="base.module_category_real_estate_brokerage" model="ir.module.category">
3-
<field name="name">Real Estate Brokerage</field>
4-
</record>
2+
<data noupdate="False">
3+
<record id="base.module_category_real_estate_brokerage" model="ir.module.category">
4+
<field name="name">Real Estate Brokerage</field>
5+
</record>
56

6-
<!-- Create the Agent Group and Assign it to the Real Estate Brokerage Category -->
7-
<record id="estate_group_user" model="res.groups">
8-
<field name="name">Agent</field>
9-
<field name="category_id" ref="base.module_category_real_estate_brokerage" />
10-
</record>
7+
<!-- Create the Agent Group and Assign it to the Real Estate Brokerage Category -->
8+
<record id="group_estate_user_agent" model="res.groups">
9+
<field name="name">Agent</field>
10+
<field name="category_id" ref="base.module_category_real_estate_brokerage" />
11+
</record>
1112

12-
<!-- Define Manager Group -->
13-
<record id="estate_group_manager" model="res.groups">
14-
<field name="name">Manager</field>
15-
<field name="category_id" ref="base.module_category_real_estate_brokerage" />
16-
<field name="implied_ids" eval="[(4, ref('estate_group_user'))]" />
17-
</record>
13+
<!-- Define Manager Group -->
14+
<record id="group_estate_user_manager" model="res.groups">
15+
<field name="name">Manager</field>
16+
<field name="category_id" ref="base.module_category_real_estate_brokerage" />
17+
<field name="implied_ids" eval="[(ref('group_estate_user_agent'))]" />
18+
<field name="users" eval="[(4, ref('base.user_admin'))]" />
19+
</record>
1820

19-
<record id="estate_property_agent_rule" model="ir.rule">
20-
<field name="name">Agent Access on Properties</field>
21-
<field name="model_id" ref="estate.model_estate_property" />
22-
<field name="groups" eval="[(4, ref('estate.estate_group_user'))]" />
23-
<field name="domain_force">["|",('user_id', '=', user.id),('user_id', '=', False)]</field>
24-
<field name="perm_read" eval="1" />
25-
<field name="perm_write" eval="1" />
26-
<field name="perm_create" eval="1" />
27-
<field name="perm_unlink" eval="0" />
28-
</record>
21+
<record id="estate_property_agent_rule" model="ir.rule">
22+
<field name="name"> limits agents to only being able to see or modify properties which
23+
have no salesperson, or for which they are the salesperson.</field>
24+
<field name="model_id" ref="estate.model_estate_property" />
25+
<field name="groups" eval="[Command.link(ref('estate.group_estate_user_agent'))]" />
26+
<field name="domain_force">["|",
27+
('user_id', '=', user.id),
28+
('user_id', '=', False),
29+
('company_id', 'in', company_ids)
30+
]
31+
</field>
32+
<field name="perm_create" eval="0" />
33+
<field name="perm_unlink" eval="0" />
34+
</record>
35+
36+
<record id="estate_property_manager_rule" model="ir.rule">
37+
<field name="name">Managers can see everything</field>
38+
<field name="model_id" ref="estate.model_estate_property" />
39+
<field name="groups" eval="[Command.link(ref('estate.group_estate_user_manager'))]" />
40+
<field name="domain_force">[(1,"=",1)]</field>
41+
<field name="perm_unlink" eval="0" />
42+
</record>
43+
</data>
2944
</odoo>

estate/views/estate_property_views.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<field name="garden_orientation" optional="hidden" />
2323
<field name="garden" optional="hidden" />
2424
<field name="state" optional="hidden" />
25+
<field name="company_id" optional="hidden" />
2526
</list>
2627
</field>
2728
</record>
@@ -72,6 +73,11 @@
7273
<field name="selling_price" />
7374
</group>
7475
</group>
76+
<group>
77+
<group>
78+
<field name="company_id" />
79+
</group>
80+
</group>
7581
<notebook>
7682
<page string="Description">
7783
<group>

estate/views/menu_views.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
id="real_estate_menu_setting"
2424
parent="real_estate_menu_app"
2525
name="Settings"
26+
groups="estate.group_estate_user_manager"
2627
/>
2728
<menuitem
2829
id="real_estate_menu_setting_property_type"

estate_account/__manifest__.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@
88
""",
99
"data": [
1010
"report/estate_estate_property_templates.xml",
11-
"views/actions_smart_button.xml",
12-
"views/estate_property_views.xml",
11+
"security/ir.model.access.csv",
12+
# "views/actions_smart_button.xml",
13+
# "views/estate_property_views.xml",
14+
],
15+
"demo": [
16+
"demo/demo_journal_for_company.xml",
17+
"demo/demo_invoice_data_property.xml",
1318
],
14-
"demo": ["demo/demo_invoice_data_property.xml"],
1519
"installable": True,
1620
"auto_install": True,
1721
"license": "LGPL-3",

0 commit comments

Comments
 (0)