From 24e63d0a972b00641e43120464ef84bb697d9e03 Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Mon, 20 Oct 2025 13:53:50 +0200 Subject: [PATCH 01/33] [ADD] estate: create the app --- estate/__init__.py | 4 ++++ estate/__manifest__.py | 24 ++++++++++++++++++++++++ 2 files changed, 28 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..f2d9c576fbd --- /dev/null +++ b/estate/__init__.py @@ -0,0 +1,4 @@ +from . import models + + +from odoo import api, SUPERUSER_ID \ No newline at end of file diff --git a/estate/__manifest__.py b/estate/__manifest__.py new file mode 100644 index 00000000000..73ac57e9439 --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,24 @@ +{ + 'name': "Real Estate", + + 'summary': """ + Real Estate Tuto" + """, + + 'description': """ + Starting tutorial real estate" + """, + + 'author': "Odoo", + 'website': "https://www.odoo.com/", + 'category': 'Tutorials', + 'version': '0.1', + 'application': True, + 'depends': ['base'], + + 'data': [], + 'assets': { + + }, + 'license': 'AGPL-3' +} From 8d65340930dce9a305a801bf542d55e5ee9cae48 Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Mon, 20 Oct 2025 14:51:16 +0200 Subject: [PATCH 02/33] [ADD] estate: added models and basic field --- estate/models/__init__.py | 1 + estate/models/estate_proprety.py | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 estate/models/__init__.py create mode 100644 estate/models/estate_proprety.py diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..75cf03f8521 --- /dev/null +++ b/estate/models/__init__.py @@ -0,0 +1 @@ +from . import estate_proprety \ No newline at end of file diff --git a/estate/models/estate_proprety.py b/estate/models/estate_proprety.py new file mode 100644 index 00000000000..3b91debfb8c --- /dev/null +++ b/estate/models/estate_proprety.py @@ -0,0 +1,22 @@ +from odoo import fields, models + +class EstateProprety(models.Model): + _name = "estate.proprety" + _description = "Estate Proprety" + + name = fields.Char('Estate Name', required=True) + description = fields.Text('Estate Description', required=True) + postcode = fields.Char('Estate Postcode', required=True) + date_availablity = fields.Date('Estate Availability Date', required=True) + expected_price = fields.Float('Estate expected price', required=True) + selling_price = fields.Float('Estate selling price', required=True) + bedrooms = fields.Integer('Number of bedrooms',required=True) + facades = fields.Integer('Number of facades') + garage = fields.Boolean('Has a garage ?') + garden = fields.Boolean('Has a garden ?') + garden_area = fields.Integer('Garden area') + garden_orientation = fields.Selection( + string='Type', + selection=[('north','North'),('south','South'),('west','West'),('east','East')], + help="Garden orientation selection" + ) \ No newline at end of file From a1f33148390e5cce765781a078485f1adc266cf8 Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Mon, 20 Oct 2025 15:09:50 +0200 Subject: [PATCH 03/33] [FIX] estate: fixed style --- estate/__init__.py | 2 +- estate/models/__init__.py | 2 +- estate/models/estate_proprety.py | 8 +++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/estate/__init__.py b/estate/__init__.py index f2d9c576fbd..1ccd6b6fffa 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -1,4 +1,4 @@ from . import models -from odoo import api, SUPERUSER_ID \ No newline at end of file +from odoo import api, SUPERUSER_ID diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 75cf03f8521..2367d7d23ba 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1 @@ -from . import estate_proprety \ No newline at end of file +from . import estate_proprety diff --git a/estate/models/estate_proprety.py b/estate/models/estate_proprety.py index 3b91debfb8c..d28e1a02af7 100644 --- a/estate/models/estate_proprety.py +++ b/estate/models/estate_proprety.py @@ -4,19 +4,21 @@ class EstateProprety(models.Model): _name = "estate.proprety" _description = "Estate Proprety" + name = fields.Char('Estate Name', required=True) description = fields.Text('Estate Description', required=True) postcode = fields.Char('Estate Postcode', required=True) date_availablity = fields.Date('Estate Availability Date', required=True) expected_price = fields.Float('Estate expected price', required=True) selling_price = fields.Float('Estate selling price', required=True) - bedrooms = fields.Integer('Number of bedrooms',required=True) + bedrooms = fields.Integer('Number of bedrooms', required=True) facades = fields.Integer('Number of facades') garage = fields.Boolean('Has a garage ?') garden = fields.Boolean('Has a garden ?') garden_area = fields.Integer('Garden area') garden_orientation = fields.Selection( string='Type', - selection=[('north','North'),('south','South'),('west','West'),('east','East')], + selection=[('north', 'North'), ('south', 'South'), ('west', 'West'), ('east', 'East')], help="Garden orientation selection" - ) \ No newline at end of file + ) + \ No newline at end of file From 2bdaaf843ea8479b66d658b1be8aa74466225983 Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Mon, 20 Oct 2025 15:14:44 +0200 Subject: [PATCH 04/33] [FIX] estate: fixed style --- estate/models/estate_proprety.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/estate/models/estate_proprety.py b/estate/models/estate_proprety.py index d28e1a02af7..a7cddfccefe 100644 --- a/estate/models/estate_proprety.py +++ b/estate/models/estate_proprety.py @@ -1,10 +1,10 @@ from odoo import fields, models + class EstateProprety(models.Model): _name = "estate.proprety" _description = "Estate Proprety" - name = fields.Char('Estate Name', required=True) description = fields.Text('Estate Description', required=True) postcode = fields.Char('Estate Postcode', required=True) @@ -21,4 +21,3 @@ class EstateProprety(models.Model): selection=[('north', 'North'), ('south', 'South'), ('west', 'West'), ('east', 'East')], help="Garden orientation selection" ) - \ No newline at end of file From 8f770020f7c29159b75af2efeedbc1f80192319e Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Mon, 20 Oct 2025 15:38:17 +0200 Subject: [PATCH 05/33] [ADD] estate: added security --- estate/__manifest__.py | 4 +++- estate/security/ir.model.access.csv | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 73ac57e9439..6d3221e89be 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -16,7 +16,9 @@ 'application': True, 'depends': ['base'], - 'data': [], + 'data': [ + 'security/ir.model.access.csv', + ], 'assets': { }, diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..daf139e1020 --- /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_proprety,estate.proprety,model_estate_proprety,base.group_user,1,1,1,1 \ No newline at end of file From a032b7d1f4584ce1a57162f0faf007bdd44e2658 Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Tue, 21 Oct 2025 10:30:33 +0200 Subject: [PATCH 06/33] [FIX] estate: fixed typos --- estate/__manifest__.py | 4 ++++ estate/models/__init__.py | 2 +- estate/models/estate_property.py | 31 +++++++++++++++++++++++++++++ estate/models/estate_proprety.py | 23 --------------------- estate/security/ir.model.access.csv | 2 +- 5 files changed, 37 insertions(+), 25 deletions(-) create mode 100644 estate/models/estate_property.py delete mode 100644 estate/models/estate_proprety.py diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 6d3221e89be..78e757df6cb 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -18,9 +18,13 @@ 'data': [ 'security/ir.model.access.csv', + 'views/estate_property_views.xml', + 'views/estate_menus.xml', + ], 'assets': { }, 'license': 'AGPL-3' } + diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 2367d7d23ba..5e1963c9d2f 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1 @@ -from . import estate_proprety +from . import estate_property diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py new file mode 100644 index 00000000000..0ec6f4fda83 --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,31 @@ +from odoo import fields, models +from dateutil.relativedelta import relativedelta + + +class Estateproperty(models.Model): + _name = "estate.property" + _description = "Estate property" + + name = fields.Char('Title', required=True) + description = fields.Text('Description', required=True) + postcode = fields.Char('Postcode', required=True) + date_availablity = fields.Date('Available From', copy=False, default=fields.Datetime.now()+relativedelta(months=3)) + expected_price = fields.Float('Expected Price', required=True) + selling_price = fields.Float('Selling Price', readonly=True, copy=False) + bedrooms = fields.Integer('Bedrooms', default=2) + facades = fields.Integer('Facades') + garage = fields.Boolean('Garage') + garden = fields.Boolean('Garden') + garden_area = fields.Integer('Garden area (sqm)') + garden_orientation = fields.Selection( + string='Type', + selection=[('north', 'North'), ('south', 'South'), ('west', 'West'), ('east', 'East')], + help="Garden orientation selection" + ) + active = fields.Boolean('Active', default=True) + state = fields.Selection( + string='State', + selection=[('new', 'New'), ('offer received', 'Offer Received'), ('offer accepted', 'Offer Accepted'), ('sold', 'Sold'), ('cancelled', 'Cancelled')], + help="Estate state", + default=('new') + ) diff --git a/estate/models/estate_proprety.py b/estate/models/estate_proprety.py deleted file mode 100644 index a7cddfccefe..00000000000 --- a/estate/models/estate_proprety.py +++ /dev/null @@ -1,23 +0,0 @@ -from odoo import fields, models - - -class EstateProprety(models.Model): - _name = "estate.proprety" - _description = "Estate Proprety" - - name = fields.Char('Estate Name', required=True) - description = fields.Text('Estate Description', required=True) - postcode = fields.Char('Estate Postcode', required=True) - date_availablity = fields.Date('Estate Availability Date', required=True) - expected_price = fields.Float('Estate expected price', required=True) - selling_price = fields.Float('Estate selling price', required=True) - bedrooms = fields.Integer('Number of bedrooms', required=True) - facades = fields.Integer('Number of facades') - garage = fields.Boolean('Has a garage ?') - garden = fields.Boolean('Has a garden ?') - garden_area = fields.Integer('Garden area') - garden_orientation = fields.Selection( - string='Type', - selection=[('north', 'North'), ('south', 'South'), ('west', 'West'), ('east', 'East')], - help="Garden orientation selection" - ) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index daf139e1020..9ccf73e191e 100644 --- a/estate/security/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 -access_estate_proprety,estate.proprety,model_estate_proprety,base.group_user,1,1,1,1 \ No newline at end of file +access_estate_property,estate.property,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file From f2f4addaceaf603fbbb7be68e6c4d479f3aa7c1a Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Tue, 21 Oct 2025 10:30:58 +0200 Subject: [PATCH 07/33] [ADD] estate: added views --- estate/views/estate_menus.xml | 8 ++++++++ estate/views/estate_property_views.xml | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 estate/views/estate_menus.xml create mode 100644 estate/views/estate_property_views.xml diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml new file mode 100644 index 00000000000..d691e7dd1b1 --- /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..5e0ecf1cbd6 --- /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 520584545b37100d7e16b2e486274831b1201fdd Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Tue, 21 Oct 2025 10:55:15 +0200 Subject: [PATCH 08/33] [FIX] estate: styling fix --- estate/__manifest__.py | 1 - estate/models/estate_property.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 78e757df6cb..2b5085abcdb 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -27,4 +27,3 @@ }, 'license': 'AGPL-3' } - diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 0ec6f4fda83..ea950af8cc5 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -9,7 +9,7 @@ class Estateproperty(models.Model): name = fields.Char('Title', required=True) description = fields.Text('Description', required=True) postcode = fields.Char('Postcode', required=True) - date_availablity = fields.Date('Available From', copy=False, default=fields.Datetime.now()+relativedelta(months=3)) + date_availablity = fields.Date('Available From', copy=False, default=fields.Datetime.now() + relativedelta(months=3)) expected_price = fields.Float('Expected Price', required=True) selling_price = fields.Float('Selling Price', readonly=True, copy=False) bedrooms = fields.Integer('Bedrooms', default=2) From ee692d41c844cdd0f8a11edd2189b8d8fef35a38 Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Tue, 21 Oct 2025 14:44:27 +0200 Subject: [PATCH 09/33] [ADD] estate: added basic views --- estate/models/estate_property.py | 6 +-- estate/views/estate_property_views.xml | 75 ++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index ea950af8cc5..e9badcdc11c 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -9,18 +9,18 @@ class Estateproperty(models.Model): name = fields.Char('Title', required=True) description = fields.Text('Description', required=True) postcode = fields.Char('Postcode', required=True) - date_availablity = fields.Date('Available From', copy=False, default=fields.Datetime.now() + relativedelta(months=3)) + date_availability = fields.Date('Available From', copy=False, default=fields.Datetime.now() + relativedelta(months=3)) expected_price = fields.Float('Expected Price', required=True) selling_price = fields.Float('Selling Price', readonly=True, copy=False) bedrooms = fields.Integer('Bedrooms', default=2) + living_area = fields.Integer('Living Area (sqm)') facades = fields.Integer('Facades') garage = fields.Boolean('Garage') garden = fields.Boolean('Garden') garden_area = fields.Integer('Garden area (sqm)') garden_orientation = fields.Selection( - string='Type', + string='Garden Orientation', selection=[('north', 'North'), ('south', 'South'), ('west', 'West'), ('east', 'East')], - help="Garden orientation selection" ) active = fields.Boolean('Active', default=True) state = fields.Selection( diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 5e0ecf1cbd6..106625ed0d3 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -5,4 +5,79 @@ estate.property list,form + + + estate.property.view.search + estate.property + + + + + + + + + + + + + + + + estate.property.list + estate.property + + + + + + + + + + + + + + + estate.property.form + estate.property + +
+ + +

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + \ No newline at end of file From 8ed93682e2cd0c41d4941be10a8a26f14ee31556 Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Tue, 21 Oct 2025 16:24:22 +0200 Subject: [PATCH 10/33] [ADD] estate: added buyer, salesperson and estate type --- estate/__manifest__.py | 1 + estate/models/__init__.py | 3 +++ estate/models/buyer.py | 8 ++++++++ estate/models/estate_property.py | 3 +++ estate/models/estate_property_type.py | 10 ++++++++++ estate/models/salesperson.py | 8 ++++++++ estate/security/ir.model.access.csv | 5 ++++- estate/views/estate_menus.xml | 3 +++ estate/views/estate_property_type_views.xml | 10 ++++++++++ estate/views/estate_property_views.xml | 6 ++++++ 10 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 estate/models/buyer.py create mode 100644 estate/models/estate_property_type.py create mode 100644 estate/models/salesperson.py create mode 100644 estate/views/estate_property_type_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 2b5085abcdb..58ced11253c 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -20,6 +20,7 @@ 'security/ir.model.access.csv', 'views/estate_property_views.xml', 'views/estate_menus.xml', + 'views/estate_property_type_views.xml', ], 'assets': { diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 5e1963c9d2f..9f5291914ec 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 buyer +from . import salesperson diff --git a/estate/models/buyer.py b/estate/models/buyer.py new file mode 100644 index 00000000000..03e8a490085 --- /dev/null +++ b/estate/models/buyer.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class Buyer(models.Model): + _name = 'buyer' + _description = 'The entity to buy the estate' + + name = fields.Char('Buyer') diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index e9badcdc11c..8b66f5faaf6 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -29,3 +29,6 @@ class Estateproperty(models.Model): help="Estate state", default=('new') ) + property_type_id = fields.Many2one("estate.property.type", string="Type") + salesperson = fields.Many2one('salesperson', string='Salesperson') + buyer = fields.Many2one('buyer', string='Buyer') diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py new file mode 100644 index 00000000000..3245fae7753 --- /dev/null +++ b/estate/models/estate_property_type.py @@ -0,0 +1,10 @@ +from odoo import fields, models + + +class EstatePropertyType(models.Model): + _name = "estate.property.type" + _description = "Estate Property Type" + + name = fields.Char('Type', required=True) + description = fields.Text('Description') + \ No newline at end of file diff --git a/estate/models/salesperson.py b/estate/models/salesperson.py new file mode 100644 index 00000000000..c8e07714e66 --- /dev/null +++ b/estate/models/salesperson.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class Salesperson(models.Model): + _name = 'salesperson' + _description = 'The individual handling the sales for the estate' + + name = fields.Char('Salesperson') diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 9ccf73e191e..ee5f44fe72b 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,estate.property,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file +access_estate_property,estate.property,model_estate_property,base.group_user,1,1,1,1 +access_estate_property_type,estate.property.type,model_estate_property_type,base.group_user,1,1,1,1 +access_buyer,buyer,model_buyer,base.group_user,1,1,1,1 +access_salesperson,sales,model_salesperson,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index d691e7dd1b1..d987332cb9f 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -4,5 +4,8 @@ + + + \ 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..57586e76f3d --- /dev/null +++ b/estate/views/estate_property_type_views.xml @@ -0,0 +1,10 @@ + + + + + Property Types + estate.property.type + list,form + + + \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 106625ed0d3..850a85f3065 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -73,6 +73,12 @@ + + + + + + From a150ae91b448c059c6f4e540c68b9d7ec82d023a Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Wed, 22 Oct 2025 10:34:28 +0200 Subject: [PATCH 11/33] [FIX] estate: commit to save progress before debugging --- estate/__init__.py | 3 -- estate/__manifest__.py | 1 + estate/models/__init__.py | 3 +- estate/models/buyer.py | 8 ---- estate/models/estate_property.py | 5 ++- estate/models/estate_property_tag.py | 9 +++++ estate/models/estate_property_type.py | 1 - estate/models/salesperson.py | 8 ---- estate/security/ir.model.access.csv | 3 +- estate/views/estate_menus.xml | 3 +- estate/views/estate_property_tag_views.xml | 38 ++++++++++++++++++ estate/views/estate_property_tag_views_2.xml | 41 ++++++++++++++++++++ estate/views/estate_property_type_views.xml | 27 +++++++++++++ estate/views/estate_property_views.xml | 4 ++ 14 files changed, 127 insertions(+), 27 deletions(-) delete mode 100644 estate/models/buyer.py create mode 100644 estate/models/estate_property_tag.py delete mode 100644 estate/models/salesperson.py create mode 100644 estate/views/estate_property_tag_views.xml create mode 100644 estate/views/estate_property_tag_views_2.xml diff --git a/estate/__init__.py b/estate/__init__.py index 1ccd6b6fffa..0650744f6bc 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -1,4 +1 @@ from . import models - - -from odoo import api, SUPERUSER_ID diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 58ced11253c..edbbe92ef58 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -19,6 +19,7 @@ 'data': [ 'security/ir.model.access.csv', 'views/estate_property_views.xml', + 'views/estate_property_tag_views_2.xml', 'views/estate_menus.xml', 'views/estate_property_type_views.xml', diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 9f5291914ec..fdab6f99948 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,4 +1,3 @@ from . import estate_property from . import estate_property_type -from . import buyer -from . import salesperson +from . import estate_property_tag \ No newline at end of file diff --git a/estate/models/buyer.py b/estate/models/buyer.py deleted file mode 100644 index 03e8a490085..00000000000 --- a/estate/models/buyer.py +++ /dev/null @@ -1,8 +0,0 @@ -from odoo import fields, models - - -class Buyer(models.Model): - _name = 'buyer' - _description = 'The entity to buy the estate' - - name = fields.Char('Buyer') diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 8b66f5faaf6..70a54258732 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -30,5 +30,6 @@ class Estateproperty(models.Model): default=('new') ) property_type_id = fields.Many2one("estate.property.type", string="Type") - salesperson = fields.Many2one('salesperson', string='Salesperson') - buyer = fields.Many2one('buyer', string='Buyer') + salesperson = fields.Many2one('res.partner', string='Salesperson') + buyer = fields.Many2one('res.users', string='Buyer', default=lambda self: self.env.user) + #tag_ids = fields.Many2many('estate.property.tag', string='Tag') diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py new file mode 100644 index 00000000000..8ca5a69f1fc --- /dev/null +++ b/estate/models/estate_property_tag.py @@ -0,0 +1,9 @@ +from odoo import fields, models + + +class EstatePropertyTag(models.Model): + _name = "estate.property.tag" + _description = "Tags for the estate" + + name = fields.Char('Tag', required=True) + description = fields.Char('Description') \ No newline at end of file diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index 3245fae7753..34fcfe87f7c 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -7,4 +7,3 @@ class EstatePropertyType(models.Model): name = fields.Char('Type', required=True) description = fields.Text('Description') - \ No newline at end of file diff --git a/estate/models/salesperson.py b/estate/models/salesperson.py deleted file mode 100644 index c8e07714e66..00000000000 --- a/estate/models/salesperson.py +++ /dev/null @@ -1,8 +0,0 @@ -from odoo import fields, models - - -class Salesperson(models.Model): - _name = 'salesperson' - _description = 'The individual handling the sales for the estate' - - name = fields.Char('Salesperson') diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index ee5f44fe72b..70a94e12e73 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,5 +1,4 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_estate_property_tag,estate.property.tag,model_estate_property_tag,base.group_user,1,1,1,1 access_estate_property,estate.property,model_estate_property,base.group_user,1,1,1,1 access_estate_property_type,estate.property.type,model_estate_property_type,base.group_user,1,1,1,1 -access_buyer,buyer,model_buyer,base.group_user,1,1,1,1 -access_salesperson,sales,model_salesperson,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index d987332cb9f..ae7967382b3 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -4,8 +4,9 @@ - + + \ 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..b90afe4be05 --- /dev/null +++ b/estate/views/estate_property_tag_views.xml @@ -0,0 +1,38 @@ + + + + + + Property tags + estate.property.tag + list,form + + + + estate.property.tag.list + estate.property.tag + + + + + + + + + + estate.property.tag.form + estate.property.tag + +
+ + +

