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/9] [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/9] [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/9] [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 94a540ef9e8162c1456f1c8630ae2b65484bd433 Mon Sep 17 00:00:00 2001 From: "Aditi Pawar(adpaw)" Date: Fri, 13 Mar 2026 19:11:46 +0530 Subject: [PATCH 4/9] [IMP] Estate: Completed chapter 5 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', + ) From 8521ee9410485c5406f9c14d31182e451e543c43 Mon Sep 17 00:00:00 2001 From: "Aditi Pawar(adpaw)" Date: Mon, 16 Mar 2026 09:59:19 +0530 Subject: [PATCH 5/9] [FIX] estate: fixed the issues Fixed issues in the previous commit. --- awesome_gallery/models/ir_action.py | 2 +- estate/models/estate_property.py | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/awesome_gallery/models/ir_action.py b/awesome_gallery/models/ir_action.py index 8cf0277e0ff..1be8a53222d 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' - .Selection(selection_add=[ +view_mode = fields.Selection(selection_add=[ ('gallery', "Awesome Gallery") ], ondelete={'gallery': 'cascade'}) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index e5ca0ef2667..f51ee74535a 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -19,19 +19,19 @@ class EstateProperty(models.Model): garden = fields.Boolean() garden_area = fields.Integer() garden_orientation = fields.Selection( - string='Orientation', + string="Orientation", selection=[ - ('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')], + ('north', "North"), ('south', "South"), ('east', "East"), ('west', "West")], help="Direction the garden faces" ) state = fields.Selection( selection=[ - ('new', 'New'), - ('offer_received', 'Offer Received'), - ('offer_accepted', 'Offer Accepted'), - ('sold', 'Sold'), - ('canceled', 'Cancelled'), + ('new', "New"), + ('offer_received', "Offer Received"), + ("offer_accepted", "Offer Accepted"), + ('sold', "Sold"), + ('canceled', "Cancelled"), ], string="Status", required=True, From 5b1412bd1212f8888472041eee814043d325ea54 Mon Sep 17 00:00:00 2001 From: "Aditi Pawar(adpaw)" Date: Mon, 16 Mar 2026 22:57:03 +0530 Subject: [PATCH 6/9] [IMP] estate: Fixed issues and completed chapter 6 --- awesome_gallery/models/ir_action.py | 1 + estate/models/estate_property.py | 2 +- estate/views/estate_property_menus.xml | 4 +- estate/views/estate_property_views.xml | 79 ++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 3 deletions(-) diff --git a/awesome_gallery/models/ir_action.py b/awesome_gallery/models/ir_action.py index 1be8a53222d..12bf17e5013 100644 --- a/awesome_gallery/models/ir_action.py +++ b/awesome_gallery/models/ir_action.py @@ -5,6 +5,7 @@ class ActWindowView(models.Model): _inherit = 'ir.actions.act_window.view' + view_mode = fields.Selection(selection_add=[ ('gallery', "Awesome Gallery") ], ondelete={'gallery': 'cascade'}) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index f51ee74535a..ae1a166eecc 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -36,5 +36,5 @@ class EstateProperty(models.Model): string="Status", required=True, copy=False, - default='new', + default="new", ) diff --git a/estate/views/estate_property_menus.xml b/estate/views/estate_property_menus.xml index 1c6d53ac7bd..5d240e46a1a 100644 --- a/estate/views/estate_property_menus.xml +++ b/estate/views/estate_property_menus.xml @@ -2,6 +2,6 @@ + action="estate_property_action" + parent="estate_first_level_menu"/> diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 4d544c18597..4c917ec392f 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -4,4 +4,83 @@ estate.property list,form + + + estate.property.list + estate.property + + + + + + + + + + + + + + + estate.property.form + estate.property + +
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + estate.property.search + estate.property + + + + + + + + + + + + + + + + + + + From a7fc97b54f9e754f3f2a8e6cf7b66bf3d53ed97d Mon Sep 17 00:00:00 2001 From: "Aditi Pawar(adpaw)" Date: Tue, 17 Mar 2026 23:47:09 +0530 Subject: [PATCH 7/9] [IMP] Estate: Partially completed chapter 7 Created new model called estate_property_type.py. Added actions and menus. Implemented list, form and search views in estate_property_types.xml --- awesome_gallery/models/ir_action.py | 3 +- estate/__manifest__.py | 1 + estate/models/__init__.py | 1 + estate/models/estate_property.py | 17 ++++++- estate/models/estate_property_types.py | 8 ++++ estate/security/ir.model.access.csv | 3 +- estate/views/estate_property_menus.xml | 15 ++++--- estate/views/estate_property_types_views.xml | 33 ++++++++++++++ estate/views/estate_property_views.xml | 47 +++++++++++--------- 9 files changed, 97 insertions(+), 31 deletions(-) create mode 100644 estate/models/estate_property_types.py create mode 100644 estate/views/estate_property_types_views.xml diff --git a/awesome_gallery/models/ir_action.py b/awesome_gallery/models/ir_action.py index 12bf17e5013..eae20acbf5c 100644 --- a/awesome_gallery/models/ir_action.py +++ b/awesome_gallery/models/ir_action.py @@ -5,7 +5,6 @@ class ActWindowView(models.Model): _inherit = 'ir.actions.act_window.view' - -view_mode = fields.Selection(selection_add=[ + view_mode = fields.Selection(selection_add=[ ('gallery', "Awesome Gallery") ], ondelete={'gallery': 'cascade'}) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 1f67a75e150..3843eed2ba8 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -8,6 +8,7 @@ 'data': [ 'security/ir.model.access.csv', 'views/estate_property_views.xml', + 'views/estate_property_types_views.xml', 'views/estate_property_menus.xml', ], 'installable': True, diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 5e1963c9d2f..06c549bcf89 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1,2 @@ from . import estate_property +from . import estate_property_types diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index ae1a166eecc..3a0f727c74c 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -2,7 +2,7 @@ class EstateProperty(models.Model): - _name = "estate.property" + _name = 'estate.property' _description = "Real Estate Property" name = fields.Char(required=True) @@ -23,7 +23,20 @@ class EstateProperty(models.Model): selection=[ ('north', "North"), ('south', "South"), ('east', "East"), ('west', "West")], help="Direction the garden faces" - + ) + property_type_id = fields.Many2one( + 'estate.property.type', + string='Property Type' + ) + buyer_id = fields.Many2one( + 'res.partner', + string='Buyer', + copy=False + ) + salesperson_id = fields.Many2one( + 'res.users', + string='Salesperson', + default=lambda self: self.env.user ) state = fields.Selection( selection=[ diff --git a/estate/models/estate_property_types.py b/estate/models/estate_property_types.py new file mode 100644 index 00000000000..e51a916bd9b --- /dev/null +++ b/estate/models/estate_property_types.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class EstatePropertyType(models.Model): + _name = 'estate.property.type' + _description = "Property Type" + + name = fields.Char(string="Name", required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 976b61e8cb3..1b712a3f909 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 \ No newline at end of file +access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 +access_estate_property_type,access_estate_property_type,model_estate_property_type,base.group_user,1,1,1,1 diff --git a/estate/views/estate_property_menus.xml b/estate/views/estate_property_menus.xml index 5d240e46a1a..756844388ee 100644 --- a/estate/views/estate_property_menus.xml +++ b/estate/views/estate_property_menus.xml @@ -1,7 +1,12 @@ - - - + + + + + + diff --git a/estate/views/estate_property_types_views.xml b/estate/views/estate_property_types_views.xml new file mode 100644 index 00000000000..c4871c30561 --- /dev/null +++ b/estate/views/estate_property_types_views.xml @@ -0,0 +1,33 @@ + + + Property Types + estate.property.type + list,form + + + + estate.property.type.list + estate.property.type + + + + + + + + + estate.property.type.form + estate.property.type + +
+ +
+

+ +

+
+
+
+
+
+
diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 4c917ec392f..025410428e4 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -35,6 +35,7 @@ + @@ -55,32 +56,36 @@ - + + + + + + + + - estate.property.search - estate.property - - - - - - - - - - - - - - + estate.property.search + estate.property + + + + + + + + + + + - - - - + + + + From 68e69b03f04e59836aae620e5935707570faac20 Mon Sep 17 00:00:00 2001 From: "Aditi Pawar(adpaw)" Date: Wed, 18 Mar 2026 18:48:45 +0530 Subject: [PATCH 8/9] [IMP] Estate: Completed Chapter-7 Implemented Many2many and One2many relations. Added estate.property.tag model with Many2many relation to estate.property Added offer_ids One2many field to display offers on property form Created corresponding views, menus, actions and access to above models and files --- estate/__manifest__.py | 2 ++ estate/models/__init__.py | 2 ++ estate/models/estate_property.py | 19 ++++---------- estate/models/estate_property_offer.py | 17 ++++++++++++ estate/models/estate_property_tags.py | 8 ++++++ estate/models/estate_property_types.py | 2 +- estate/security/ir.model.access.csv | 2 ++ estate/views/estate_property_menus.xml | 5 ++++ estate/views/estate_property_offer_views.xml | 27 ++++++++++++++++++++ estate/views/estate_property_tags_views.xml | 7 +++++ estate/views/estate_property_views.xml | 10 ++++++++ 11 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 estate/models/estate_property_offer.py create mode 100644 estate/models/estate_property_tags.py create mode 100644 estate/views/estate_property_offer_views.xml create mode 100644 estate/views/estate_property_tags_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 3843eed2ba8..d0c3f1468c8 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -9,6 +9,8 @@ 'security/ir.model.access.csv', 'views/estate_property_views.xml', 'views/estate_property_types_views.xml', + 'views/estate_property_tags_views.xml', + 'views/estate_property_offer_views.xml', 'views/estate_property_menus.xml', ], 'installable': True, diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 06c549bcf89..b77e6f6703e 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,2 +1,4 @@ from . import estate_property from . import estate_property_types +from . import estate_property_tags +from . import estate_property_offer diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 3a0f727c74c..f7042aa771d 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -24,20 +24,10 @@ class EstateProperty(models.Model): ('north', "North"), ('south', "South"), ('east', "East"), ('west', "West")], help="Direction the garden faces" ) - property_type_id = fields.Many2one( - 'estate.property.type', - string='Property Type' - ) - buyer_id = fields.Many2one( - 'res.partner', - string='Buyer', - copy=False - ) - salesperson_id = fields.Many2one( - 'res.users', - string='Salesperson', - default=lambda self: self.env.user - ) + tag_ids = fields.Many2many('estate.property.tag', string="Tags") + property_type_id = fields.Many2one('estate.property.type', string="Property Type") + buyer_id = fields.Many2one('res.partner', string="Buyer", copy=False) + salesperson_id = fields.Many2one('res.users', string="Salesperson", default=lambda self: self.env.user) state = fields.Selection( selection=[ ('new', "New"), @@ -51,3 +41,4 @@ class EstateProperty(models.Model): copy=False, default="new", ) + offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers") diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py new file mode 100644 index 00000000000..2477b274061 --- /dev/null +++ b/estate/models/estate_property_offer.py @@ -0,0 +1,17 @@ +from odoo import fields, models + + +class EstatepropertyOffer(models.Model): + _name = 'estate.property.offer' + _description = "Property Offers" + + price = fields.Float() + status = fields.Selection( + 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_tags.py b/estate/models/estate_property_tags.py new file mode 100644 index 00000000000..8a5d64b48cf --- /dev/null +++ b/estate/models/estate_property_tags.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class EstatePropertyTags(models.Model): + _name = 'estate.property.tag' + _description = "Property Tags" + + name = fields.Char(required=True) diff --git a/estate/models/estate_property_types.py b/estate/models/estate_property_types.py index e51a916bd9b..3a56a9e478c 100644 --- a/estate/models/estate_property_types.py +++ b/estate/models/estate_property_types.py @@ -5,4 +5,4 @@ class EstatePropertyType(models.Model): _name = 'estate.property.type' _description = "Property Type" - name = fields.Char(string="Name", required=True) + name = fields.Char(required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 1b712a3f909..49bca99cac8 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,3 +1,5 @@ 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_property_type,model_estate_property_type,base.group_user,1,1,1,1 +access_estate_property_tag,access_estate_property_tag,model_estate_property_tag,base.group_user,1,1,1,1 +access_estate_property_offer,access_estate_property_offer,model_estate_property_offer,base.group_user,1,1,1,1 diff --git a/estate/views/estate_property_menus.xml b/estate/views/estate_property_menus.xml index 756844388ee..65abf089eb4 100644 --- a/estate/views/estate_property_menus.xml +++ b/estate/views/estate_property_menus.xml @@ -9,4 +9,9 @@ + + + diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml new file mode 100644 index 00000000000..5b48a2ba294 --- /dev/null +++ b/estate/views/estate_property_offer_views.xml @@ -0,0 +1,27 @@ + + + estate.property.offer.list + estate.property.offer + + + + + + + + + + + estate.property.offer.form + estate.property.offer + +
+ + + + + +
+
+
+
\ No newline at end of file diff --git a/estate/views/estate_property_tags_views.xml b/estate/views/estate_property_tags_views.xml new file mode 100644 index 00000000000..b3ab8fd9a1c --- /dev/null +++ b/estate/views/estate_property_tags_views.xml @@ -0,0 +1,7 @@ + + + Property Tags + estate.property.tag + list,form + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 025410428e4..48a92e08e3b 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -32,6 +32,7 @@ + @@ -63,6 +64,15 @@ + + + + + + + + + From 8e1e94263a0f79de1c4353b4e362f5ffd10db8ed Mon Sep 17 00:00:00 2001 From: "Aditi Pawar(adpaw)" Date: Mon, 30 Mar 2026 19:01:17 +0530 Subject: [PATCH 9/9] [IMP] estate: Partially completed Chapter 8 Understood the concept of computed and relational fields. Imported api from odoo to supports depends decorator. Calculated total area by adding living area and garden area. And best price by selecting the highest offer price using mapped method. --- estate/models/estate_property.py | 20 +++++++++++++++++--- estate/views/estate_property_menus.xml | 1 - estate/views/estate_property_offer_views.xml | 2 +- estate/views/estate_property_views.xml | 8 ++++++-- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index f7042aa771d..8c54a57c928 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): @@ -12,12 +12,12 @@ class EstateProperty(models.Model): 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(string="living area(sqm)") facades = fields.Integer() active = fields.Boolean(default=True) garage = fields.Boolean() garden = fields.Boolean() - garden_area = fields.Integer() + garden_area = fields.Integer(string="Garden area(sqm)") garden_orientation = fields.Selection( string="Orientation", selection=[ @@ -25,9 +25,11 @@ class EstateProperty(models.Model): help="Direction the garden faces" ) tag_ids = fields.Many2many('estate.property.tag', string="Tags") + property_type_id = fields.Many2one('estate.property.type', string="Property Type") buyer_id = fields.Many2one('res.partner', string="Buyer", copy=False) salesperson_id = fields.Many2one('res.users', string="Salesperson", default=lambda self: self.env.user) + state = fields.Selection( selection=[ ('new', "New"), @@ -42,3 +44,15 @@ class EstateProperty(models.Model): default="new", ) offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers") + total_area = fields.Float(string="Total Area (sqm)", compute="_compute_total_area") + best_price = fields.Float(string="Best Offer", compute="_compute_best_price") + + @api.depends("living_area", "garden_area") + def _compute_total_area(self): + for record in self: + record.total_area = record.living_area + record.garden_area + + @api.depends("offer_ids.price") + def _compute_best_price(self): + for record in self: + record.best_price = max(record.offer_ids.mapped("price"), default=0.0) diff --git a/estate/views/estate_property_menus.xml b/estate/views/estate_property_menus.xml index 65abf089eb4..2e3bf4a8d6d 100644 --- a/estate/views/estate_property_menus.xml +++ b/estate/views/estate_property_menus.xml @@ -14,4 +14,3 @@ action="estate_property_tag_action" parent="estate_second_level_menu"/> - diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 5b48a2ba294..81e6337b458 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -24,4 +24,4 @@ - \ No newline at end of file + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 48a92e08e3b..00d2e1d0c2d 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -30,7 +30,7 @@

+ placeholder="Property Name"/>

@@ -43,6 +43,7 @@ + @@ -56,6 +57,9 @@ + + + @@ -91,7 +95,7 @@ - +