From e3ffd53f2cb561d4b18af6e7e87082b4b81dbee1 Mon Sep 17 00:00:00 2001 From: "Emmanuel Pire (empir)" Date: Tue, 15 Sep 2026 10:47:44 +0200 Subject: [PATCH 01/13] [ADD] estate: add manifest for new Estate module This adds the estate/ directory and basic init/manifest files. --- estate/__init__.py | 0 estate/__manifest__.py | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 estate/__init__.py create mode 100644 estate/__manifest__.py diff --git a/estate/__init__.py b/estate/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/estate/__manifest__.py b/estate/__manifest__.py new file mode 100644 index 00000000000..769074d8ad7 --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,7 @@ +{ + 'name': 'Estate', + 'author': 'empir', + 'depends': ['base'], + 'application': True, + 'license': 'LGPL-3' +} From aba085fb74302a0677f6ef65eec23c7c9db3b1a2 Mon Sep 17 00:00:00 2001 From: "Emmanuel Pire (empir)" Date: Tue, 15 Sep 2026 13:14:11 +0200 Subject: [PATCH 02/13] [IMP] estate: add estate_property model --- estate/__init__.py | 1 + estate/models/__init__.py | 1 + estate/models/estate_property.py | 27 +++++++++++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 estate/models/__init__.py create mode 100644 estate/models/estate_property.py diff --git a/estate/__init__.py b/estate/__init__.py index e69de29bb2d..0650744f6bc 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..5e1963c9d2f --- /dev/null +++ b/estate/models/__init__.py @@ -0,0 +1 @@ +from . import estate_property diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py new file mode 100644 index 00000000000..aeadf832aca --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,27 @@ +from odoo import models, fields + +class EstateProperty(models.Model): + _name = "estate_property" + _description = "Real estate properties" + + name = fields.Char(required=True) + description = fields.Text() + postcode = fields.Char() + date_availability = fields.Date() + expected_price = fields.Float(required=True) + selling_price = fields.Float() + bedrooms = fields.Integer() + living_area = fields.Integer() + facades = fields.Integer() + garage = fields.Boolean() + garden = fields.Boolean() + garden_area = fields.Integer() + garden_orientation = fields.Selection( + string="Garden orientation", + selection=[ + ("north", "North"), + ("south", "South"), + ("east", "East"), + ("west", "West") + ] + ) From 9d8b5a83038c93ee7d4a1fa03e7927b78746b6b8 Mon Sep 17 00:00:00 2001 From: "Emmanuel Pire (empir)" Date: Tue, 15 Sep 2026 13:33:28 +0200 Subject: [PATCH 03/13] [LINT] estate: add missing blank line --- estate/models/estate_property.py | 1 + 1 file changed, 1 insertion(+) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index aeadf832aca..68903b38a44 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,5 +1,6 @@ from odoo import models, fields + class EstateProperty(models.Model): _name = "estate_property" _description = "Real estate properties" From 52fd8b3dc44359be0820b4e0bcaade86cf0fedcf Mon Sep 17 00:00:00 2001 From: "Emmanuel Pire (empir)" Date: Tue, 15 Sep 2026 13:33:39 +0200 Subject: [PATCH 04/13] [IMP] estate: add estate_property model access rules --- estate/__manifest__.py | 3 ++- estate/security/ir.model.access.csv | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 769074d8ad7..043794a1311 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -3,5 +3,6 @@ 'author': 'empir', 'depends': ['base'], 'application': True, - 'license': 'LGPL-3' + 'license': 'LGPL-3', + 'data': ['security/ir.model.access.csv'] } diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..9dd28f6632a --- /dev/null +++ b/estate/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_estate_property_user,estate.estate_property.user,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file From f478092d31cc56f7f9a50e5bfa8abaff0e07cdce Mon Sep 17 00:00:00 2001 From: "Emmanuel Pire (empir)" Date: Tue, 15 Sep 2026 13:47:18 +0200 Subject: [PATCH 05/13] [LINT] estate: fix lint issues --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 043794a1311..b73ba3d9c44 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -4,5 +4,5 @@ 'depends': ['base'], 'application': True, 'license': 'LGPL-3', - 'data': ['security/ir.model.access.csv'] + 'data': ['security/ir.model.access.csv'], } diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 68903b38a44..9a9e2a895c9 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,4 @@ -from odoo import models, fields +from odoo import fields, models class EstateProperty(models.Model): @@ -23,6 +23,6 @@ class EstateProperty(models.Model): ("north", "North"), ("south", "South"), ("east", "East"), - ("west", "West") - ] + ("west", "West"), + ], ) From a0b81fd48a710543b10a117b51fb3e75bf21aff2 Mon Sep 17 00:00:00 2001 From: "Emmanuel Pire (empir)" Date: Tue, 15 Sep 2026 15:06:39 +0200 Subject: [PATCH 06/13] [IMP] estate: add basic UI --- estate/__manifest__.py | 6 +++++- estate/models/estate_property.py | 27 ++++++++++++++++++++++---- estate/views/estate_menus.xml | 8 ++++++++ estate/views/estate_property_views.xml | 8 ++++++++ 4 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 estate/views/estate_menus.xml create mode 100644 estate/views/estate_property_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index b73ba3d9c44..1ace2085819 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -4,5 +4,9 @@ 'depends': ['base'], 'application': True, 'license': 'LGPL-3', - 'data': ['security/ir.model.access.csv'], + 'data': [ + 'security/ir.model.access.csv', + 'views/estate_property_views.xml', + 'views/estate_menus.xml', + ], } diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 9a9e2a895c9..3b503886ad0 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,3 +1,5 @@ +from dateutil.relativedelta import relativedelta + from odoo import fields, models @@ -5,13 +7,30 @@ class EstateProperty(models.Model): _name = "estate_property" _description = "Real estate properties" - name = fields.Char(required=True) + name = fields.Char(required=True, default="Unknown") + active = fields.Boolean(default=True) + state = fields.Selection( + string="Status", + selection=[ + ("new", "New"), + ("offer_received", "Offer Received"), + ("offer_accepted", "Offer Accepted"), + ("sold", "Sold"), + ("cancelled", "Cancelled"), + ], + required=True, + default="new", + copy=False, + ) description = fields.Text() postcode = fields.Char() - date_availability = fields.Date() + date_availability = fields.Date( + copy=False, + default=fields.Date.today() + relativedelta(months=3), + ) expected_price = fields.Float(required=True) - selling_price = fields.Float() - bedrooms = fields.Integer() + selling_price = fields.Float(readonly=True, copy=False) + bedrooms = fields.Integer(default=2) living_area = fields.Integer() facades = fields.Integer() garage = fields.Boolean() diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml new file mode 100644 index 00000000000..4a794f7aa4d --- /dev/null +++ b/estate/views/estate_menus.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml new file mode 100644 index 00000000000..825ae24d7d4 --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,8 @@ + + + + Properties + estate_property + list,form + + \ No newline at end of file From 99b3070f04b31575ad788e0e691416e20206b992 Mon Sep 17 00:00:00 2001 From: "Emmanuel Pire (empir)" Date: Tue, 15 Sep 2026 16:25:24 +0200 Subject: [PATCH 07/13] [IMP] estate: add list, form and search views --- estate/views/estate_property_views.xml | 81 ++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 825ae24d7d4..71ad092c9e1 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -5,4 +5,85 @@ estate_property list,form + + + estate.property.list + estate_property + + + + + + + + + + + + + + + estate.property.list + estate_property + +
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + estate.property.search + estate_property + + + + + + + + + + + + + + + + \ No newline at end of file From 57ccb87d05d9045dae0424e6b3ac2f769812a71a Mon Sep 17 00:00:00 2001 From: "Emmanuel Pire (empir)" Date: Tue, 15 Sep 2026 16:30:43 +0200 Subject: [PATCH 08/13] [FIX] estate: rename model estate_property to estate.property --- estate/models/estate_property.py | 2 +- estate/views/estate_property_views.xml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 3b503886ad0..ab6e915b7fb 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -4,7 +4,7 @@ class EstateProperty(models.Model): - _name = "estate_property" + _name = "estate.property" _description = "Real estate properties" name = fields.Char(required=True, default="Unknown") diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 71ad092c9e1..f37cfde2cf9 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -2,13 +2,13 @@ Properties - estate_property + estate.property list,form estate.property.list - estate_property + estate.property @@ -24,7 +24,7 @@ estate.property.list - estate_property + estate.property
@@ -66,7 +66,7 @@ estate.property.search - estate_property + estate.property From 5b1be284623e2633d9fd86cd98a3708e92fdfd03 Mon Sep 17 00:00:00 2001 From: "Emmanuel Pire (empir)" Date: Wed, 16 Sep 2026 09:48:21 +0200 Subject: [PATCH 09/13] [IMP] estate: chapter 7: relations --- estate/models/__init__.py | 3 ++ estate/models/estate_property.py | 5 +++ estate/models/property_offer.py | 18 ++++++++ estate/models/property_tag.py | 8 ++++ estate/models/property_type.py | 8 ++++ estate/security/ir.model.access.csv | 5 ++- estate/views/estate_menus.xml | 4 ++ estate/views/estate_property_views.xml | 58 +++++++++++++++++++++++++- 8 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 estate/models/property_offer.py create mode 100644 estate/models/property_tag.py create mode 100644 estate/models/property_type.py diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 5e1963c9d2f..fc7779d569a 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1,4 @@ from . import estate_property +from . import property_type +from . import property_tag +from . import property_offer diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index ab6e915b7fb..36775e6ba03 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -45,3 +45,8 @@ class EstateProperty(models.Model): ("west", "West"), ], ) + property_type_id = fields.Many2one("estate.property.type", string="Property type") + buyer_id = fields.Many2one("res.partner", string="Buyer", copy=False) + salesperson_id = fields.Many2one("res.users", string="Salesperson", default=lambda self: self.env.user) + tag_ids = fields.Many2many("estate.property.tag", string="Tags") + offer_ids = fields.One2many("estate.property.offer", inverse_name="property_id", string="Offers") diff --git a/estate/models/property_offer.py b/estate/models/property_offer.py new file mode 100644 index 00000000000..43f23ea4232 --- /dev/null +++ b/estate/models/property_offer.py @@ -0,0 +1,18 @@ +from odoo import fields, models + + +class PropertyOffer(models.Model): + _name = "estate.property.offer" + _description = "Real estate property offers" + + price = fields.Float() + status = fields.Selection( + string="Status", + selection=[ + ("accepted", "Accepted"), + ("refused", "Refused"), + ], + copy=False, + ) + partner_id = fields.Many2one("res.partner", required=True) + property_id = fields.Many2one("estate.property", required=True) diff --git a/estate/models/property_tag.py b/estate/models/property_tag.py new file mode 100644 index 00000000000..836ca353cd4 --- /dev/null +++ b/estate/models/property_tag.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class PropertyTag(models.Model): + _name = "estate.property.tag" + _description = "Real estate property tags" + + name = fields.Char(required=True) diff --git a/estate/models/property_type.py b/estate/models/property_type.py new file mode 100644 index 00000000000..30dd64b7230 --- /dev/null +++ b/estate/models/property_type.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class PropertyType(models.Model): + _name = "estate.property.type" + _description = "Real estate property types" + + name = fields.Char(required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 9dd28f6632a..0aa97cf897c 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,2 +1,5 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink -access_estate_property_user,estate.estate_property.user,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file +access_estate_property_user,estate.estate_property.user,model_estate_property,base.group_user,1,1,1,1 +access_estate_property_type_user,estate.estate_property_type.user,model_estate_property_type,base.group_user,1,1,1,1 +access_estate_property_tag_user,estate.estate_property_tag.user,model_estate_property_tag,base.group_user,1,1,1,1 +access_estate_property_offer_user,estate.estate_property_offer.user,model_estate_property_offer,base.group_user,1,1,1,1 diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index 4a794f7aa4d..50089a9365d 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -4,5 +4,9 @@ + + + + \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index f37cfde2cf9..18f1e24bd63 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -12,6 +12,7 @@ + @@ -23,7 +24,7 @@ - estate.property.list + estate.property.form estate.property @@ -32,9 +33,11 @@

+ + @@ -58,6 +61,15 @@ + + + + + + + + +
@@ -75,6 +87,7 @@ + @@ -86,4 +99,47 @@
+ + + Property types + estate.property.type + list,form + + + + Property tags + estate.property.tag + list,form + + + + estate.property.offer.list + estate.property.offer + + + + + + + + + + + + estate.property.offer.form + estate.property.offer + +
+ + + + + + + + + +
+
+
\ No newline at end of file From a4e8a1b9933f91056b2bb40e16da46bd812b950d Mon Sep 17 00:00:00 2001 From: "Emmanuel Pire (empir)" Date: Wed, 16 Sep 2026 13:06:38 +0200 Subject: [PATCH 10/13] [IMP] estate: chapter 8 --- estate/models/estate_property.py | 34 +++++++++++++++++++++++--- estate/models/property_offer.py | 34 +++++++++++++++++++++++++- estate/views/estate_property_views.xml | 7 ++++++ 3 files changed, 71 insertions(+), 4 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 36775e6ba03..c8217c884a6 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,6 +1,6 @@ from dateutil.relativedelta import relativedelta -from odoo import fields, models +from odoo import api, fields, models class EstateProperty(models.Model): @@ -47,6 +47,34 @@ class EstateProperty(models.Model): ) property_type_id = fields.Many2one("estate.property.type", string="Property type") buyer_id = fields.Many2one("res.partner", string="Buyer", copy=False) - salesperson_id = fields.Many2one("res.users", string="Salesperson", default=lambda self: self.env.user) + salesperson_id = fields.Many2one( + "res.users", string="Salesperson", default=lambda self: self.env.user + ) tag_ids = fields.Many2many("estate.property.tag", string="Tags") - offer_ids = fields.One2many("estate.property.offer", inverse_name="property_id", string="Offers") + offer_ids = fields.One2many( + "estate.property.offer", inverse_name="property_id", string="Offers" + ) + total_area = fields.Integer(compute="_compute_total_area") + best_price = fields.Float(compute="_compute_best_price") + + @api.depends("living_area", "garden_area") + def _compute_total_area(self): + for record in self: + record.total_area = record.living_area + record.garden_area + + @api.depends("offer_ids.price") + def _compute_best_price(self): + for record in self: + if len(record.offer_ids) > 0: + record.best_price = max(record.offer_ids.mapped("price")) + else: + record.best_price = 0 + + @api.onchange("garden") + def _onchange_garden(self): + if self.garden: + self.garden_area = 10 + self.garden_orientation = "north" + else: + self.garden_area = 0 + self.garden_orientation = None diff --git a/estate/models/property_offer.py b/estate/models/property_offer.py index 43f23ea4232..88086624454 100644 --- a/estate/models/property_offer.py +++ b/estate/models/property_offer.py @@ -1,4 +1,6 @@ -from odoo import fields, models +from dateutil.relativedelta import relativedelta + +from odoo import api, fields, models class PropertyOffer(models.Model): @@ -16,3 +18,33 @@ class PropertyOffer(models.Model): ) partner_id = fields.Many2one("res.partner", required=True) property_id = fields.Many2one("estate.property", required=True) + validity = fields.Integer(default=7) + date_deadline = fields.Date( + compute="_compute_date_deadline", + inverse="_inverse_date_deadline", + ) + + @api.depends("validity") + def _compute_date_deadline(self): + for record in self: + if record.validity: + crdate = record.create_date or fields.Date.today() + record.date_deadline = crdate + relativedelta( + days=record.validity, + ) + + def _inverse_date_deadline(self): + for record in self: + if record.date_deadline: + record.validity = self._compute_validity() + + # inverse doesn't update the UI when date_deadline changes, + # so we define an additional onchange to not confuse users + @api.onchange("date_deadline") + def _onchange_date_deadline(self): + self.validity = self._compute_validity() + + def _compute_validity(self): + crdate = self.create_date or fields.Date.today() + delta = self.date_deadline - crdate.date() + return delta.days diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 18f1e24bd63..bbd5bd99885 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -43,6 +43,7 @@ + @@ -58,6 +59,7 @@ + @@ -120,6 +122,9 @@ + + + @@ -136,6 +141,8 @@ + + From 047ef1afba12d99ef076130e042db8117f147e96 Mon Sep 17 00:00:00 2001 From: "Emmanuel Pire (empir)" Date: Wed, 16 Sep 2026 13:39:58 +0200 Subject: [PATCH 11/13] [FIX] estate: fix _compute_validity --- estate/models/property_offer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/estate/models/property_offer.py b/estate/models/property_offer.py index 88086624454..bfb1623fa8a 100644 --- a/estate/models/property_offer.py +++ b/estate/models/property_offer.py @@ -46,5 +46,5 @@ def _onchange_date_deadline(self): def _compute_validity(self): crdate = self.create_date or fields.Date.today() - delta = self.date_deadline - crdate.date() + delta = self.date_deadline - crdate return delta.days From 59b6b3b6067193a92d5eeb6a56724e3baa63f540 Mon Sep 17 00:00:00 2001 From: "Emmanuel Pire (empir)" Date: Wed, 16 Sep 2026 13:55:13 +0200 Subject: [PATCH 12/13] [IMP] estate: chapter 9 --- estate/models/estate_property.py | 25 ++++++++++++++++++++-- estate/models/property_offer.py | 29 ++++++++++++++++++++++++++ estate/views/estate_property_views.xml | 11 ++++++++-- 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index c8217c884a6..00e7366e14e 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,6 +1,7 @@ from dateutil.relativedelta import relativedelta from odoo import api, fields, models +from odoo.exceptions import UserError class EstateProperty(models.Model): @@ -48,11 +49,15 @@ class EstateProperty(models.Model): property_type_id = fields.Many2one("estate.property.type", string="Property type") buyer_id = fields.Many2one("res.partner", string="Buyer", copy=False) salesperson_id = fields.Many2one( - "res.users", string="Salesperson", default=lambda self: self.env.user + "res.users", + string="Salesperson", + default=lambda self: self.env.user, ) tag_ids = fields.Many2many("estate.property.tag", string="Tags") offer_ids = fields.One2many( - "estate.property.offer", inverse_name="property_id", string="Offers" + "estate.property.offer", + inverse_name="property_id", + string="Offers", ) total_area = fields.Integer(compute="_compute_total_area") best_price = fields.Float(compute="_compute_best_price") @@ -78,3 +83,19 @@ def _onchange_garden(self): else: self.garden_area = 0 self.garden_orientation = None + + def action_cancel(self): + for record in self: + if record.state == "sold": + msg = "Sold properties can not be cancelled" + raise UserError(msg) + record.state = "cancelled" + return True + + def action_sold(self): + for record in self: + if record.state == "cancelled": + msg = "Cancelled properties can not be sold" + raise UserError(msg) + record.state = "sold" + return True diff --git a/estate/models/property_offer.py b/estate/models/property_offer.py index bfb1623fa8a..ed65e4b4f8a 100644 --- a/estate/models/property_offer.py +++ b/estate/models/property_offer.py @@ -1,6 +1,7 @@ from dateutil.relativedelta import relativedelta from odoo import api, fields, models +from odoo.exceptions import UserError class PropertyOffer(models.Model): @@ -48,3 +49,31 @@ def _compute_validity(self): crdate = self.create_date or fields.Date.today() delta = self.date_deadline - crdate return delta.days + + def action_accept(self): + # prevent accepting multiple offers + if len(self) > 1: + msg = "Only one offer can be accepted at a time" + raise UserError(msg) + + # no need to process an already accepted offer + if self.status == "accepted": + return True + + # ensure no other offer is already accepted + accepted_offers = [ + offer for offer in self.property_id.offer_ids if offer.status == "accepted" + ] + if len(accepted_offers) > 0: + msg = "Another offer was already accepted" + raise UserError(msg) + + self.status = "accepted" + self.property_id.buyer_id = self.partner_id + self.property_id.selling_price = self.price + return True + + def action_refuse(self): + for record in self: + record.status = "refused" + return True diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index bbd5bd99885..0811ec1924a 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -28,15 +28,21 @@ estate.property
+
+

- + Tags: +
+ @@ -124,7 +130,8 @@ - +