+ +

+
+
+
+
+
+
+
\ No newline at end of file diff --git a/estate/views/estate_property_tag_views_2.xml b/estate/views/estate_property_tag_views_2.xml new file mode 100644 index 00000000000..1e910748628 --- /dev/null +++ b/estate/views/estate_property_tag_views_2.xml @@ -0,0 +1,41 @@ + + + + + + Property tags + estate.property.tag + list,form + + + + estate.property.tag.list + estate.property.tag + + + + + + + + + + estate.property.tag.form + estate.property.tag + +
+ + +

+ +

+
+
+
+
+
+
+ + + +
\ No newline at end of file diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml index 57586e76f3d..61890ff816f 100644 --- a/estate/views/estate_property_type_views.xml +++ b/estate/views/estate_property_type_views.xml @@ -7,4 +7,31 @@ list,form + + estate.property.type.list + estate.property.type + + + + + + + + + + estate.property.type.form + 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 850a85f3065..18677a955d4 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -35,6 +35,7 @@ + @@ -50,6 +51,9 @@ + From 047a922e66d6b3ae8f9fca6e2627a62da170c067 Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Wed, 22 Oct 2025 13:33:14 +0200 Subject: [PATCH 12/33] [ADD] estate: added offers for property --- estate/__manifest__.py | 6 +-- estate/models/__init__.py | 3 +- estate/models/estate_property.py | 3 +- estate/models/estate_property_offer.py | 15 +++++++ estate/models/estate_property_tag.py | 2 +- estate/security/ir.model.access.csv | 1 + estate/views/estate_property_offer_views.xml | 32 +++++++++++++++ estate/views/estate_property_tag_views.xml | 6 +-- estate/views/estate_property_tag_views_2.xml | 41 -------------------- estate/views/estate_property_views.xml | 11 ++++-- 10 files changed, 66 insertions(+), 54 deletions(-) create mode 100644 estate/models/estate_property_offer.py create mode 100644 estate/views/estate_property_offer_views.xml delete mode 100644 estate/views/estate_property_tag_views_2.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index edbbe92ef58..024f8806cf4 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -19,10 +19,10 @@ 'data': [ 'security/ir.model.access.csv', 'views/estate_property_views.xml', - 'views/estate_property_tag_views_2.xml', - 'views/estate_menus.xml', 'views/estate_property_type_views.xml', - + 'views/estate_property_tag_views.xml', + 'views/estate_property_offer_views.xml', + 'views/estate_menus.xml', ], 'assets': { diff --git a/estate/models/__init__.py b/estate/models/__init__.py index fdab6f99948..09b2099fe84 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,3 +1,4 @@ from . import estate_property from . import estate_property_type -from . import estate_property_tag \ No newline at end of file +from . import estate_property_tag +from . import estate_property_offer \ No newline at end of file diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 70a54258732..b461d66b64f 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -32,4 +32,5 @@ class Estateproperty(models.Model): property_type_id = fields.Many2one("estate.property.type", string="Type") salesperson = fields.Many2one('res.partner', string='Salesperson') buyer = fields.Many2one('res.users', string='Buyer', default=lambda self: self.env.user) - #tag_ids = fields.Many2many('estate.property.tag', string='Tag') + tag_ids = fields.Many2many('estate.property.tag', string='Tag') + offer_ids = fields.One2many('estate.property.offer','property_id', string='Offer') diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py new file mode 100644 index 00000000000..11abf6a65e1 --- /dev/null +++ b/estate/models/estate_property_offer.py @@ -0,0 +1,15 @@ +from odoo import fields, models + + +class EstatePropertyOffer(models.Model): + _name='estate.property.offer' + _description='Offer for the property' + + 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/estate_property_tag.py b/estate/models/estate_property_tag.py index 8ca5a69f1fc..d4d30cb7ced 100644 --- a/estate/models/estate_property_tag.py +++ b/estate/models/estate_property_tag.py @@ -6,4 +6,4 @@ class EstatePropertyTag(models.Model): _description = "Tags for the estate" name = fields.Char('Tag', required=True) - description = fields.Char('Description') \ No newline at end of file + description = fields.Char('Description') diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 70a94e12e73..9ef81f819e6 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -2,3 +2,4 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink access_estate_property_tag,estate.property.tag,model_estate_property_tag,base.group_user,1,1,1,1 access_estate_property,estate.property,model_estate_property,base.group_user,1,1,1,1 access_estate_property_type,estate.property.type,model_estate_property_type,base.group_user,1,1,1,1 +access_estate_property_offer,estate.property.offer,model_estate_property_offer,base.group_user,1,1,1,1 \ 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..178092755dc --- /dev/null +++ b/estate/views/estate_property_offer_views.xml @@ -0,0 +1,32 @@ + + + + + estate.property.offer.form + estate.property.offer + +
+ + +

+ +

+
+
+
+
+
+ + + estate.property.offer.list + 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 index b90afe4be05..587472e0b2a 100644 --- a/estate/views/estate_property_tag_views.xml +++ b/estate/views/estate_property_tag_views.xml @@ -1,6 +1,5 @@ - Property tags @@ -11,7 +10,7 @@ estate.property.tag.list estate.property.tag - + @@ -22,7 +21,7 @@ estate.property.tag.form estate.property.tag - +
@@ -34,5 +33,4 @@
-
\ No newline at end of file diff --git a/estate/views/estate_property_tag_views_2.xml b/estate/views/estate_property_tag_views_2.xml deleted file mode 100644 index 1e910748628..00000000000 --- a/estate/views/estate_property_tag_views_2.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Property tags - estate.property.tag - list,form - - - - estate.property.tag.list - estate.property.tag - - - - - - - - - - estate.property.tag.form - estate.property.tag - -
- - -

- -

-
-
-
-
-
-
- - - -
\ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 18677a955d4..571d5af5624 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -35,7 +35,7 @@ - + @@ -51,9 +51,9 @@
- +
@@ -77,6 +77,11 @@ + + + + + From 9734e7f8cf6679186ea48eac942399aa09b5417b Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Wed, 22 Oct 2025 13:40:23 +0200 Subject: [PATCH 13/33] [FIX] estate: runbot ci fixes --- estate/models/__init__.py | 2 +- estate/models/estate_property.py | 2 +- estate/models/estate_property_offer.py | 4 ++-- estate/models/estate_property_tag.py | 2 +- estate/security/ir.model.access.csv | 2 +- estate/views/estate_menus.xml | 2 +- estate/views/estate_property_offer_views.xml | 2 +- estate/views/estate_property_tag_views.xml | 2 +- estate/views/estate_property_type_views.xml | 2 +- estate/views/estate_property_views.xml | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 09b2099fe84..2f1821a39c1 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,4 +1,4 @@ from . import estate_property from . import estate_property_type from . import estate_property_tag -from . import estate_property_offer \ No newline at end of file +from . import estate_property_offer diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index b461d66b64f..cdab9f05fc8 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -33,4 +33,4 @@ class Estateproperty(models.Model): salesperson = fields.Many2one('res.partner', string='Salesperson') buyer = fields.Many2one('res.users', string='Buyer', default=lambda self: self.env.user) tag_ids = fields.Many2many('estate.property.tag', string='Tag') - offer_ids = fields.One2many('estate.property.offer','property_id', string='Offer') + offer_ids = fields.One2many('estate.property.offer', 'property_id', string='Offer') diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index 11abf6a65e1..69ae2253f51 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -2,8 +2,8 @@ class EstatePropertyOffer(models.Model): - _name='estate.property.offer' - _description='Offer for the property' + _name = 'estate.property.offer' + _description = 'Offer for the property' price = fields.Float() status = fields.Selection( diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py index d4d30cb7ced..96c6fa22081 100644 --- a/estate/models/estate_property_tag.py +++ b/estate/models/estate_property_tag.py @@ -1,4 +1,4 @@ -from odoo import fields, models +from odoo import fields, models class EstatePropertyTag(models.Model): diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 9ef81f819e6..d5be899ec6e 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -2,4 +2,4 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink access_estate_property_tag,estate.property.tag,model_estate_property_tag,base.group_user,1,1,1,1 access_estate_property,estate.property,model_estate_property,base.group_user,1,1,1,1 access_estate_property_type,estate.property.type,model_estate_property_type,base.group_user,1,1,1,1 -access_estate_property_offer,estate.property.offer,model_estate_property_offer,base.group_user,1,1,1,1 \ No newline at end of file +access_estate_property_offer,estate.property.offer,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 ae7967382b3..e8e185599d3 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -9,4 +9,4 @@
- \ No newline at end of file + diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 178092755dc..4692168f168 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -29,4 +29,4 @@
- \ No newline at end of file + diff --git a/estate/views/estate_property_tag_views.xml b/estate/views/estate_property_tag_views.xml index 587472e0b2a..ec40a2a2426 100644 --- a/estate/views/estate_property_tag_views.xml +++ b/estate/views/estate_property_tag_views.xml @@ -33,4 +33,4 @@ - \ No newline at end of file + diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml index 61890ff816f..a09543e49c3 100644 --- a/estate/views/estate_property_type_views.xml +++ b/estate/views/estate_property_type_views.xml @@ -34,4 +34,4 @@ - \ No newline at end of file + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 571d5af5624..2896b8635fc 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -95,4 +95,4 @@ - \ No newline at end of file + From 1d50e6a457ba493533d60a65621b4d9329106e98 Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Wed, 22 Oct 2025 15:09:27 +0200 Subject: [PATCH 14/33] [ADD] estate: added computed fields and onchanges --- estate/models/estate_property.py | 24 +++++++++++++++++++- estate/models/estate_property_offer.py | 17 +++++++++++++- estate/models/estate_property_type.py | 2 +- estate/views/estate_property_offer_views.xml | 6 +++++ estate/views/estate_property_views.xml | 4 ++++ 5 files changed, 50 insertions(+), 3 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index cdab9f05fc8..dc83f33cb96 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 fields, models, api from dateutil.relativedelta import relativedelta @@ -34,3 +34,25 @@ class Estateproperty(models.Model): buyer = fields.Many2one('res.users', string='Buyer', default=lambda self: self.env.user) tag_ids = fields.Many2many('estate.property.tag', string='Tag') offer_ids = fields.One2many('estate.property.offer', 'property_id', string='Offer') + total_area = fields.Float(compute="_compute_total_area") + best_offer = fields.Float(compute="_compute_best_offer") + + + @api.depends("garden_area","living_area") + def _compute_total_area(self): + for record in self: + record.total_area = record.garden_area + record.living_area + + @api.depends("offer_ids") + def _compute_best_offer(self): + for record in self: + record.best_offer = max(record.offer_ids.mapped("price") or [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/estate_property_offer.py b/estate/models/estate_property_offer.py index 69ae2253f51..97176817754 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,4 +1,6 @@ -from odoo import fields, models +from odoo import fields, models, api +from dateutil.relativedelta import relativedelta +from datetime import datetime class EstatePropertyOffer(models.Model): @@ -13,3 +15,16 @@ class EstatePropertyOffer(models.Model): ) partner_id = fields.Many2one('res.partner', required=True) property_id = fields.Many2one('estate.property', required=True) + validity = fields.Integer(string="Validity (days)", 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: + record.date_deadline = fields.Datetime.now() + relativedelta(days=record.validity) + + def _inverse_date_deadline(self): + for record in self: + deadline = datetime(record.date_deadline.year, record.date_deadline.month, record.date_deadline.day) + record.validity = int((deadline - fields.Datetime.now()).days) diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index 34fcfe87f7c..d6b21c2dbe9 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -6,4 +6,4 @@ class EstatePropertyType(models.Model): _description = "Estate Property Type" name = fields.Char('Type', required=True) - description = fields.Text('Description') + description = fields.Text() diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 4692168f168..d7989ef3738 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -10,6 +10,10 @@

+ + + +

@@ -24,6 +28,8 @@ + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 2896b8635fc..69288542153 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -36,6 +36,7 @@ + @@ -56,10 +57,12 @@ + + @@ -75,6 +78,7 @@ + From 3b6035d45aadd94592e4070e421f7e5c05906f47 Mon Sep 17 00:00:00 2001 From: Wajih-Wanis Date: Wed, 22 Oct 2025 16:28:51 +0200 Subject: [PATCH 15/33] [ADD] estate: added action buttons --- estate/models/estate_property.py | 21 +++++++++++++++++--- estate/models/estate_property_offer.py | 18 +++++++++++++++-- estate/views/estate_property_offer_views.xml | 12 ++++++----- estate/views/estate_property_views.xml | 4 ++++ 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index dc83f33cb96..750a61aaca7 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,5 @@ from odoo import fields, models, api +from odoo.exceptions import UserError from dateutil.relativedelta import relativedelta @@ -31,14 +32,14 @@ class Estateproperty(models.Model): ) property_type_id = fields.Many2one("estate.property.type", string="Type") salesperson = fields.Many2one('res.partner', string='Salesperson') - buyer = fields.Many2one('res.users', string='Buyer', default=lambda self: self.env.user) + buyer = fields.Many2one('res.users', string='Buyer') tag_ids = fields.Many2many('estate.property.tag', string='Tag') offer_ids = fields.One2many('estate.property.offer', 'property_id', string='Offer') total_area = fields.Float(compute="_compute_total_area") best_offer = fields.Float(compute="_compute_best_offer") + offer_accepted = fields.Boolean() - - @api.depends("garden_area","living_area") + @api.depends("garden_area", "living_area") def _compute_total_area(self): for record in self: record.total_area = record.garden_area + record.living_area @@ -56,3 +57,17 @@ def _onchange_garden(self): else: self.garden_area = 0 self.garden_orientation = None + + def set_property_sold(self): + for record in self: + if record.state != 'cancelled': + record.state = 'sold' + else: + raise(UserError("Can not cancel sold property")) + + def set_property_cancelled(self): + for record in self: + if record.state != 'sold': + record.state = 'cancelled' + else: + raise(UserError("Can not cancel sold property")) diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index 97176817754..252840e7936 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,4 +1,5 @@ from odoo import fields, models, api +from odoo.exceptions import UserError from dateutil.relativedelta import relativedelta from datetime import datetime @@ -13,12 +14,11 @@ class EstatePropertyOffer(models.Model): selection=[('accepted', 'Accepted'), ('refused', 'Refused')], copy=False ) - partner_id = fields.Many2one('res.partner', required=True) + partner_id = fields.Many2one('res.users', required=True, default=lambda self: self.env.user) property_id = fields.Many2one('estate.property', required=True) validity = fields.Integer(string="Validity (days)", 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: @@ -28,3 +28,17 @@ def _inverse_date_deadline(self): for record in self: deadline = datetime(record.date_deadline.year, record.date_deadline.month, record.date_deadline.day) record.validity = int((deadline - fields.Datetime.now()).days) + + def accept_offer(self): + for record in self: + if not record.property_id.offer_accepted: + record.status = 'accepted' + record.property_id.selling_price = record.price + record.property_id.buyer = record.partner_id + record.property_id.offer_accepted = True + else: + raise(UserError("Can not accept more than one offer")) + + def reject_offer(self): + for record in self: + record.status = 'refused' diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index d7989ef3738..ca842e5cbb4 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -9,11 +9,11 @@

- - - - - + + + + +

@@ -30,6 +30,8 @@ +