From b8ffb50401c0f6f5c19209e875a8565bc6d99800 Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Tue, 15 Sep 2026 13:30:36 +0200 Subject: [PATCH 01/29] [ADD] '.idea' to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b6e47617de1..604fd7bf4ce 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,4 @@ dmypy.json # Pyre type checker .pyre/ +.idea \ No newline at end of file From c27b529845f06dbaa785898d5abba6a80412400e Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Tue, 15 Sep 2026 14:20:26 +0200 Subject: [PATCH 02/29] [ADD] estate: initial setup --- estate/__init__.py | 0 estate/__manifest__.py | 5 +++++ 2 files changed, 5 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..a8096ba122d --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,5 @@ +{ + 'name': 'Real Estate', + 'depends': ['base'], + 'application': True +} \ No newline at end of file From b07504a3ebc4222a6bb227d38a9202de2ab35616 Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Tue, 15 Sep 2026 15:06:05 +0200 Subject: [PATCH 03/29] [IMP] estate: fixing nomenclature --- estate/__manifest__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index a8096ba122d..fadacfb1f5d 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,5 +1,9 @@ { 'name': 'Real Estate', - 'depends': ['base'], - 'application': True + 'author': 'aalon-odoo', + 'depends': [ + 'base' + ], + 'application': True, + 'license': 'LGPL-3', } \ No newline at end of file From ab595857bc68266a39c6e1550e392a5b1ca77299 Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Tue, 15 Sep 2026 15:22:15 +0200 Subject: [PATCH 04/29] [IMP] estate: adding new line at the end of the manifest --- estate/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index fadacfb1f5d..f98f29492bf 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -6,4 +6,4 @@ ], 'application': True, 'license': 'LGPL-3', -} \ No newline at end of file +} From 26f6c3fa327f780cc241d769dd941b23f98daa90 Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Tue, 15 Sep 2026 16:11:21 +0200 Subject: [PATCH 05/29] [ADD] estate_property model: creation with basic fields --- estate/__init__.py | 1 + estate/models/__init__.py | 1 + estate/models/estate_property.py | 23 +++++++++++++++++++++++ 3 files changed, 25 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..9a7e03eded3 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models \ 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..bb37c08de78 --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,23 @@ +from odoo import fields, models + + +class EstateProperty(models.Model): + _name = "estate.property" + _description = "Estate Property" + + name = fields.Char('Name', required=True) + description = fields.Text('Description') + postcode = fields.Char('Postcode') + date_availability = fields.Date('Availability Date') + expected_price = fields.Float('Expected Price', required=True) + selling_price = fields.Float('Selling Price') + bedrooms = fields.Integer('Number of Bedrooms') + living_area = fields.Integer('Living Area') + facades = fields.Integer('Number of Facades') + garage = fields.Boolean('is Garage') + garden = fields.Boolean('is Garden') + garden_area = fields.Integer('Garden Area') + garden_orientation = fields.Selection( + string='Garden Orientation', + selection=[("north", "North"), ("south", "South"), ("east", "East"), ("west", "West")] + ) \ No newline at end of file From cd55406eafe560734288e31cbeae03a77af7effb Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Tue, 15 Sep 2026 16:40:21 +0200 Subject: [PATCH 06/29] [IMP] estate security: adding access rule --- estate/security/ir.model.access.csv | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 estate/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..fa102f4f431 --- /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,access_estate_property,model_estate_property,group_user,1,1,1,1 From 739446bc2769be7ff26cb2890f5c9377d0c41dbc Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Tue, 15 Sep 2026 16:43:10 +0200 Subject: [PATCH 07/29] [IMP] estate security: adding security rules .csv to manifest --- estate/__manifest__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index f98f29492bf..36d73391bea 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,9 +1,12 @@ { 'name': 'Real Estate', - 'author': 'aalon-odoo', + 'author': 'Odoo S.A', 'depends': [ 'base' ], 'application': True, 'license': 'LGPL-3', + 'data': [ + 'security/ir.model.access.csv' + ] } From 793fb924f02b682951398fd2dcde3474eaecef71 Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Tue, 15 Sep 2026 16:44:35 +0200 Subject: [PATCH 08/29] [FIX] estate module: quick fix for missing new_line at the end + optimize 'selection' in manifest --- estate/__init__.py | 2 +- estate/models/__init__.py | 2 +- estate/models/estate_property.py | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) 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/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 bb37c08de78..209a5472303 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -19,5 +19,9 @@ class EstateProperty(models.Model): garden_area = fields.Integer('Garden Area') garden_orientation = fields.Selection( string='Garden Orientation', - selection=[("north", "North"), ("south", "South"), ("east", "East"), ("west", "West")] - ) \ No newline at end of file + selection=[ + ("north", "North"), + ("south", "South"), + ("east", "East"), + ("west", "West")], + ) From ad96a89fceaa81be8603b0060b668e5e68e7c74a Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Tue, 15 Sep 2026 16:53:33 +0200 Subject: [PATCH 09/29] [FIX] estate security: updating access rule model_id to base.group_user --- estate/security/ir.model.access.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index fa102f4f431..32389642d4f 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_property,access_estate_property,model_estate_property,group_user,1,1,1,1 +access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 From 0776651512c24d8598ac84d6ed69c70f1a06ec18 Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Tue, 15 Sep 2026 17:19:19 +0200 Subject: [PATCH 10/29] [IMP] estate property xml view: adding the xml file and defining it in manifest>data --- estate/__manifest__.py | 3 ++- estate/views/estate_property_views.xml | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 estate/views/estate_property_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 36d73391bea..0fd7f09185c 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -7,6 +7,7 @@ 'application': True, 'license': 'LGPL-3', 'data': [ - 'security/ir.model.access.csv' + 'security/ir.model.access.csv', + 'views/estate_property_views.xml' ] } diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml new file mode 100644 index 00000000000..4e9848208a5 --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,7 @@ + + + Test Action + estate.property + tree,form + + From 87c5088d08bbf05cc6e032219eb25fc9bfcd02d8 Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Wed, 16 Sep 2026 09:43:03 +0200 Subject: [PATCH 11/29] [IMP] estate views: update property action, add menu structure and fix manifest --- estate/__manifest__.py | 2 +- estate/views/estate_property_views.xml | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 0fd7f09185c..4e2d9c3a758 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -7,7 +7,7 @@ 'application': True, 'license': 'LGPL-3', 'data': [ + 'views/estate_property_views.xml', 'security/ir.model.access.csv', - 'views/estate_property_views.xml' ] } diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 4e9848208a5..05550caf005 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,7 +1,15 @@ - - Test Action + + + Properties estate.property - tree,form + list,form + + + + From dfd83706848e46ea6c06c5d7fca0e5b7bdbe9d4c Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Wed, 16 Sep 2026 10:46:14 +0200 Subject: [PATCH 12/29] [IMP] estate_property model: enhance fields with defaults, readonly [IMP] estate_property model: adding Active and Status fields --- estate/models/estate_property.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 209a5472303..5496ef84cc8 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -8,10 +8,10 @@ class EstateProperty(models.Model): name = fields.Char('Name', required=True) description = fields.Text('Description') postcode = fields.Char('Postcode') - date_availability = fields.Date('Availability Date') + date_availability = fields.Date('Availability Date', copy=False, default=lambda self: fields.Date.add(fields.Date.today(), days=90)) expected_price = fields.Float('Expected Price', required=True) - selling_price = fields.Float('Selling Price') - bedrooms = fields.Integer('Number of Bedrooms') + selling_price = fields.Float('Selling Price', readonly=True, copy=False) + bedrooms = fields.Integer('Number of Bedrooms', default=2) living_area = fields.Integer('Living Area') facades = fields.Integer('Number of Facades') garage = fields.Boolean('is Garage') @@ -25,3 +25,17 @@ class EstateProperty(models.Model): ("east", "East"), ("west", "West")], ) + active = fields.Boolean("Active", default=True) + state = fields.Selection( + string='State', + selection=[ + ("new", "New"), + ("offer_received", "Offer Received"), + ("offer_accepted", "Offer Accepted"), + ("sold", "Sold"), + ("canceled", "Canceled") + ], + default="new", + required=True, + copy=False, + ) From 21e0c6e07bc0c42edfd9f7e27cda2241897e3d83 Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Wed, 16 Sep 2026 11:35:59 +0200 Subject: [PATCH 13/29] [FIX] .gitignore: removing .idea [FIX] estate_property : nitpick adjustments [MOV] menu items from estate_view to estate_menu --- .gitignore | 1 - estate/__manifest__.py | 3 ++- estate/models/estate_property.py | 9 +++++++-- estate/views/estate_menu.xml | 7 +++++++ estate/views/estate_property_views.xml | 6 ------ 5 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 estate/views/estate_menu.xml diff --git a/.gitignore b/.gitignore index 604fd7bf4ce..b6e47617de1 100644 --- a/.gitignore +++ b/.gitignore @@ -127,4 +127,3 @@ dmypy.json # Pyre type checker .pyre/ -.idea \ No newline at end of file diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 4e2d9c3a758..e127b60c55e 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -7,7 +7,8 @@ 'application': True, 'license': 'LGPL-3', 'data': [ - 'views/estate_property_views.xml', 'security/ir.model.access.csv', + 'views/estate_property_views.xml', + 'views/estate_menu.xml' ] } diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 5496ef84cc8..a1b26d31b10 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -8,7 +8,11 @@ class EstateProperty(models.Model): name = fields.Char('Name', required=True) description = fields.Text('Description') postcode = fields.Char('Postcode') - date_availability = fields.Date('Availability Date', copy=False, default=lambda self: fields.Date.add(fields.Date.today(), days=90)) + date_availability = fields.Date( + string='Availability Date', + copy=False, + default=lambda self: fields.Date.add(fields.Date.today(), days=90), + ) expected_price = fields.Float('Expected Price', required=True) selling_price = fields.Float('Selling Price', readonly=True, copy=False) bedrooms = fields.Integer('Number of Bedrooms', default=2) @@ -23,7 +27,8 @@ class EstateProperty(models.Model): ("north", "North"), ("south", "South"), ("east", "East"), - ("west", "West")], + ("west", "West"), + ], ) active = fields.Boolean("Active", default=True) state = fields.Selection( diff --git a/estate/views/estate_menu.xml b/estate/views/estate_menu.xml new file mode 100644 index 00000000000..98f6e4c48f4 --- /dev/null +++ b/estate/views/estate_menu.xml @@ -0,0 +1,7 @@ + + + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 05550caf005..3238e781184 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -6,10 +6,4 @@ list,form - - - From 2402326dd209b22846c22c51247fc5addccda346 Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Wed, 16 Sep 2026 13:39:50 +0200 Subject: [PATCH 14/29] [IMP] adding estate_property_list_view [FIX] estate_property model : fields label changed --- estate/models/estate_property.py | 8 ++++---- estate/views/estate_property_views.xml | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index a1b26d31b10..431a7b48baf 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -5,18 +5,18 @@ class EstateProperty(models.Model): _name = "estate.property" _description = "Estate Property" - name = fields.Char('Name', required=True) + name = fields.Char('Title', required=True) description = fields.Text('Description') postcode = fields.Char('Postcode') date_availability = fields.Date( - string='Availability Date', + string='Available From', copy=False, default=lambda self: fields.Date.add(fields.Date.today(), days=90), ) expected_price = fields.Float('Expected Price', required=True) selling_price = fields.Float('Selling Price', readonly=True, copy=False) - bedrooms = fields.Integer('Number of Bedrooms', default=2) - living_area = fields.Integer('Living Area') + bedrooms = fields.Integer('Bedrooms', default=2) + living_area = fields.Integer('Living Area (sqm)') facades = fields.Integer('Number of Facades') garage = fields.Boolean('is Garage') garden = fields.Boolean('is Garden') diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 3238e781184..350448b8388 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -6,4 +6,22 @@ list,form + + real.estate.list + estate.property + + + + + + + + + + + + + + + From 79ef1cf74884f945368dd1728550a0b0f6df1a62 Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Thu, 17 Sep 2026 09:44:48 +0200 Subject: [PATCH 15/29] [IMP] estate_property views: adding xml form and search views --- estate/views/estate_property_views.xml | 52 ++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 350448b8388..349a8a9907d 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -24,4 +24,56 @@ + + real.estate.form + estate.property + +
+ +

