From 23ccdb799f964b654788ab3649b80f27d2e6dc8b Mon Sep 17 00:00:00 2001 From: "jean (jebou)" Date: Mon, 20 Jul 2026 16:33:14 +0200 Subject: [PATCH 1/9] [ADD] estate: add estate module for tutoriel --- estate/__init__.py | 1 + estate/__manifest__.py | 7 +++++++ estate/models/__init__.py | 1 + estate/models/estate_property.py | 20 ++++++++++++++++++++ 4 files changed, 29 insertions(+) create mode 100644 estate/__init__.py create mode 100644 estate/__manifest__.py 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 new file mode 100644 index 00000000000..9a7e03eded3 --- /dev/null +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/estate/__manifest__.py b/estate/__manifest__.py new file mode 100644 index 00000000000..10540064fb3 --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,7 @@ +{ + 'name': 'Real Estate', + 'depends': [ + 'base' + ], + 'application': True, +} \ No newline at end of file diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..f4c8fd6db6d --- /dev/null +++ b/estate/models/__init__.py @@ -0,0 +1 @@ +from . import estate_property \ No newline at end of file diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py new file mode 100644 index 00000000000..e0df3e1d0ec --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,20 @@ +from odoo import fields, models + +class EstateProperty(models.Model): + _name = "estate.property" + _description = "Table for property test tutoriel" + + 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(selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')]) + From 7f39dc369bb1e615dac20a705e93738be8182032 Mon Sep 17 00:00:00 2001 From: "jean (jebou)" Date: Wed, 22 Jul 2026 09:14:38 +0200 Subject: [PATCH 2/9] [ADD] estate: add access rights for estate model --- estate/__manifest__.py | 5 ++++- estate/data/ir.model.access.csv | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 estate/data/ir.model.access.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 10540064fb3..1754b7eb0ab 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,7 +1,10 @@ { 'name': 'Real Estate', + 'application': True, 'depends': [ 'base' ], - 'application': True, + 'data': [ + 'data/ir.model.access.csv' + ] } \ No newline at end of file diff --git a/estate/data/ir.model.access.csv b/estate/data/ir.model.access.csv new file mode 100644 index 00000000000..e57ec5e4eb5 --- /dev/null +++ b/estate/data/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +estate.access_estate_property,access_estate_property,estate.model_estate_property,base.group_user,1,0,0,0 \ No newline at end of file From 6549326657bbb6efea7037e4cebc0771a51e304d Mon Sep 17 00:00:00 2001 From: "jean (jebou)" Date: Wed, 22 Jul 2026 11:22:33 +0200 Subject: [PATCH 3/9] [ADD] estate: add views and menus to estate model. Also change access rights folder --- estate/__init__.py | 2 +- estate/__manifest__.py | 16 ++++---- estate/models/__init__.py | 2 +- estate/models/estate_property.py | 38 ++++++++++++++++--- estate/{data => security}/ir.model.access.csv | 2 +- estate/views/estate_menus.xml | 7 ++++ estate/views/estate_property_views.xml | 7 ++++ 7 files changed, 57 insertions(+), 17 deletions(-) rename estate/{data => security}/ir.model.access.csv (77%) create mode 100644 estate/views/estate_menus.xml create mode 100644 estate/views/estate_property_views.xml diff --git a/estate/__init__.py b/estate/__init__.py index 9a7e03eded3..0650744f6bc 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -1 +1 @@ -from . import models \ No newline at end of file +from . import models diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 1754b7eb0ab..11aad40aebc 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,10 +1,10 @@ { - 'name': 'Real Estate', - 'application': True, - 'depends': [ - 'base' + "name": "Real Estate", + "application": True, + "depends": ["base"], + "data": [ + "security/ir.model.access.csv", + "views/estate_property_views.xml", + "views/estate_menus.xml", ], - 'data': [ - 'data/ir.model.access.csv' - ] -} \ No newline at end of file +} diff --git a/estate/models/__init__.py b/estate/models/__init__.py index f4c8fd6db6d..5e1963c9d2f 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1 @@ -from . import estate_property \ No newline at end of file +from . import estate_property diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index e0df3e1d0ec..d840277c6ec 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,20 +1,46 @@ +from typing import Required + from odoo import fields, models + class EstateProperty(models.Model): _name = "estate.property" _description = "Table for property test tutoriel" - name = fields.Char(required=True) + name = fields.Char(required=True, default="Unknown") + active = fields.Boolean(default=True) + state = fields.Selection( + selection=[ + ("new", "New"), + ("offer received", "Offer Received"), + ("offer accepted", "Offer Accepted"), + ("sold", "Sold"), + ("cancelled", "Cancelled"), + ], + required=True, + copy=False, + default="new", + ) description = fields.Text() postcode = fields.Char() - date_availability = fields.Date() + date_availability = fields.Date( + copy=False, + default=fields.Date.add(fields.Date.today(), 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() garden = fields.Boolean() garden_area = fields.Integer() - garden_orientation = fields.Selection(selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')]) - + garden_orientation = fields.Selection( + selection=[ + ("north", "North"), + ("south", "South"), + ("east", "East"), + ("west", "West"), + ] + ) + last_seen = fields.Datetime("Last Seen", default=fields.Datetime.now) diff --git a/estate/data/ir.model.access.csv b/estate/security/ir.model.access.csv similarity index 77% rename from estate/data/ir.model.access.csv rename to estate/security/ir.model.access.csv index e57ec5e4eb5..98f4671fb0d 100644 --- a/estate/data/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,2 +1,2 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -estate.access_estate_property,access_estate_property,estate.model_estate_property,base.group_user,1,0,0,0 \ No newline at end of file +estate.access_estate_property,access_estate_property,estate.model_estate_property,base.group_user,1,1,1,1 diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml new file mode 100644 index 00000000000..b7c5f424ac4 --- /dev/null +++ b/estate/views/estate_menus.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml new file mode 100644 index 00000000000..f2e197b114a --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,7 @@ + + + Properties + estate.property + list,form + + From 44306a48db87d29092cad229dea0409b1998557d Mon Sep 17 00:00:00 2001 From: "jean (jebou)" Date: Wed, 22 Jul 2026 14:46:31 +0200 Subject: [PATCH 4/9] [ADD] estate: add basics views (form, search) to estate --- estate/models/estate_property.py | 9 ++- estate/views/estate_menus.xml | 4 +- estate/views/estate_property_views.xml | 82 +++++++++++++++++++++++++- 3 files changed, 86 insertions(+), 9 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index d840277c6ec..580f249b920 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,5 +1,3 @@ -from typing import Required - from odoo import fields, models @@ -7,7 +5,7 @@ class EstateProperty(models.Model): _name = "estate.property" _description = "Table for property test tutoriel" - name = fields.Char(required=True, default="Unknown") + name = fields.Char("Title", required=True, default="Unknown") active = fields.Boolean(default=True) state = fields.Selection( selection=[ @@ -24,17 +22,18 @@ class EstateProperty(models.Model): description = fields.Text() postcode = fields.Char() date_availability = fields.Date( + "Available From", copy=False, default=fields.Date.add(fields.Date.today(), months=3), ) expected_price = fields.Float(required=True) selling_price = fields.Float(readonly=True, copy=False) bedrooms = fields.Integer(default=2) - living_area = fields.Integer() + living_area = fields.Integer("Living Area (sqm)") facades = fields.Integer() garage = fields.Boolean() garden = fields.Boolean() - garden_area = fields.Integer() + garden_area = fields.Integer("Garden Area (sqm)") garden_orientation = fields.Selection( selection=[ ("north", "North"), diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index b7c5f424ac4..49049caec27 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -1,7 +1,7 @@ - + - + \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index f2e197b114a..ea41dba2860 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,7 +1,85 @@ - + Properties estate.property list,form - + + + estate.list.view + estate.property + + + + + + + + + + + + + + + estate.search.view + estate.property + + + + + + + + + + + + + + + estate.form.view + estate.property + +
+ + +
+

+ +

+ +
+ + + + + + + + + + + +
+ + + + + + + + + + + + + + +
+
+
+
+ \ No newline at end of file From dedcc8fc7b43a6b0fa9fad76c124187ca6dae601 Mon Sep 17 00:00:00 2001 From: "jean (jebou)" Date: Thu, 23 Jul 2026 13:30:59 +0200 Subject: [PATCH 5/9] [ADD] estate: add property_tag, property_offer, property_type and their views. Try onchange, compute and inverse --- estate/__manifest__.py | 3 ++ estate/models/__init__.py | 3 ++ estate/models/estate_property.py | 30 ++++++++++++++++++- estate/models/estate_property_offer.py | 30 +++++++++++++++++++ estate/models/estate_property_tag.py | 8 +++++ estate/models/estate_property_type.py | 8 +++++ estate/security/ir.model.access.csv | 3 ++ estate/views/estate_menus.xml | 10 +++++-- estate/views/estate_property_offer_views.xml | 13 ++++++++ estate/views/estate_property_tag_views.xml | 17 +++++++++++ estate/views/estate_property_type_views.xml | 17 +++++++++++ estate/views/estate_property_views.xml | 31 +++++++++++++------- 12 files changed, 158 insertions(+), 15 deletions(-) create mode 100644 estate/models/estate_property_offer.py create mode 100644 estate/models/estate_property_tag.py create mode 100644 estate/models/estate_property_type.py create mode 100644 estate/views/estate_property_offer_views.xml create mode 100644 estate/views/estate_property_tag_views.xml create mode 100644 estate/views/estate_property_type_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 11aad40aebc..4cdb57a9b05 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -5,6 +5,9 @@ "data": [ "security/ir.model.access.csv", "views/estate_property_views.xml", + "views/estate_property_type_views.xml", + "views/estate_property_tag_views.xml", + "views/estate_property_offer_views.xml", "views/estate_menus.xml", ], } diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 5e1963c9d2f..2f1821a39c1 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1,4 @@ from . import estate_property +from . import estate_property_type +from . import estate_property_tag +from . import estate_property_offer diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 580f249b920..34f2a1153fa 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,4 @@ -from odoo import fields, models +from odoo import api, fields, models class EstateProperty(models.Model): @@ -43,3 +43,31 @@ class EstateProperty(models.Model): ] ) last_seen = fields.Datetime("Last Seen", default=fields.Datetime.now) + property_type_id = fields.Many2one("estate.property.type") + salesperson_id = fields.Many2one("res.users", default=lambda self: self.env.user) + buyer_id = fields.Many2one("res.partner", copy=False) + tags_ids = fields.Many2many("estate.property.tag") + offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offer") + total_area = fields.Integer(compute="_total_area", readonly=True) + best_price = fields.Float(compute="_best_price", readonly=True, string="Best Offer") + + @api.onchange("garden") + def _onchange_garden(self): + if self.garden: + self.garden_area = 10 + self.garden_orientation = "north" + return + self.garden_orientation = self.garden_area = None + + @api.depends("offer_ids.price") + def _best_price(self): + for record in self: + if len(best := self.mapped("offer_ids.price")) < 1: + record.best_price = 0 + continue + record.best_price = max(best) + + @api.depends("living_area", "garden_area") + def _total_area(self): + for record in self: + record.total_area = record.garden_area + record.living_area diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py new file mode 100644 index 00000000000..493cdd420ea --- /dev/null +++ b/estate/models/estate_property_offer.py @@ -0,0 +1,30 @@ +from odoo import api, fields, models + + +class EstatePropertyOffer(models.Model): + _name = "estate.property.offer" + _description = "Table for offers of a property" + + price = fields.Float("Price") + status = fields.Selection( + string="Status", + copy=False, + selection=[("accepted", "Accepted"), ("refused", "Refused")], + ) + partner_id = fields.Many2one("res.partner", required=True, string="Partner") + property_id = fields.Many2one("estate.property", required=True) + validity = fields.Integer(default=7, string="Validity (days)") + date_deadline = fields.Datetime( + compute="_date_deadline", inverse="_set_date_deadline" + ) + + @api.depends("create_date", "validity") + def _date_deadline(self): + for record in self: + record.date_deadline = fields.Datetime.add( + record.create_date or fields.Datetime.now(), days=record.validity + ) + + def _set_date_deadline(self): + for record in self: + record.validity = (record.date_deadline - record.create_date).days diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py new file mode 100644 index 00000000000..068fe86be74 --- /dev/null +++ b/estate/models/estate_property_tag.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class EstatePropertyTag(models.Model): + _name = "estate.property.tag" + _description = "Table for tags of a property" + + name = fields.Char(required=True) diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py new file mode 100644 index 00000000000..605558c41a7 --- /dev/null +++ b/estate/models/estate_property_type.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class EstatePropertyType(models.Model): + _name = "estate.property.type" + _description = "Table for type of property" + + name = fields.Char(required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 98f4671fb0d..0c0b62b7fee 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 estate.access_estate_property,access_estate_property,estate.model_estate_property,base.group_user,1,1,1,1 +estate.access_estate_property_type,access_estate_property_type,estate.model_estate_property_type,base.group_user,1,1,1,1 +estate.access_estate_property_tag,access_estate_property_tag,estate.model_estate_property_tag,base.group_user,1,1,1,1 +estate.access_estate_property_offer,access_estate_property_offer,estate.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 49049caec27..9bbcb2cef11 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -1,7 +1,11 @@ - - - + + + + + + + \ No newline at end of file diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml new file mode 100644 index 00000000000..18e65400b88 --- /dev/null +++ b/estate/views/estate_property_offer_views.xml @@ -0,0 +1,13 @@ + + + estate.property.offer.list.view + estate.property.offer + + + + + + + + + \ No newline at end of file diff --git a/estate/views/estate_property_tag_views.xml b/estate/views/estate_property_tag_views.xml new file mode 100644 index 00000000000..259346b9276 --- /dev/null +++ b/estate/views/estate_property_tag_views.xml @@ -0,0 +1,17 @@ + + + Property tags + estate.property.tag + list,form + + + + estate.list.view + estate.property.type + + + + + + + \ No newline at end of file diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml new file mode 100644 index 00000000000..f465264d3cc --- /dev/null +++ b/estate/views/estate_property_type_views.xml @@ -0,0 +1,17 @@ + + + Property types + estate.property.type + list,form + + + + estate.list.view + estate.property.type + + + + + + + \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index ea41dba2860..64128d03e0d 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,11 +1,11 @@ - + Properties estate.property list,form - + estate.list.view estate.property @@ -45,22 +45,21 @@
+
+

+ +

+ +
-
-

- -

- -
- - - + +
@@ -75,6 +74,16 @@ + + + + + + + + + + From 02cae9a7521187b72efabe59ea4cf452f8daebd6 Mon Sep 17 00:00:00 2001 From: "jean (jebou)" Date: Thu, 23 Jul 2026 15:10:13 +0200 Subject: [PATCH 6/9] [LINT] estate: try to correct self_in_self rule --- estate/models/estate_property.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 34f2a1153fa..ac5fec3a6dd 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -40,7 +40,7 @@ class EstateProperty(models.Model): ("south", "South"), ("east", "East"), ("west", "West"), - ] + ], ) last_seen = fields.Datetime("Last Seen", default=fields.Datetime.now) property_type_id = fields.Many2one("estate.property.type") @@ -62,10 +62,7 @@ def _onchange_garden(self): @api.depends("offer_ids.price") def _best_price(self): for record in self: - if len(best := self.mapped("offer_ids.price")) < 1: - record.best_price = 0 - continue - record.best_price = max(best) + record.best_price = max(record.offer_ids.mapped("price"), default=0) @api.depends("living_area", "garden_area") def _total_area(self): From 30e80c0cfc8ade118aab206a38c3f553d7102c35 Mon Sep 17 00:00:00 2001 From: "jean (jebou)" Date: Thu, 23 Jul 2026 15:47:01 +0200 Subject: [PATCH 7/9] [LINT] estate: add author and license --- estate/__manifest__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 4cdb57a9b05..f9acf3307ad 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,5 +1,7 @@ { "name": "Real Estate", + "author": "Jean (jebou)", + "license": "LGPL-3", "application": True, "depends": ["base"], "data": [ From 5c1795746b4949dcfddacf9cf6bc24d1ffe3cafe Mon Sep 17 00:00:00 2001 From: "jean (jebou)" Date: Thu, 23 Jul 2026 16:48:23 +0200 Subject: [PATCH 8/9] [IMP] estate: add sold, cancelled, accept, refuse buttons --- estate/models/estate_property.py | 15 ++++++++++++++- estate/models/estate_property_offer.py | 18 ++++++++++++++++-- estate/views/estate_property_offer_views.xml | 4 ++++ estate/views/estate_property_views.xml | 5 +++++ 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index ac5fec3a6dd..aad5c7b4471 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,5 @@ from odoo import api, fields, models +from odoo.exceptions import UserError class EstateProperty(models.Model): @@ -45,7 +46,7 @@ class EstateProperty(models.Model): last_seen = fields.Datetime("Last Seen", default=fields.Datetime.now) property_type_id = fields.Many2one("estate.property.type") salesperson_id = fields.Many2one("res.users", default=lambda self: self.env.user) - buyer_id = fields.Many2one("res.partner", copy=False) + buyer_id = fields.Many2one("res.partner", copy=False, readonly=True) tags_ids = fields.Many2many("estate.property.tag") offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offer") total_area = fields.Integer(compute="_total_area", readonly=True) @@ -68,3 +69,15 @@ def _best_price(self): def _total_area(self): for record in self: record.total_area = record.garden_area + record.living_area + + def cancel(self): + if self.state == "sold": + e = "A sold property cannot be cancelled" + raise UserError(e) + self.state = "cancelled" + + def sold(self): + if self.state == "cancelled": + e = "A cancelled property cannot be sold" + raise UserError(e) + self.state = "sold" diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index 493cdd420ea..4813e8fb1a9 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -15,16 +15,30 @@ class EstatePropertyOffer(models.Model): property_id = fields.Many2one("estate.property", required=True) validity = fields.Integer(default=7, string="Validity (days)") date_deadline = fields.Datetime( - compute="_date_deadline", inverse="_set_date_deadline" + compute="_date_deadline", + inverse="_set_date_deadline", ) @api.depends("create_date", "validity") def _date_deadline(self): for record in self: record.date_deadline = fields.Datetime.add( - record.create_date or fields.Datetime.now(), days=record.validity + record.create_date or fields.Datetime.now(), + days=record.validity, ) def _set_date_deadline(self): for record in self: record.validity = (record.date_deadline - record.create_date).days + + def accept(self): + self.property_id.offer_ids.status = "refused" + self.status = "accepted" + self.property_id.state = "offer accepted" + self.property_id.selling_price = self.price + self.property_id.buyer_id = self.partner_id + + def refuse(self): + self.status = "refused" + self.property_id.selling_price = None + self.property_id.buyer_id = None diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 18e65400b88..40e86db5bbe 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -6,6 +6,10 @@ +