Skip to content

Commit 8e85311

Browse files
author
raibr
committed
[IMP] estate: Implement salesperson management with properties association
1 parent f073fa7 commit 8e85311

File tree

10 files changed

+80
-13
lines changed

10 files changed

+80
-13
lines changed

estate/__manifest__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"views/estate_property_offer_views.xml",
2222
"views/estate_property_type_views.xml",
2323
"views/estate_property_tag_views.xml",
24+
"views/res_users_views.xml",
2425
"views/estate_menus.xml",
2526
],
2627
"application": True,

estate/models/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
from . import estate_property_type
55
from . import estate_property_tag
66
from . import estate_property_offer
7+
from . import res_users

estate/models/estate_property.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from odoo import api, fields, models
44
from odoo.exceptions import UserError, ValidationError
5-
from odoo.tools.float_utils import float_compare, float_is_zero
5+
from odoo.tools import float_compare, float_is_zero
66

77

88
class EstateProperty(models.Model):
@@ -46,6 +46,7 @@ class EstateProperty(models.Model):
4646
string="Status",
4747
)
4848
buyer_id = fields.Many2one(comodel_name='res.partner', string="Buyer")
49+
salesperson_id = fields.Many2one(comodel_name='res.users', string="Salesperson", default=lambda self: self.env.user)
4950
property_type_id = fields.Many2one(comodel_name='estate.property.type', string="Property Type")
5051
tag_ids = fields.Many2many(comodel_name='estate.property.tag', string="Tags")
5152
offer_ids = fields.One2many(
@@ -98,3 +99,9 @@ def action_cancel(self):
9899
raise UserError(self.env._("Sold property cannot be cancelled."))
99100
property.state = 'cancelled'
100101
return True
102+
103+
def unlink(self):
104+
for property in self:
105+
if property.state not in ('new', 'cancelled'):
106+
raise UserError(self.env._("Only new and cancelled properties can be deleted."))
107+
return super().unlink()

estate/models/estate_property_offer.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class EstatePropertyOffer(models.Model):
1414
_check_price = models.Constraint('Check(price > 0)', "The offer price must be strictly positive.")
1515
status = fields.Selection(selection=[('accepted', "Accepted"), ('refused', "Refused")], copy=False, string="Status")
1616
partner_id = fields.Many2one(comodel_name='res.partner', string="Partner", required=True)
17-
property_id = fields.Many2one(comodel_name='estate.property', string="Property", required=True)
17+
property_id = fields.Many2one(comodel_name='estate.property', string="Property", required=True, ondelete='cascade')
1818
validity = fields.Integer(default=7, string="Validity (days)")
1919
date_deadline = fields.Date(
2020
compute='_compute_date_deadline',
@@ -23,13 +23,24 @@ class EstatePropertyOffer(models.Model):
2323
string="Deadline",
2424
)
2525

26-
# self.property_id.status = 'offer_received' when offer is created
27-
@api.model
28-
def create(self, vals):
29-
offer = super().create(vals)
30-
if offer.property_id.state == 'new':
31-
offer.property_id.state = 'offer_received'
32-
return offer
26+
@api.model_create_multi
27+
def create(self, vals_list):
28+
for vals in vals_list:
29+
property_id = vals.get('property_id')
30+
price = vals.get('price')
31+
32+
if property_id and price:
33+
property = self.env['estate.property'].browse(property_id)
34+
if property.offer_ids:
35+
max_offer = max(property.offer_ids.mapped('price'))
36+
if price < max_offer:
37+
raise UserError(self.env._("The offer amount must be higher than %.2f") % max_offer)
38+
39+
offers = super().create(vals_list)
40+
for offer in offers:
41+
if offer.property_id.state == 'new':
42+
offer.property_id.state = 'offer_received'
43+
return offers
3344

3445
@api.depends('validity')
3546
def _compute_date_deadline(self):

estate/models/res_users.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Part of Odoo. See LICENSE file for full copyright and licensing details.
2+
3+
from odoo import fields, models
4+
5+
6+
class ResUsers(models.Model):
7+
_inherit = 'res.users'
8+
9+
property_ids = fields.One2many(
10+
comodel_name='estate.property',
11+
inverse_name='salesperson_id',
12+
string="Properties",
13+
)

estate/security/ir.model.access.csv

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

estate/views/estate_menus.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,13 @@
2828
parent="estate_settings_menu"
2929
action="estate_property_tag_action"/>
3030

31-
<menuitem id="estate_property_offer_menu_action"
31+
<menuitem id="estate_property_offer_menu_action"
3232
name="Property Offers"
3333
parent="estate_settings_menu"
3434
action="estate_property_offer_action"/>
35+
36+
<menuitem id="estate_salesperson_menu_action"
37+
name="Salespersons"
38+
parent="estate_settings_menu"
39+
action="estate_salesperson_action"/>
3540
</odoo>

estate/views/estate_property_offer_views.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,5 @@
4747
<field name="name">Property Offers</field>
4848
<field name="res_model">estate.property.offer</field>
4949
<field name="view_mode">list,form</field>
50-
<field name="domain">[('property_id.property_type_id', '=', active_id)]</field>
51-
<field name="domain">[('property_id.property_type_id', '=', active_id)]</field>
5250
</record>
5351
</odoo>

estate/views/estate_property_views.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
<field name="expected_price" />
5555
<field name="best_price" />
5656
<field name="selling_price" />
57+
<field name="salesperson_id" />
5758
<field name="buyer_id" />
5859
</group>
5960
</group>

estate/views/res_users_views.xml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<odoo>
3+
<record id="res_users_view_form_inherit_estate" model="ir.ui.view">
4+
<field name="name">res.users.view.form.inherit.estate</field>
5+
<field name="model">res.users</field>
6+
<field name="inherit_id" ref="base.view_users_form"/>
7+
<field name="arch" type="xml">
8+
<xpath expr="//notebook" position="inside">
9+
<page string="Real Estate Properties">
10+
<field name="property_ids">
11+
<list string="Properties">
12+
<field name="name"/>
13+
<field name="postcode"/>
14+
<field name="expected_price"/>
15+
<field name="state"/>
16+
</list>
17+
</field>
18+
</page>
19+
</xpath>
20+
</field>
21+
</record>
22+
23+
<!-- Action -->
24+
<record id="estate_salesperson_action" model="ir.actions.act_window">
25+
<field name="name">Salespersons</field>
26+
<field name="res_model">res.users</field>
27+
<field name="view_mode">list,form</field>
28+
</record>
29+
</odoo>

0 commit comments

Comments
 (0)