+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + real.estate.form + estate.property + + + + + + + + + + + + From 2dd86afa29cccfeed48c6bb320fd8ea899e918f0 Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Thu, 17 Sep 2026 10:37:12 +0200 Subject: [PATCH 16/29] [ADD] estate_property_type model: adding the new model --- estate/models/__init__.py | 1 + estate/models/estate_property_type.py | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 estate/models/estate_property_type.py diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 5e1963c9d2f..97aee757823 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1,2 @@ from . import estate_property +from . import estate_property_type \ No newline at end of file diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py new file mode 100644 index 00000000000..7860a26125e --- /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 = "Estate Property Type" + + name = fields.Char(required=True) From 165bd74cc5c9cc4a7a93499353c444d55e603fc0 Mon Sep 17 00:00:00 2001 From: aalon-odoo Date: Thu, 17 Sep 2026 10:48:59 +0200 Subject: [PATCH 17/29] [IMP] estate_property_type : views, security, adding it to the main menu --- estate/__manifest__.py | 1 + estate/security/ir.model.access.csv | 1 + estate/views/estate_menu.xml | 3 +++ estate/views/estate_property_type_views.xml | 9 +++++++++ estate/views/estate_property_views.xml | 2 +- 5 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 estate/views/estate_property_type_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index e127b60c55e..6e4646ea0f3 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -8,6 +8,7 @@ 'license': 'LGPL-3', 'data': [ 'security/ir.model.access.csv', + 'views/estate_property_type_views.xml', 'views/estate_property_views.xml', 'views/estate_menu.xml' ] diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 32389642d4f..102510f7131 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,2 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 +access_estate_property_type,access_estate_type_property,model_estate_property_type,base.group_user,1,1,1,1 diff --git a/estate/views/estate_menu.xml b/estate/views/estate_menu.xml index 98f6e4c48f4..9d0ad78bc04 100644 --- a/estate/views/estate_menu.xml +++ b/estate/views/estate_menu.xml @@ -3,5 +3,8 @@