From 0c81ab452bb81655c28f3d7f0daaae8803068810 Mon Sep 17 00:00:00 2001 From: yacha-odoo Date: Fri, 3 Jul 2026 17:00:51 +0530 Subject: [PATCH 1/4] [ADD] estate: add initial module structure Create the initial Real Estate module for the Server Framework 101 tutorial. This introduces the base module structure with the manifest and package initialization files required for further development. --- estate/__init__.py | 0 estate/__manifest__.py | 10 ++++++++++ estate/models/__init__.py | 0 3 files changed, 10 insertions(+) create mode 100644 estate/__init__.py create mode 100644 estate/__manifest__.py create mode 100644 estate/models/__init__.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..765406975fb --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,10 @@ +{ + 'name': 'Real Estate', + 'version': '1.0', + 'author': 'yacha', + 'depends': ['base'], + 'application': True, + 'category': 'Tutorials', + 'installable': True, + 'license': 'LGPL-3' +} diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..e69de29bb2d From f064b95e6bcdd4aa48ae9fabbd921f2380908940 Mon Sep 17 00:00:00 2001 From: yacha Date: Mon, 6 Jul 2026 17:55:27 +0530 Subject: [PATCH 2/4] [ADD] estate: add property model and basic fields proper --- 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/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 index e69de29bb2d..5e1963c9d2f 100644 --- a/estate/models/__init__.py +++ 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..78eb2568d09 --- /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 Property" + + 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( + [ + ("north", "North"), + ("south", "South"), + ("east", "East"), + ("west", "West"), + ] + ) From 66e5c64883849123837b44916097476d29a14143 Mon Sep 17 00:00:00 2001 From: yacha Date: Tue, 7 Jul 2026 18:11:29 +0530 Subject: [PATCH 3/4] [ADD] estate: Security Access Granted --- estate/__manifest__.py | 17 +++++++++-------- estate/security/ir.model.access.csv | 2 ++ 2 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 765406975fb..ba0b3ed9c20 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,10 +1,11 @@ { - 'name': 'Real Estate', - 'version': '1.0', - 'author': 'yacha', - 'depends': ['base'], - 'application': True, - 'category': 'Tutorials', - 'installable': True, - 'license': 'LGPL-3' + "name": "Real Estate", + "version": "1.0", + "author": "yacha", + "depends": ["base"], + "application": True, + "category": "Tutorials", + "installable": True, + "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..0e11f47e58d --- /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,base.group_user,1,1,1,1 \ No newline at end of file From 7d130c1bc639d2b5d82593e987caa3f54206e299 Mon Sep 17 00:00:00 2001 From: yacha Date: Thu, 9 Jul 2026 17:43:09 +0530 Subject: [PATCH 4/4] [ADD] estate: add menus and model field attributes Implemented Chapter 5 of the Odoo Server Framework tutorial. - Added window action for estate.property - Split XML into estate_property_views.xml and estate_menus.xml - Added three-level menu hierarchy - Added readonly and copy attributes - Added default values for bedrooms and availability date - Added reserved fields active and state --- estate/__manifest__.py | 6 ++++- estate/models/estate_property.py | 31 +++++++++++++++++++++----- estate/views/estate_menus.xml | 21 +++++++++++++++++ estate/views/estate_property_views.xml | 11 +++++++++ 4 files changed, 63 insertions(+), 6 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 ba0b3ed9c20..ad3ebaa49d5 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -7,5 +7,9 @@ "category": "Tutorials", "installable": 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 78eb2568d09..47fd06f797d 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,17 +1,25 @@ -from odoo import models, fields +from odoo import api, models, fields +from dateutil.relativedelta import relativedelta + + +@api.model +def _default_date_availability(self): + return fields.Date.today() + relativedelta(months=3) class EstateProperty(models.Model): _name = "estate.property" _description = "Real Estate Property" - name = fields.Char(required=True) + active = fields.Boolean() + + name = fields.Char(required=True, default="Unknown") description = fields.Text() postcode = fields.Char() - date_availability = fields.Date() + date_availability = fields.Date(copy=False, default=_default_date_availability) 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() @@ -25,3 +33,16 @@ class EstateProperty(models.Model): ("west", "West"), ] ) + state = fields.Selection( + [ + ("new", "New"), + ("offer_received", "Offer Received"), + ("offer_accepted", "Offer Accepted"), + ("sold", "Sold"), + ("cancelled", "Cancelled"), + ], + string="State", + required=True, + copy=False, + default="new", + ) diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml new file mode 100644 index 00000000000..a91ca33bee7 --- /dev/null +++ b/estate/views/estate_menus.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + \ 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..00e611be6fe --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,11 @@ + + + + Properties + estate.property + list,form + + + \ No newline at end of file