From e6f8dbdd00aa1b58e76cba8d421e5798af5c535a Mon Sep 17 00:00:00 2001 From: "Omar Khalil (omkha)" Date: Mon, 15 Dec 2025 15:13:40 +0100 Subject: [PATCH 1/6] [ADD] Chapter 2: Adding Real Estate Module. Defining Manifest and Init --- estate/__init__.py | 0 estate/__manifest__.py | 6 ++++++ 2 files changed, 6 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..cc9fd4d195d --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,6 @@ +{ + 'name': 'real estate', + 'category': 'Tutorials', + 'version': '1.0', + 'application': True, +} \ No newline at end of file From 4a69d2fc121f1ffc16cc117877393d3bb3bf6d96 Mon Sep 17 00:00:00 2001 From: "Omar Khalil (omkha)" Date: Tue, 16 Dec 2025 13:47:12 +0100 Subject: [PATCH 2/6] [IMP] Adding Buildings Model to Estate Module --- estate/__init__.py | 1 + estate/models/__init__.py | 1 + estate/models/buildings_model.py | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 estate/models/__init__.py create mode 100644 estate/models/buildings_model.py diff --git a/estate/__init__.py b/estate/__init__.py index e69de29bb2d..fbc2395c56a 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models as 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..141763df885 --- /dev/null +++ b/estate/models/__init__.py @@ -0,0 +1 @@ +from . import buildings_model as buildings_model \ No newline at end of file diff --git a/estate/models/buildings_model.py b/estate/models/buildings_model.py new file mode 100644 index 00000000000..044caa230b2 --- /dev/null +++ b/estate/models/buildings_model.py @@ -0,0 +1,20 @@ +from odoo import models, fields + +class buildings_model(models.Model): + _name = 'estate.buildings' + _description = 'Buildings Model' + + name = fields.Char() + description = fields.Text() + value = fields.Integer() + garden_orientation = fields.Selection( + 'Garden Orientation', + [ + ('north', 'North'), + ('south', 'South'), + ('east', 'East'), + ('west', 'West') + ] + ) + + \ No newline at end of file From e47cf30e62326b0ee95e4e01e2948025e214c8c4 Mon Sep 17 00:00:00 2001 From: "Omar Khalil (omkha)" Date: Tue, 16 Dec 2025 13:48:07 +0100 Subject: [PATCH 3/6] [IMP] Adding an access control for estate module --- estate/__manifest__.py | 4 ++++ estate/security/ir.model.access.csv | 2 ++ 2 files changed, 6 insertions(+) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index cc9fd4d195d..005f6e64f7b 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -3,4 +3,8 @@ 'category': 'Tutorials', 'version': '1.0', 'application': True, + 'data': [ + 'security/ir.model.access.csv', + ], + } \ 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..9cc3e2f5e0c --- /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_first_model,access_first_model,model_estate_buildings,base.group_user,1,1,1,0 \ No newline at end of file From bf9de48c178bf7f25a3e1bff12477473ef94f778 Mon Sep 17 00:00:00 2001 From: "Omar Khalil (omkha)" Date: Tue, 16 Dec 2025 21:56:22 +0100 Subject: [PATCH 4/6] [IMP] Completed Chapter 5: Added Basic GUI to Estate Module --- estate/__init__.py | 2 +- estate/__manifest__.py | 18 ++++++++--------- estate/models/__init__.py | 2 +- estate/models/buildings_model.py | 34 +++++++++++++++++++++----------- estate/views/menus.xml | 8 ++++++++ estate/views/views.xml | 8 ++++++++ 6 files changed, 49 insertions(+), 23 deletions(-) create mode 100644 estate/views/menus.xml create mode 100644 estate/views/views.xml diff --git a/estate/__init__.py b/estate/__init__.py index fbc2395c56a..253f5724e28 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -1 +1 @@ -from . import models as models \ No newline at end of file +from . import models as models diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 005f6e64f7b..709121b2037 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,10 +1,10 @@ { - 'name': 'real estate', - 'category': 'Tutorials', - 'version': '1.0', - 'application': True, - 'data': [ - 'security/ir.model.access.csv', - ], - -} \ No newline at end of file + "name": "real estate", + "description": "real estate renting management system", + "category": "Tutorials", + "version": "1.1", + "application": True, + "data": ["security/ir.model.access.csv", "views/views.xml", "views/menus.xml"], + "author": "OMKHA", + "license": "LGPL-3", +} diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 141763df885..c730c8fe56b 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1 @@ -from . import buildings_model as buildings_model \ No newline at end of file +from . import buildings_model as buildings_model diff --git a/estate/models/buildings_model.py b/estate/models/buildings_model.py index 044caa230b2..2bd7f64a289 100644 --- a/estate/models/buildings_model.py +++ b/estate/models/buildings_model.py @@ -1,20 +1,30 @@ -from odoo import models, fields +from odoo import models, fields +from datetime import timedelta + class buildings_model(models.Model): - _name = 'estate.buildings' - _description = 'Buildings Model' + _name = "estate.buildings" + _description = "Buildings Model" name = fields.Char() description = fields.Text() - value = fields.Integer() + value = fields.Integer(readonly=True, copy=False) + availability_date = fields.Date( + default=fields.Date.today() + timedelta(days=90), copy=False + ) + number_of_rooms = fields.Integer(default=2) garden_orientation = fields.Selection( - 'Garden Orientation', + [("north", "North"), ("south", "South"), ("east", "East"), ("west", "West")], + "garden Orientation", + ) + active = fields.Boolean(default=True) + state = fields.Selection( [ - ('north', 'North'), - ('south', 'South'), - ('east', 'East'), - ('west', 'West') - ] + ("new", "New"), + ("offer received", "Offer Received"), + ("offer accepted", "Offer Accepted"), + ("sold", "Sold"), + ("canceled", "Canceled"), + ], + default="new", ) - - \ No newline at end of file diff --git a/estate/views/menus.xml b/estate/views/menus.xml new file mode 100644 index 00000000000..89a76615b61 --- /dev/null +++ b/estate/views/menus.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/estate/views/views.xml b/estate/views/views.xml new file mode 100644 index 00000000000..96f079d7dff --- /dev/null +++ b/estate/views/views.xml @@ -0,0 +1,8 @@ + + + + Test action 1 + estate.buildings + list,form + + \ No newline at end of file From ce471ef0d3d9aa56d912596d1b1d0b502e13df13 Mon Sep 17 00:00:00 2001 From: "Omar Khalil (omkha)" Date: Wed, 17 Dec 2025 14:45:53 +0100 Subject: [PATCH 5/6] [IMP] Chapter 6: Addin Filters, Group By, Search, and Forms. --- estate/models/buildings_model.py | 3 +- estate/views/views.xml | 57 ++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/estate/models/buildings_model.py b/estate/models/buildings_model.py index 2bd7f64a289..30acb7bcd7f 100644 --- a/estate/models/buildings_model.py +++ b/estate/models/buildings_model.py @@ -8,7 +8,7 @@ class buildings_model(models.Model): name = fields.Char() description = fields.Text() - value = fields.Integer(readonly=True, copy=False) + value = fields.Integer(copy=False) availability_date = fields.Date( default=fields.Date.today() + timedelta(days=90), copy=False ) @@ -28,3 +28,4 @@ class buildings_model(models.Model): ], default="new", ) + post_code = fields.Integer(default=1000) diff --git a/estate/views/views.xml b/estate/views/views.xml index 96f079d7dff..1c93fa88cb7 100644 --- a/estate/views/views.xml +++ b/estate/views/views.xml @@ -5,4 +5,61 @@ estate.buildings list,form + + estate.buildings.list + estate.buildings + + + + + + + + + + + + estate.buildings.form + estate.buildings + +
+ + + + + + + + + + + + + + + + + + + + +
+
+
+ + + estate.buildings.search + estate.buildings + + + + + + + + + + + + \ No newline at end of file From 0225b68428971c7d1bdfa184121b39a2397cc4a7 Mon Sep 17 00:00:00 2001 From: "Omar Khalil (omkha)" Date: Thu, 18 Dec 2025 10:52:52 +0100 Subject: [PATCH 6/6] [IMP] Chapter 7: Added Tags, Buyer, Seller, and Offer models to Estate Module. Improved UI to show all the details about each building --- estate/__init__.py | 2 +- estate/models/__init__.py | 5 ++++- estate/models/building_type_model.py | 8 ++++++++ estate/models/buildings_model.py | 7 +++++++ estate/models/offers_model.py | 15 +++++++++++++++ estate/models/tags_model.py | 8 ++++++++ estate/security/ir.model.access.csv | 5 ++++- estate/views/views.xml | 22 +++++++++++++++++++++- 8 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 estate/models/building_type_model.py create mode 100644 estate/models/offers_model.py create mode 100644 estate/models/tags_model.py diff --git a/estate/__init__.py b/estate/__init__.py index 253f5724e28..0650744f6bc 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -1 +1 @@ -from . import models as models +from . import models diff --git a/estate/models/__init__.py b/estate/models/__init__.py index c730c8fe56b..e8decb89cb0 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1,4 @@ -from . import buildings_model as buildings_model +from . import buildings_model +from . import building_type_model +from . import tags_model +from . import offers_model diff --git a/estate/models/building_type_model.py b/estate/models/building_type_model.py new file mode 100644 index 00000000000..03cdfa87ae6 --- /dev/null +++ b/estate/models/building_type_model.py @@ -0,0 +1,8 @@ +from odoo import models, fields + + +class building_type_model(models.Model): + _name = "estate.building_type" + _description = "Building Type Model" + + name = fields.Char(required=True) diff --git a/estate/models/buildings_model.py b/estate/models/buildings_model.py index 30acb7bcd7f..7b22e6759ee 100644 --- a/estate/models/buildings_model.py +++ b/estate/models/buildings_model.py @@ -29,3 +29,10 @@ class buildings_model(models.Model): default="new", ) post_code = fields.Integer(default=1000) + building_type_id = fields.Many2one("estate.building_type", string="Building Type") + buyer_id = fields.Many2one("res.partner", string="Buyer") + salesperson_id = fields.Many2one( + "res.users", string="Salesperson", default=lambda self: self.env.user + ) + tag_ids = fields.Many2many("estate.building_tags", string="Tags") + offer_ids = fields.One2many("estate.offers", "building_id", string="Offers") diff --git a/estate/models/offers_model.py b/estate/models/offers_model.py new file mode 100644 index 00000000000..fcc87cb4de9 --- /dev/null +++ b/estate/models/offers_model.py @@ -0,0 +1,15 @@ +from odoo import models, fields + + +class offers_model(models.Model): + _name = "estate.offers" + _description = "Offers Model" + + price = fields.Integer(required=True) + status = fields.Selection( + [("accepted", "Accepted"), ("refused", "Refused")], + string="Status", + required=True, + ) + building_id = fields.Many2one("estate.buildings", string="Building") + partner_id = fields.Many2one("res.partner", string="Partner") diff --git a/estate/models/tags_model.py b/estate/models/tags_model.py new file mode 100644 index 00000000000..132bc310076 --- /dev/null +++ b/estate/models/tags_model.py @@ -0,0 +1,8 @@ +from odoo import models, fields + + +class building_tags_model(models.Model): + _name = "estate.building_tags" + _description = "Building Tags Model" + + name = fields.Char(required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 9cc3e2f5e0c..35ac03fe733 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_first_model,access_first_model,model_estate_buildings,base.group_user,1,1,1,0 \ No newline at end of file +access_first_model,access_first_model,model_estate_buildings,base.group_user,1,1,1,1 +access_building_type_model,access_building_type_model,model_estate_building_type,base.group_user,1,1,1,1 +access_building_tags_model,access_building_tags_model,model_estate_building_tags,base.group_user,1,1,1,1 +access_offers_model,access_offers_model,model_estate_offers,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/estate/views/views.xml b/estate/views/views.xml index 1c93fa88cb7..9071a277c7e 100644 --- a/estate/views/views.xml +++ b/estate/views/views.xml @@ -14,6 +14,7 @@ + @@ -27,9 +28,11 @@ + + @@ -39,7 +42,24 @@ - + + + + + + + + + + + + + + + + + +