From a6ef0c08a8ab0380b288d14ab582969b48de662f Mon Sep 17 00:00:00 2001 From: "Aditi Pawar(adpaw)" Date: Tue, 10 Mar 2026 18:38:02 +0530 Subject: [PATCH 1/4] [ADD] Estate: Chapter 2 & 3 Initial setup completed for creating a new estate module. Created the base estate module and installed it. Initialized model and model fields which generates tables using odoo ORM. --- estate/__init__.py | 1 + estate/__manifest__.py | 6 ++++++ estate/models/__init__.py | 1 + estate/models/estate_property.py | 37 ++++++++++++++++++++++++++++++++ 4 files changed, 45 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..0650744f6bc --- /dev/null +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/estate/__manifest__.py b/estate/__manifest__.py new file mode 100644 index 00000000000..6044f1059fb --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,6 @@ +{ + 'name': 'Real Estate', + 'depends': [ + 'base', + ], +} diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..5e1963c9d2f --- /dev/null +++ b/estate/models/__init__.py @@ -0,0 +1 @@ +from . import estate_property diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py new file mode 100644 index 00000000000..2d75caffdb3 --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,37 @@ +from odoo import fields, models + +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(copy=False, default=lambda self: fields.Datetime.today()) + expected_price = fields.Float(required=True) + 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( + string='Orientation', + selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')], + help="Direction the garden faces" + ) + active = fields.Boolean(default=True) + state = fields.Selection( + selection=[ + ('new', 'New'), + ('offer_received', 'Offer Received'), + ('offer_accepted', 'Offer Accepted'), + ('sold', 'Sold'), + ('canceled', 'Canceled'), + ], + string='Status', + required=True, + copy=False, + default='new', + ) \ No newline at end of file From 09c816f73cb4f6c23a3d49c1e094d2f832b21c9f Mon Sep 17 00:00:00 2001 From: "Aditi Pawar(adpaw)" Date: Wed, 11 Mar 2026 17:50:44 +0530 Subject: [PATCH 2/4] [IMP] Estate: Fixed issues and completed Chapter 4 Fixed issues and errors raised by the first push. Defined access rights by creating security/ir.model.access.csv file in estate. Defined the csv file in manifest. --- estate/__manifest__.py | 7 +++++++ estate/models/estate_property.py | 25 +++++++------------------ estate/security/ir.model.access.csv | 2 ++ 3 files changed, 16 insertions(+), 18 deletions(-) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 6044f1059fb..73d780531bd 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,13 @@ { 'name': 'Real Estate', + 'author': 'Aditi (adpaw)', + 'license': 'LGPL-3', 'depends': [ 'base', ], + 'data': [ + 'security/ir.model.access.csv', + ], + 'installable': True, + 'application': True, } diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 2d75caffdb3..a7480d61211 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,5 +1,6 @@ from odoo import fields, models + class EstateProperty(models.Model): _name = "estate.property" _description = "Real Estate Property" @@ -7,10 +8,10 @@ class EstateProperty(models.Model): name = fields.Char(required=True) description = fields.Text() postcode = fields.Char() - date_availability = fields.Date(copy=False, default=lambda self: fields.Datetime.today()) + date_availability = fields.Date expected_price = fields.Float(required=True) - selling_price = fields.Float(readonly=True, copy=False) - bedrooms = fields.Integer(default=2) + selling_price = fields.Float + bedrooms = fields.Integer living_area = fields.Integer() facades = fields.Integer() garage = fields.Boolean() @@ -18,20 +19,8 @@ class EstateProperty(models.Model): garden_area = fields.Integer() garden_orientation = fields.Selection( string='Orientation', - selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')], + selection=[ + ('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')], help="Direction the garden faces" + ) - active = fields.Boolean(default=True) - state = fields.Selection( - selection=[ - ('new', 'New'), - ('offer_received', 'Offer Received'), - ('offer_accepted', 'Offer Accepted'), - ('sold', 'Sold'), - ('canceled', 'Canceled'), - ], - string='Status', - required=True, - copy=False, - default='new', - ) \ No newline at end of file diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..976b61e8cb3 --- /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 85a7c032a38e10c84ac2e5012a2cfb51ae6a63a4 Mon Sep 17 00:00:00 2001 From: "Aditi Pawar(adpaw)" Date: Thu, 12 Mar 2026 18:40:53 +0530 Subject: [PATCH 3/4] [IMP] Estate: Completed 2 sections in chapter-5 Added actions and menus in the module. Created estate_property_views.xml for the window action. Added estate_property_menus.xml to define the 3-level menu structure. Registered new XML files in the manifest data list. --- estate/__manifest__.py | 2 ++ estate/views/estate_property_menus.xml | 7 +++++++ estate/views/estate_property_views.xml | 7 +++++++ 3 files changed, 16 insertions(+) create mode 100644 estate/views/estate_property_menus.xml create mode 100644 estate/views/estate_property_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 73d780531bd..1f67a75e150 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -7,6 +7,8 @@ ], 'data': [ 'security/ir.model.access.csv', + 'views/estate_property_views.xml', + 'views/estate_property_menus.xml', ], 'installable': True, 'application': True, diff --git a/estate/views/estate_property_menus.xml b/estate/views/estate_property_menus.xml new file mode 100644 index 00000000000..1c6d53ac7bd --- /dev/null +++ b/estate/views/estate_property_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..4d544c18597 --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,7 @@ + + + Properties + estate.property + list,form + + From 31b94d02f228aeda01a5daab992a72e92b065aab Mon Sep 17 00:00:00 2001 From: "Aditi Pawar(adpaw)" Date: Fri, 13 Mar 2026 19:11:46 +0530 Subject: [PATCH 4/4] =?UTF-8?q?=1B[200~[IMP]=20Estate:=20Completed=20chapt?= =?UTF-8?q?er=205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implemented fields, attributes and views. Configure field attributes: 'readonly' for selling_price and 'copy=False' where needed. set default value for bedrooms and dynamic default for availability date. Implement reserved fields: 'active' and 'state' --- awesome_gallery/models/ir_action.py | 2 +- estate/models/estate_property.py | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/awesome_gallery/models/ir_action.py b/awesome_gallery/models/ir_action.py index eae20acbf5c..8cf0277e0ff 100644 --- a/awesome_gallery/models/ir_action.py +++ b/awesome_gallery/models/ir_action.py @@ -5,6 +5,6 @@ class ActWindowView(models.Model): _inherit = 'ir.actions.act_window.view' - view_mode = fields.Selection(selection_add=[ + .Selection(selection_add=[ ('gallery', "Awesome Gallery") ], ondelete={'gallery': 'cascade'}) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index a7480d61211..e5ca0ef2667 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -8,12 +8,13 @@ class EstateProperty(models.Model): name = fields.Char(required=True) description = fields.Text() postcode = fields.Char() - date_availability = fields.Date + date_availability = fields.Date(copy=False, default=lambda self: 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() + active = fields.Boolean(default=True) garage = fields.Boolean() garden = fields.Boolean() garden_area = fields.Integer() @@ -24,3 +25,16 @@ class EstateProperty(models.Model): help="Direction the garden faces" ) + state = fields.Selection( + selection=[ + ('new', 'New'), + ('offer_received', 'Offer Received'), + ('offer_accepted', 'Offer Accepted'), + ('sold', 'Sold'), + ('canceled', 'Cancelled'), + ], + string="Status", + required=True, + copy=False, + default='new', + )