From 8b6a0819c11fa6a0859f576508c98995518b70a9 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 11:30:03 +0300 Subject: [PATCH 01/59] Remove estate/models.py file as part of project restructuring. --- estate/models/__init__.py | 1 + estate/models/estate_property.py | 4 ++++ estate/{ => models}/models.py | 0 3 files changed, 5 insertions(+) create mode 100644 estate/models/__init__.py create mode 100644 estate/models/estate_property.py rename estate/{ => models}/models.py (100%) 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..72b0ca03f5b --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,4 @@ +from odoo import models + +class EstateProperty(models.Model): + _name = "estate_property" \ No newline at end of file diff --git a/estate/models.py b/estate/models/models.py similarity index 100% rename from estate/models.py rename to estate/models/models.py From 89b5a433cb2cb5c79000ff1b34ef4be8bf0ba709 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 11:34:38 +0300 Subject: [PATCH 02/59] Update version number in __manifest__.py from 16.0.0 to 18.0.1.0.1 --- estate/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index d7cfa57d4c5..73bdf49414e 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "16.0.0", # Version + "version": "18.0.1.0.1", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies "data": [ From e4f81a5469c710537f1053fe0ab35d5310820813 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 11:36:53 +0300 Subject: [PATCH 03/59] Update version number to 18.0.1.0.2 and add fields to EstateProperty model for enhanced property details and features. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 33 ++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 73bdf49414e..734f9f4ee6e 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.1", # Version + "version": "18.0.1.0.2", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies "data": [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 72b0ca03f5b..28cd3dcdf1d 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,33 @@ -from odoo import models +from odoo import models, fields class EstateProperty(models.Model): - _name = "estate_property" \ No newline at end of file + _name = "estate_property" + _description = "Real Estate Property" + + # Basic Information + name = fields.Char(required=True) + description = fields.Text() + postcode = fields.Char() + date_availability = fields.Date() + + # Pricing + expected_price = fields.Float(required=True) + selling_price = fields.Float() + + # Property Details + bedrooms = fields.Integer(default=2) + living_area = fields.Integer() + facades = fields.Integer() + + # Features + garage = fields.Boolean() + garden = fields.Boolean() + garden_area = fields.Integer() + garden_orientation = fields.Selection( + selection=[ + ('north', 'North'), + ('south', 'South'), + ('east', 'East'), + ('west', 'West'), + ] + ) \ No newline at end of file From 3519c09564e2e4fe374058a11462c98b50dd0c56 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 11:55:37 +0300 Subject: [PATCH 04/59] Add security access rules by including 'security/ir.model.access.csv' in the manifest data for the estate module. --- estate/__manifest__.py | 5 +++-- estate/security/ir.model.access.csv | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 734f9f4ee6e..66db73b4e8b 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -3,9 +3,10 @@ "version": "18.0.1.0.2", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies - "data": [ - + 'data': [ + 'security/ir.model.access.csv', ], + "installable": True, 'license': 'LGPL-3', } diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..722b7bd118d --- /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_user,access_estate_property_user,model_estate_property,base.group_user,1,1,1,1 From e3c918cf4b3ec374d2a3b74a9d50c0e27cb564bc Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 11:58:36 +0300 Subject: [PATCH 05/59] Update version number to 18.0.1.0.3 in __manifest__.py for the estate module. --- estate/__manifest__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 66db73b4e8b..376abd6d7a7 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,12 +1,12 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.2", # Version + "version": "18.0.1.0.3", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ 'security/ir.model.access.csv', ], - + "installable": True, 'license': 'LGPL-3', } From cbe9c14cd1472c408ebc4d27ad12902a6d990aca Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 12:07:30 +0300 Subject: [PATCH 06/59] Update version number to 18.0.1.0.4 and add 'views/estate_property_views.xml' to the manifest data for the estate module. --- estate/__manifest__.py | 5 ++++- estate/views/estate_property_views.xml | 0 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 estate/views/estate_property_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 376abd6d7a7..17790ebe900 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,10 +1,13 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.3", # Version + "version": "18.0.1.0.4", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ + + 'views/estate_property_views.xml', 'security/ir.model.access.csv', + ], "installable": True, diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml new file mode 100644 index 00000000000..e69de29bb2d From 303b185bc2558948751206ff8cdceaf727f25e19 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 12:11:30 +0300 Subject: [PATCH 07/59] Add initial XML structure for estate_property_views.xml file in the estate module. --- estate/__manifest__.py | 2 +- estate/views/estate_property_views.xml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 17790ebe900..a2d7778ff7a 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.4", # Version + "version": "18.0.1.0.5", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index e69de29bb2d..414b92c2ea2 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From 147cd2efa17ac9dfdc500d209c020ec7a2260ce1 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 12:16:17 +0300 Subject: [PATCH 08/59] Update version number to 18.0.1.0.6 in __manifest__.py and add estate property form view definition in estate_property_views.xml. --- estate/__manifest__.py | 2 +- estate/views/estate_property_views.xml | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index a2d7778ff7a..cce8099cda8 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.5", # Version + "version": "18.0.1.0.6", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 414b92c2ea2..d8f5e4979b1 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,4 +1,8 @@ - + + Estate Property + estate.property + form + \ No newline at end of file From e2e36c6d27c14b3f282c6bf53b587d0fb37d5f62 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 12:19:49 +0300 Subject: [PATCH 09/59] Update version number to 18.0.1.0.7 in __manifest__.py and change model name from 'estate_property' to 'estate.property' in estate_property.py for consistency with Odoo naming conventions. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index cce8099cda8..0e891e42130 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.6", # Version + "version": "18.0.1.0.7", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 28cd3dcdf1d..9967d070440 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,7 +1,7 @@ from odoo import models, fields class EstateProperty(models.Model): - _name = "estate_property" + _name = "estate.property" _description = "Real Estate Property" # Basic Information From e6a74dec97d74ef275df2a817716a988a5fe9763 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 12:26:13 +0300 Subject: [PATCH 10/59] Update version number to 18.0.1.0.8 in __manifest__.py and add 'views/estate_menus.xml' to the manifest data for the estate module. --- estate/__manifest__.py | 3 ++- estate/views/estate_menus.xml | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 estate/views/estate_menus.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 0e891e42130..9ca76b39326 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,11 +1,12 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.7", # Version + "version": "18.0.1.0.8", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ 'views/estate_property_views.xml', + 'views/estate_menus.xml', 'security/ir.model.access.csv', ], diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml new file mode 100644 index 00000000000..e3b0162728b --- /dev/null +++ b/estate/views/estate_menus.xml @@ -0,0 +1,8 @@ + + + + + + + + From 7dbed069e50b1ec202625d579e776cd03a7a1c29 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 12:33:13 +0300 Subject: [PATCH 11/59] Update estate_property.py to set 'copy=False' for date_availability and selling_price fields, ensuring proper data handling in the EstateProperty model. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 9ca76b39326..9cdc01dbf86 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.8", # Version + "version": "18.0.1.0.9", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 9967d070440..592d12469f7 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -8,11 +8,11 @@ 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) # Pricing expected_price = fields.Float(required=True) - selling_price = fields.Float() + selling_price = fields.Float(readonly=True, copy=False) # Property Details bedrooms = fields.Integer(default=2) From 950045a701d4d0a551e7b0d462fbfed332155dbe Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 12:36:06 +0300 Subject: [PATCH 12/59] Update version number to 18.0.1.0.10 in __manifest__.py and set default value for date_availability field in EstateProperty model to two months from today. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 9cdc01dbf86..a53b4b186ba 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.9", # Version + "version": "18.0.1.0.10", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 592d12469f7..66b53652391 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -8,7 +8,7 @@ class EstateProperty(models.Model): name = fields.Char(required=True) description = fields.Text() postcode = fields.Char() - date_availability = fields.Date(copy=False) + date_availability = fields.Date(copy=False, default=lambda self: fields.Date.add(fields.Date.today(), months=2)) # Pricing expected_price = fields.Float(required=True) From 28c2e6d9685def0836caddc3b6c464b994dd5652 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 12:37:58 +0300 Subject: [PATCH 13/59] Add 'active' field to EstateProperty model and update view mode in estate_property_views.xml to include list view. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 1 + estate/views/estate_property_views.xml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index a53b4b186ba..0a07fbf83a3 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.10", # Version + "version": "18.0.1.0.11", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 66b53652391..ef652496081 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -9,6 +9,7 @@ class EstateProperty(models.Model): description = fields.Text() postcode = fields.Char() date_availability = fields.Date(copy=False, default=lambda self: fields.Date.add(fields.Date.today(), months=2)) + active = fields.Boolean(default=True) # Pricing expected_price = fields.Float(required=True) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index d8f5e4979b1..f3d83fd0c68 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -3,6 +3,6 @@ Estate Property estate.property - form + form, list \ No newline at end of file From e236589558d356909df0ee44e8e8d83787c5c03c Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 12:42:29 +0300 Subject: [PATCH 14/59] Add 'state' field to EstateProperty model with selection options for property status. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 9 +++- estate/views/estate_menus.xml | 2 +- estate/views/estate_property_views.xml | 72 ++++++++++++++++++++++++-- 4 files changed, 77 insertions(+), 8 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 0a07fbf83a3..94966f5cc46 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.11", # Version + "version": "18.0.1.0.12", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index ef652496081..ab5ac4883ca 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -10,7 +10,14 @@ class EstateProperty(models.Model): postcode = fields.Char() date_availability = fields.Date(copy=False, default=lambda self: fields.Date.add(fields.Date.today(), months=2)) active = fields.Boolean(default=True) - + state = fields.Selection( + selection=[ + ('new', 'New'), + ('offer_received', 'Offer Received'), + ('offer_accepted', 'Offer Accepted'), + ('sold', 'Sold'), + ('cancelled', 'Cancelled'), + ], default='new') # Pricing expected_price = fields.Float(required=True) selling_price = fields.Float(readonly=True, copy=False) diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index e3b0162728b..5626f92c819 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -2,7 +2,7 @@ - + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index f3d83fd0c68..a7737f02f0d 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,8 +1,70 @@ - - Estate Property - estate.property - form, list - + + + estate.property.form + estate.property + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + + estate.property.list + estate.property + + + + + + + + + + + + + + + + + Estate Properties + estate.property + list,form + + +

+ Create your first property! +

+
+
\ No newline at end of file From aef14966630fc309331f68a6ec4d26bbbc64e560 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 12:46:56 +0300 Subject: [PATCH 15/59] Update version number to 18.0.1.0.13 in __manifest__.py, reorder data entries for clarity, and add logging to EstateProperty model initialization in estate_property.py. --- estate/__manifest__.py | 10 ++++------ estate/models/estate_property.py | 7 +++++++ estate/models/models.py | 0 3 files changed, 11 insertions(+), 6 deletions(-) delete mode 100644 estate/models/models.py diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 94966f5cc46..5ab0a00364e 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,14 +1,12 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.12", # Version + "version": "18.0.1.0.13", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ - - 'views/estate_property_views.xml', - 'views/estate_menus.xml', - 'security/ir.model.access.csv', - + 'security/ir.model.access.csv', + 'views/estate_property_views.xml', + 'views/estate_menus.xml', ], "installable": True, diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index ab5ac4883ca..aa1f510591f 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,8 +1,15 @@ from odoo import models, fields +import logging + +_logger = logging.getLogger(__name__) class EstateProperty(models.Model): _name = "estate.property" _description = "Real Estate Property" + + def __init__(self, *args, **kwargs): + super(EstateProperty, self).__init__(*args, **kwargs) + _logger.info("EstateProperty model initialized with state field") # Basic Information name = fields.Char(required=True) diff --git a/estate/models/models.py b/estate/models/models.py deleted file mode 100644 index e69de29bb2d..00000000000 From a4d8c7f5554c516da8cf7f739076a85ead139590 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 12:49:51 +0300 Subject: [PATCH 16/59] Refactor EstateProperty model initialization to use _auto_init method, adding detailed logging for debugging during model setup. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 5ab0a00364e..b9ae6fa21b2 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.13", # Version + "version": "18.0.1.0.14", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index aa1f510591f..44f21ea4a6c 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -7,9 +7,12 @@ class EstateProperty(models.Model): _name = "estate.property" _description = "Real Estate Property" - def __init__(self, *args, **kwargs): - super(EstateProperty, self).__init__(*args, **kwargs) - _logger.info("EstateProperty model initialized with state field") + def _auto_init(self): + """Override _auto_init to add debugging info when model is initialized""" + _logger.info("EstateProperty model being initialized with state field") + result = super(EstateProperty, self)._auto_init() + _logger.info("EstateProperty model successfully initialized") + return result # Basic Information name = fields.Char(required=True) From b930a24fab395ec28a8c7d48062b61577658af1b Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 12:52:24 +0300 Subject: [PATCH 17/59] Remove deprecated logging and XML view definitions from EstateProperty model and views, streamlining the codebase for improved maintainability. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 10 ---- estate/views/estate_property_views.xml | 66 -------------------------- 3 files changed, 1 insertion(+), 77 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index b9ae6fa21b2..d1e76f76974 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.14", # Version + "version": "18.0.1.0.15", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 44f21ea4a6c..ab5ac4883ca 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,18 +1,8 @@ from odoo import models, fields -import logging - -_logger = logging.getLogger(__name__) class EstateProperty(models.Model): _name = "estate.property" _description = "Real Estate Property" - - def _auto_init(self): - """Override _auto_init to add debugging info when model is initialized""" - _logger.info("EstateProperty model being initialized with state field") - result = super(EstateProperty, self)._auto_init() - _logger.info("EstateProperty model successfully initialized") - return result # Basic Information name = fields.Char(required=True) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index a7737f02f0d..414b92c2ea2 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,70 +1,4 @@ - - - estate.property.form - estate.property - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- - - estate.property.list - estate.property - - - - - - - - - - - - - - - - - Estate Properties - estate.property - list,form - - -

- Create your first property! -

-
-
\ No newline at end of file From af47b94218509452b15e60a7642865f2d11169ae Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 12:56:41 +0300 Subject: [PATCH 18/59] new --- estate/__manifest__.py | 2 +- estate/views/estate_property_views.xml | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index d1e76f76974..24c9a19de0a 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.15", # Version + "version": "18.0.1.0.16", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 414b92c2ea2..2aeea75992a 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,4 +1,8 @@ - + + Estate Property + estate.property + list,form + \ No newline at end of file From 1a9b8c0f21b649577345c32342a734d8489a056a Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 13:03:04 +0300 Subject: [PATCH 19/59] Update version number to 18.0.1.0.17 in __manifest__.py and rename action record in estate_property_views.xml for improved clarity and consistency. --- estate/__manifest__.py | 2 +- estate/views/estate_property_views.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 24c9a19de0a..faaa48b7917 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.16", # Version + "version": "18.0.1.0.17", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 2aeea75992a..9c74f925fc9 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,6 +1,6 @@ - + Estate Property estate.property list,form From 864efc1fe19d8edc1ab66e2c76f5716e0dfe809b Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 13:35:10 +0300 Subject: [PATCH 20/59] Enhance estate_property_views.xml by adding a detailed list view definition for estate properties and updating the action window to reference the new list view, improving user interface clarity and functionality. --- estate/views/estate_property_views.xml | 30 +++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 9c74f925fc9..a7e16832f73 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,8 +1,28 @@ - - Estate Property - estate.property - list,form - + + + estate.property.list + estate.property + + + + + + + + + + + + + + + + + Estate Properties + estate.property + list,form + + \ No newline at end of file From 8b5a3defb99a76fb0c714850f6ab817fb954966e Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 13:36:13 +0300 Subject: [PATCH 21/59] Update version number to 18.0.1.0.18 in __manifest__.py for the Estate module, reflecting the latest changes and improvements. --- estate/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index faaa48b7917..71b9178542e 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.17", # Version + "version": "18.0.1.0.18", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ From 37d4d6a29edb0194bb660a16236fb060c3c6af7d Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 13:42:38 +0300 Subject: [PATCH 22/59] Update version number to 18.0.1.0.19 in __manifest__.py and add a new form view definition for estate properties in estate_property_views.xml, enhancing the user interface and data entry experience. --- estate/__manifest__.py | 2 +- estate/views/estate_property_views.xml | 49 ++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 71b9178542e..e3f88b5c417 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.18", # Version + "version": "18.0.1.0.19", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index a7e16832f73..5f0b776dc84 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -18,6 +18,55 @@ + + + estate.property.form + estate.property + +
+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ Estate Properties From 8d01890f75a5f8df72f7ee294c44a5f5d9361b44 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 13:47:57 +0300 Subject: [PATCH 23/59] Add search view definition for estate properties in estate_property_views.xml, enhancing search functionality and user experience. Update action window to reference the new search view for improved navigation. --- estate/__manifest__.py | 2 +- estate/views/estate_property_views.xml | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index e3f88b5c417..8679f1ae04f 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.19", # Version + "version": "18.0.1.0.20", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 5f0b776dc84..0e84843c0fd 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -67,11 +67,37 @@ + + + estate.property.search + estate.property + + + + + + + + + + + + + + + + + + + + Estate Properties estate.property list,form + +
\ No newline at end of file From 01de875f752dee55234927b3a7cfdff5338ccfd9 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 13:54:30 +0300 Subject: [PATCH 24/59] Update version number to 18.0.1.0.21 in __manifest__.py and remove the form view reference from estate_property_views.xml, streamlining the view configuration for improved clarity. --- estate/__manifest__.py | 2 +- estate/views/estate_property_views.xml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 8679f1ae04f..cb5e1e0a796 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.20", # Version + "version": "18.0.1.0.21", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 0e84843c0fd..5b446d3990f 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -98,6 +98,5 @@ list,form - \ No newline at end of file From 71d29093763e253ab740364ca9e191f21cf1e31b Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 14:04:52 +0300 Subject: [PATCH 25/59] Update version number to 18.0.1.0.22 in __manifest__.py and remove references to view IDs in estate_property_views.xml, simplifying the view configuration for better maintainability. --- estate/__manifest__.py | 2 +- estate/views/estate_property_views.xml | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index cb5e1e0a796..4966dbd7ab3 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.21", # Version + "version": "18.0.1.0.22", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 5b446d3990f..8d7256a357f 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -96,7 +96,5 @@ Estate Properties estate.property list,form - - \ No newline at end of file From b76bf7b8b3c14a202ace713a6db045a9f48284d2 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 14:13:17 +0300 Subject: [PATCH 26/59] Update version number to 18.0.1.0.23 in __manifest__.py and comment out view definitions in estate_property_views.xml for improved maintainability and clarity. --- estate/__manifest__.py | 2 +- estate/views/estate_property_views.xml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 4966dbd7ab3..c9d8361daa0 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.22", # Version + "version": "18.0.1.0.23", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 8d7256a357f..2c7bb74ad5a 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -19,7 +19,7 @@ - + - + From 7edb0975bedc7aa1c1f713b18cb8a6312f33a70f Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 14:21:18 +0300 Subject: [PATCH 27/59] Uncomment view definitions in estate_property_views.xml to restore form and search views, enhancing maintainability and clarity in the estate property module. --- estate/views/estate_property_views.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 2c7bb74ad5a..5c732cc5d90 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -19,7 +19,7 @@ - + - + From 7f4b01f52a951f1eccf841e7593fb8ee61f88bb3 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 14:29:20 +0300 Subject: [PATCH 28/59] Add view ID and search view ID references in estate_property_views.xml to enhance view configuration and improve user navigation within the estate property module. --- estate/__manifest__.py | 2 +- estate/views/estate_property_views.xml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index c9d8361daa0..020fde76ecb 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.23", # Version + "version": "18.0.1.0.24", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 5c732cc5d90..940c467f851 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -96,5 +96,7 @@ Estate Properties estate.property list,form + + \ No newline at end of file From b310dd7bc696aa912584b0538189547712427800 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 14:42:03 +0300 Subject: [PATCH 29/59] Update version number to 18.0.1.0.25 in __manifest__.py, add property_type_id field to EstateProperty model, and enhance estate_property_views.xml with property type field and filter for improved property management and user experience. --- estate/__manifest__.py | 3 +- estate/models/__init__.py | 1 + estate/models/estate_property.py | 1 + estate/models/estate_property_type.py | 8 ++++ estate/security/ir.model.access.csv | 1 + estate/views/estate_menus.xml | 3 ++ estate/views/estate_property_type_views.xml | 48 +++++++++++++++++++++ estate/views/estate_property_views.xml | 4 ++ 8 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 estate/models/estate_property_type.py create mode 100644 estate/views/estate_property_type_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 020fde76ecb..dba10a53fde 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,11 +1,12 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.24", # Version + "version": "18.0.1.0.25", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ 'security/ir.model.access.csv', 'views/estate_property_views.xml', + 'views/estate_property_type_views.xml', 'views/estate_menus.xml', ], 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.py b/estate/models/estate_property.py index ab5ac4883ca..79d00100e49 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -18,6 +18,7 @@ class EstateProperty(models.Model): ('sold', 'Sold'), ('cancelled', 'Cancelled'), ], default='new') + property_type_id = fields.Many2one("estate.property.type", string="Property Type") # Pricing expected_price = fields.Float(required=True) selling_price = fields.Float(readonly=True, copy=False) diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py new file mode 100644 index 00000000000..2116668531b --- /dev/null +++ b/estate/models/estate_property_type.py @@ -0,0 +1,8 @@ +from odoo import models, fields + +class EstatePropertyType(models.Model): + _name = "estate.property.type" + _description = "Real Estate Property Type" + + # Basic Information + name = fields.Char(required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 722b7bd118d..294e1108c05 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_user,access_estate_property_user,model_estate_property,base.group_user,1,1,1,1 +access_estate_property_type_user,access_estate_property_type_user,model_estate_property_type,base.group_user,1,1,1,1 diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index 5626f92c819..1ef6cbbf8bd 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -4,5 +4,8 @@ + + + diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml new file mode 100644 index 00000000000..594c2af94bc --- /dev/null +++ b/estate/views/estate_property_type_views.xml @@ -0,0 +1,48 @@ + + + + + estate.property.type.list + estate.property.type + + + + + + + + + + estate.property.type.form + estate.property.type + +
+ +

+ +

+
+
+
+
+ + + + estate.property.type.search + estate.property.type + + + + + + + + + + Property Types + estate.property.type + list,form + + + +
diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 940c467f851..c6be95d3b9f 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -7,6 +7,7 @@ + @@ -30,6 +31,7 @@ + @@ -74,6 +76,7 @@ + @@ -85,6 +88,7 @@ + From c8a015997510cc5f810274931aa4756418729989 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 14:45:33 +0300 Subject: [PATCH 30/59] Update version number to 18.0.1.0.26 in __manifest__.py, add salesperson_id and buyer_id fields to EstateProperty model, and enhance estate_property_views.xml with a new "People" page for better property management and user experience. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 6 +++++- estate/models/estate_property_type.py | 1 + estate/views/estate_property_views.xml | 6 ++++++ 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index dba10a53fde..8db51755a8f 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.25", # Version + "version": "18.0.1.0.26", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 79d00100e49..78a20fb4550 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -39,4 +39,8 @@ class EstateProperty(models.Model): ('east', 'East'), ('west', 'West'), ] - ) \ No newline at end of file + ) + + # People + salesperson_id = fields.Many2one('res.users', string='Salesperson', default=lambda self: self.env.user) + buyer_id = fields.Many2one('res.partner', string='Buyer', copy=False) \ No newline at end of file diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index 2116668531b..c88e8a5915f 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -6,3 +6,4 @@ class EstatePropertyType(models.Model): # Basic Information name = fields.Char(required=True) + \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index c6be95d3b9f..41ff30806d5 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -59,6 +59,12 @@ + + + + + + From 82f412a96cf85131eb521408ffe1815c5696227c Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 14:51:14 +0300 Subject: [PATCH 31/59] Update version number to 18.0.1.0.27 in __manifest__.py, add tag_ids field to EstateProperty model, and enhance estate_property_views.xml with tag selection for improved property categorization. Also, add access rights for estate_property_tag in ir.model.access.csv and include menu item for property tags in estate_menus.xml. --- estate/__manifest__.py | 3 +- estate/models/__init__.py | 3 +- estate/models/estate_property.py | 5 ++- estate/models/estate_property_tag.py | 9 +++++ estate/security/ir.model.access.csv | 1 + estate/views/estate_menus.xml | 1 + estate/views/estate_property_tag_views.xml | 46 ++++++++++++++++++++++ estate/views/estate_property_views.xml | 4 ++ 8 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 estate/models/estate_property_tag.py create mode 100644 estate/views/estate_property_tag_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 8db51755a8f..99b0a332e9e 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,12 +1,13 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.26", # Version + "version": "18.0.1.0.27", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ 'security/ir.model.access.csv', 'views/estate_property_views.xml', 'views/estate_property_type_views.xml', + 'views/estate_property_tag_views.xml', 'views/estate_menus.xml', ], diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 97aee757823..fdab6f99948 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,2 +1,3 @@ from . import estate_property -from . import estate_property_type \ No newline at end of file +from . import estate_property_type +from . import estate_property_tag \ No newline at end of file diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 78a20fb4550..708a99fb51d 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -43,4 +43,7 @@ class EstateProperty(models.Model): # People salesperson_id = fields.Many2one('res.users', string='Salesperson', default=lambda self: self.env.user) - buyer_id = fields.Many2one('res.partner', string='Buyer', copy=False) \ No newline at end of file + buyer_id = fields.Many2one('res.partner', string='Buyer', copy=False) + + # Tags + tag_ids = fields.Many2many('estate.property.tag', string='Tags') \ No newline at end of file diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py new file mode 100644 index 00000000000..20dc49b077c --- /dev/null +++ b/estate/models/estate_property_tag.py @@ -0,0 +1,9 @@ +from odoo import models, fields + +class EstatePropertyTag(models.Model): + _name = "estate.property.tag" + _description = "Real Estate Property Tag" + + # Basic Information + name = fields.Char(required=True) + \ No newline at end of file diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 294e1108c05..1d45e278a68 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,3 +1,4 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink access_estate_property_user,access_estate_property_user,model_estate_property,base.group_user,1,1,1,1 access_estate_property_type_user,access_estate_property_type_user,model_estate_property_type,base.group_user,1,1,1,1 +access_estate_property_tag_user,access_estate_property_tag_user,model_estate_property_tag,base.group_user,1,1,1,1 diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index 1ef6cbbf8bd..7c07380b235 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -6,6 +6,7 @@
+ diff --git a/estate/views/estate_property_tag_views.xml b/estate/views/estate_property_tag_views.xml new file mode 100644 index 00000000000..8e65c5e03b7 --- /dev/null +++ b/estate/views/estate_property_tag_views.xml @@ -0,0 +1,46 @@ + + + + + estate.property.tag.list + estate.property.tag + + + + + + + + + + estate.property.tag.form + estate.property.tag + +
+ +

+ +

+
+
+
+
+ + + + estate.property.tag.search + estate.property.tag + + + + + + + + + + Property Tags + estate.property.tag + list,form + +
diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 41ff30806d5..d63ef31cfed 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -9,6 +9,7 @@ + @@ -29,6 +30,9 @@

+ + + From cac6e32c9888834b3fc11e50b0f2e6770ded5d63 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 14:55:18 +0300 Subject: [PATCH 32/59] Update version number to 18.0.1.0.28 in __manifest__.py, add offer_ids field to EstateProperty model, and enhance estate_property_views.xml with a new "Offers" page for better property management. Also, add access rights for estate_property_offer in ir.model.access.csv. --- estate/__manifest__.py | 3 +- estate/models/__init__.py | 3 +- estate/models/estate_property.py | 5 ++- estate/models/estate_property_offer.py | 17 +++++++++++ estate/security/ir.model.access.csv | 1 + estate/views/estate_property_offer_views.xml | 32 ++++++++++++++++++++ estate/views/estate_property_views.xml | 3 ++ 7 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 estate/models/estate_property_offer.py create mode 100644 estate/views/estate_property_offer_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 99b0a332e9e..3f0ecda7e76 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.27", # Version + "version": "18.0.1.0.28", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ @@ -8,6 +8,7 @@ 'views/estate_property_views.xml', 'views/estate_property_type_views.xml', 'views/estate_property_tag_views.xml', + 'views/estate_property_offer_views.xml', 'views/estate_menus.xml', ], diff --git a/estate/models/__init__.py b/estate/models/__init__.py index fdab6f99948..09b2099fe84 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,3 +1,4 @@ from . import estate_property from . import estate_property_type -from . import estate_property_tag \ No newline at end of file +from . import estate_property_tag +from . import estate_property_offer \ No newline at end of file diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 708a99fb51d..a3c2f51959d 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -46,4 +46,7 @@ class EstateProperty(models.Model): buyer_id = fields.Many2one('res.partner', string='Buyer', copy=False) # Tags - tag_ids = fields.Many2many('estate.property.tag', string='Tags') \ No newline at end of file + tag_ids = fields.Many2many('estate.property.tag', string='Tags') + + # Offers + offer_ids = fields.One2many('estate.property.offer', 'property_id', string='Offers') \ No newline at end of file diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py new file mode 100644 index 00000000000..9b33e93c61e --- /dev/null +++ b/estate/models/estate_property_offer.py @@ -0,0 +1,17 @@ +from odoo import models, fields + +class EstatePropertyOffer(models.Model): + _name = "estate.property.offer" + _description = "Real Estate Property Offer" + + # Basic Information + price = fields.Float() + status = fields.Selection( + selection=[ + ('accepted', 'Accepted'), + ('refused', 'Refused'), + ], copy=False) + + # Relationships + partner_id = fields.Many2one('res.partner', string='Partner', required=True) + property_id = fields.Many2one('estate.property', string='Property', required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 1d45e278a68..a42bd95f417 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -2,3 +2,4 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink access_estate_property_user,access_estate_property_user,model_estate_property,base.group_user,1,1,1,1 access_estate_property_type_user,access_estate_property_type_user,model_estate_property_type,base.group_user,1,1,1,1 access_estate_property_tag_user,access_estate_property_tag_user,model_estate_property_tag,base.group_user,1,1,1,1 +access_estate_property_offer_user,access_estate_property_offer_user,model_estate_property_offer,base.group_user,1,1,1,1 diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml new file mode 100644 index 00000000000..74fe35ddf76 --- /dev/null +++ b/estate/views/estate_property_offer_views.xml @@ -0,0 +1,32 @@ + + + + + estate.property.offer.list + estate.property.offer + + + + + + + + + + + + estate.property.offer.form + estate.property.offer + +
+ + + + + + + +
+
+
+
diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index d63ef31cfed..853f368eee1 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -69,6 +69,9 @@
+ + + From 04010fd8303287c9cebb741ad2d6180a024f3933 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 15:10:21 +0300 Subject: [PATCH 33/59] Enhance EstatePropertyOffer and EstateProperty models with validity and deadline fields, and add computed methods for best price and total area. Update views to display new fields for improved property offer management. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 18 ++++++++++++-- estate/models/estate_property_offer.py | 26 +++++++++++++++++++- estate/views/estate_property_offer_views.xml | 4 +++ estate/views/estate_property_views.xml | 2 ++ 5 files changed, 48 insertions(+), 4 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 3f0ecda7e76..1906d4b55a9 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.28", # Version + "version": "18.0.1.0.29", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index a3c2f51959d..fa10142aa55 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,4 @@ -from odoo import models, fields +from odoo import models, fields, api class EstateProperty(models.Model): _name = "estate.property" @@ -22,11 +22,13 @@ class EstateProperty(models.Model): # Pricing expected_price = fields.Float(required=True) selling_price = fields.Float(readonly=True, copy=False) + best_price = fields.Float(compute='_compute_best_price', string='Best Offer') # Property Details bedrooms = fields.Integer(default=2) living_area = fields.Integer() facades = fields.Integer() + total_area = fields.Integer(compute='_compute_total_area', string='Total Area') # Features garage = fields.Boolean() @@ -49,4 +51,16 @@ class EstateProperty(models.Model): tag_ids = fields.Many2many('estate.property.tag', string='Tags') # Offers - offer_ids = fields.One2many('estate.property.offer', 'property_id', string='Offers') \ No newline at end of file + offer_ids = fields.One2many('estate.property.offer', 'property_id', string='Offers') + + # Computed Methods + @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: + prices = record.offer_ids.mapped('price') + record.best_price = max(prices) if prices else 0.0 \ No newline at end of file diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index 9b33e93c61e..3af8aabbb46 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,4 +1,5 @@ -from odoo import models, fields +from odoo import models, fields, api +from datetime import timedelta class EstatePropertyOffer(models.Model): _name = "estate.property.offer" @@ -11,7 +12,30 @@ class EstatePropertyOffer(models.Model): ('accepted', 'Accepted'), ('refused', 'Refused'), ], copy=False) + validity = fields.Integer(default=7, string='Validity (days)') + date_deadline = fields.Date(compute='_compute_date_deadline', inverse='_inverse_date_deadline', string='Deadline') # Relationships partner_id = fields.Many2one('res.partner', string='Partner', required=True) property_id = fields.Many2one('estate.property', string='Property', required=True) + + # Computed Methods + @api.depends('create_date', 'validity') + def _compute_date_deadline(self): + for record in self: + # Use create_date if available, otherwise use today as fallback + base_date = record.create_date.date() if record.create_date else fields.Date.today() + record.date_deadline = base_date + timedelta(days=record.validity) + + def _inverse_date_deadline(self): + for record in self: + if record.date_deadline and record.create_date: + # Calculate validity based on deadline and create_date + base_date = record.create_date.date() + delta = record.date_deadline - base_date + record.validity = delta.days + elif record.date_deadline: + # If no create_date, use today as fallback + today = fields.Date.today() + delta = record.date_deadline - today + record.validity = delta.days diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 74fe35ddf76..edfbeeb6810 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -8,6 +8,8 @@ + + @@ -23,6 +25,8 @@ + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 853f368eee1..bfa1fbe63bc 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -42,6 +42,7 @@ + @@ -54,6 +55,7 @@ +
From a2ab98aebfa188d0099b15ceaf93cb430550dda6 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 15:16:39 +0300 Subject: [PATCH 34/59] Update version number to 18.0.1.0.30 in __manifest__.py and add onchange method for garden in EstateProperty model to manage garden area and orientation dynamically. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 1906d4b55a9..61308bb8eff 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.29", # Version + "version": "18.0.1.0.30", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index fa10142aa55..b6e74a6e52f 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -63,4 +63,14 @@ def _compute_total_area(self): def _compute_best_price(self): for record in self: prices = record.offer_ids.mapped('price') - record.best_price = max(prices) if prices else 0.0 \ No newline at end of file + record.best_price = max(prices) if prices else 0.0 + + # Onchange Methods + @api.onchange('garden') + def _onchange_garden(self): + if self.garden: + self.garden_area = 10 + self.garden_orientation = 'north' + else: + self.garden_area = 0 + self.garden_orientation = False \ No newline at end of file From 4aa0c48baa4f898744f0f386a45f6a382592e586 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 15:23:53 +0300 Subject: [PATCH 35/59] Update version number to 18.0.1.0.31 in __manifest__.py, implement action methods for accepting and refusing offers in EstatePropertyOffer model, and add action methods for cancelling and selling properties in EstateProperty model. Enhance views to include buttons for these actions, improving property offer management and user experience. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 18 ++++++++++++++++- estate/models/estate_property_offer.py | 21 ++++++++++++++++++++ estate/views/estate_property_offer_views.xml | 4 ++++ estate/views/estate_property_views.xml | 6 +++++- 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 61308bb8eff..3ba2c2d4b2a 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.30", # Version + "version": "18.0.1.0.31", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index b6e74a6e52f..e403b42df09 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,5 @@ from odoo import models, fields, api +from odoo.exceptions import UserError class EstateProperty(models.Model): _name = "estate.property" @@ -73,4 +74,19 @@ def _onchange_garden(self): self.garden_orientation = 'north' else: self.garden_area = 0 - self.garden_orientation = False \ No newline at end of file + self.garden_orientation = False + + # Button Action Methods (Public - no underscore prefix) + def action_cancel(self): + for record in self: + if record.state == 'sold': + raise UserError("Cannot cancel a sold property") + record.state = 'cancelled' + return True + + def action_sold(self): + for record in self: + if record.state == 'cancelled': + raise UserError("Cannot sell a cancelled property") + record.state = 'sold' + return True \ No newline at end of file diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index 3af8aabbb46..9b8561344b2 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,5 +1,6 @@ from odoo import models, fields, api from datetime import timedelta +from odoo.exceptions import UserError class EstatePropertyOffer(models.Model): _name = "estate.property.offer" @@ -39,3 +40,23 @@ def _inverse_date_deadline(self): today = fields.Date.today() delta = record.date_deadline - today record.validity = delta.days + + # Button Action Methods (Public - no underscore prefix) + def action_accept(self): + for record in self: + # Refuse all other offers for this property first + other_offers = record.property_id.offer_ids.filtered(lambda o: o.id != record.id) + other_offers.write({'status': 'refused'}) + + # Accept this offer + record.status = 'accepted' + + # Set buyer and selling price on the property + record.property_id.buyer_id = record.partner_id + record.property_id.selling_price = record.price + return True + + def action_refuse(self): + for record in self: + record.status = 'refused' + return True diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index edfbeeb6810..d0ec7e02c70 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -21,6 +21,10 @@ estate.property.offer
+
+
diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index bfa1fbe63bc..8eab5438380 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -26,6 +26,11 @@ estate.property +
+

@@ -77,7 +82,6 @@ - From 5ef1e7e728477aa80fb66a7cc980c0916ed17a8a Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 15:28:37 +0300 Subject: [PATCH 36/59] Update version number to 18.0.1.0.32 in __manifest__.py and add SQL constraints for positive offer prices in EstatePropertyOffer, unique property tag names in EstatePropertyTag, unique property type names in EstatePropertyType, and positive expected and selling prices in EstateProperty for improved data integrity. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 5 +++++ estate/models/estate_property_offer.py | 4 ++++ estate/models/estate_property_tag.py | 4 ++++ estate/models/estate_property_type.py | 4 ++++ 5 files changed, 18 insertions(+), 1 deletion(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 3ba2c2d4b2a..77d0dbb7fd2 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.31", # Version + "version": "18.0.1.0.32", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index e403b42df09..3eab3f965da 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -4,6 +4,11 @@ class EstateProperty(models.Model): _name = "estate.property" _description = "Real Estate Property" + + _sql_constraints = [ + ('check_expected_price', 'CHECK(expected_price > 0)', 'Expected price must be strictly positive'), + ('check_selling_price', 'CHECK(selling_price >= 0)', 'Selling price must be positive'), + ] # Basic Information name = fields.Char(required=True) diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index 9b8561344b2..e116d19976d 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -5,6 +5,10 @@ class EstatePropertyOffer(models.Model): _name = "estate.property.offer" _description = "Real Estate Property Offer" + + _sql_constraints = [ + ('check_offer_price', 'CHECK(price > 0)', 'Offer price must be strictly positive'), + ] # Basic Information price = fields.Float() diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py index 20dc49b077c..c6d8fce2fde 100644 --- a/estate/models/estate_property_tag.py +++ b/estate/models/estate_property_tag.py @@ -3,6 +3,10 @@ class EstatePropertyTag(models.Model): _name = "estate.property.tag" _description = "Real Estate Property Tag" + + _sql_constraints = [ + ('check_name_unique', 'UNIQUE(name)', 'Property tag name must be unique'), + ] # Basic Information name = fields.Char(required=True) diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index c88e8a5915f..736b5a6db54 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -3,6 +3,10 @@ class EstatePropertyType(models.Model): _name = "estate.property.type" _description = "Real Estate Property Type" + + _sql_constraints = [ + ('check_name_unique', 'UNIQUE(name)', 'Property type name must be unique'), + ] # Basic Information name = fields.Char(required=True) From 24566158d2ecf0f871572fb4ef24422d41012912 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 15:34:59 +0300 Subject: [PATCH 37/59] Update version number to 18.0.1.0.33 in __manifest__.py and refactor SQL constraints in EstatePropertyOffer, EstatePropertyTag, EstatePropertyType, and EstateProperty models to use the new Constraint class for improved data integrity and maintainability. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 13 +++++++++---- estate/models/estate_property_offer.py | 7 ++++--- estate/models/estate_property_tag.py | 7 ++++--- estate/models/estate_property_type.py | 7 ++++--- 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 77d0dbb7fd2..1d18f2dc791 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.32", # Version + "version": "18.0.1.0.33", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 3eab3f965da..4ebf56539b4 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -5,10 +5,15 @@ class EstateProperty(models.Model): _name = "estate.property" _description = "Real Estate Property" - _sql_constraints = [ - ('check_expected_price', 'CHECK(expected_price > 0)', 'Expected price must be strictly positive'), - ('check_selling_price', 'CHECK(selling_price >= 0)', 'Selling price must be positive'), - ] + _check_expected_price = models.Constraint( + 'CHECK(expected_price > 0)', + 'Expected price must be strictly positive.', + ) + + _check_selling_price = models.Constraint( + 'CHECK(selling_price >= 0)', + 'Selling price must be positive.', + ) # Basic Information name = fields.Char(required=True) diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index e116d19976d..a26ca44b4f6 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -6,9 +6,10 @@ class EstatePropertyOffer(models.Model): _name = "estate.property.offer" _description = "Real Estate Property Offer" - _sql_constraints = [ - ('check_offer_price', 'CHECK(price > 0)', 'Offer price must be strictly positive'), - ] + _check_offer_price = models.Constraint( + 'CHECK(price > 0)', + 'Offer price must be strictly positive.', + ) # Basic Information price = fields.Float() diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py index c6d8fce2fde..52f31e2b9b6 100644 --- a/estate/models/estate_property_tag.py +++ b/estate/models/estate_property_tag.py @@ -4,9 +4,10 @@ class EstatePropertyTag(models.Model): _name = "estate.property.tag" _description = "Real Estate Property Tag" - _sql_constraints = [ - ('check_name_unique', 'UNIQUE(name)', 'Property tag name must be unique'), - ] + _check_name_unique = models.Constraint( + 'UNIQUE(name)', + 'Property tag name must be unique.', + ) # Basic Information name = fields.Char(required=True) diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index 736b5a6db54..05469b6a2ec 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -4,9 +4,10 @@ class EstatePropertyType(models.Model): _name = "estate.property.type" _description = "Real Estate Property Type" - _sql_constraints = [ - ('check_name_unique', 'UNIQUE(name)', 'Property type name must be unique'), - ] + _check_name_unique = models.Constraint( + 'UNIQUE(name)', + 'Property type name must be unique.', + ) # Basic Information name = fields.Char(required=True) From 2fe6008f993af6e341c642dcc223a0e72a5bd60f Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 15:43:04 +0300 Subject: [PATCH 38/59] Refactor SQL constraints in EstatePropertyOffer, EstatePropertyTag, EstatePropertyType, and EstateProperty models to use _sql_constraints for improved data integrity and maintainability. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 13 ++++--------- estate/models/estate_property_offer.py | 7 +++---- estate/models/estate_property_tag.py | 7 +++---- estate/models/estate_property_type.py | 7 +++---- 5 files changed, 14 insertions(+), 22 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 1d18f2dc791..0495555766f 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.33", # Version + "version": "18.0.1.0.34", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 4ebf56539b4..3eab3f965da 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -5,15 +5,10 @@ class EstateProperty(models.Model): _name = "estate.property" _description = "Real Estate Property" - _check_expected_price = models.Constraint( - 'CHECK(expected_price > 0)', - 'Expected price must be strictly positive.', - ) - - _check_selling_price = models.Constraint( - 'CHECK(selling_price >= 0)', - 'Selling price must be positive.', - ) + _sql_constraints = [ + ('check_expected_price', 'CHECK(expected_price > 0)', 'Expected price must be strictly positive'), + ('check_selling_price', 'CHECK(selling_price >= 0)', 'Selling price must be positive'), + ] # Basic Information name = fields.Char(required=True) diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index a26ca44b4f6..e116d19976d 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -6,10 +6,9 @@ class EstatePropertyOffer(models.Model): _name = "estate.property.offer" _description = "Real Estate Property Offer" - _check_offer_price = models.Constraint( - 'CHECK(price > 0)', - 'Offer price must be strictly positive.', - ) + _sql_constraints = [ + ('check_offer_price', 'CHECK(price > 0)', 'Offer price must be strictly positive'), + ] # Basic Information price = fields.Float() diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py index 52f31e2b9b6..c6d8fce2fde 100644 --- a/estate/models/estate_property_tag.py +++ b/estate/models/estate_property_tag.py @@ -4,10 +4,9 @@ class EstatePropertyTag(models.Model): _name = "estate.property.tag" _description = "Real Estate Property Tag" - _check_name_unique = models.Constraint( - 'UNIQUE(name)', - 'Property tag name must be unique.', - ) + _sql_constraints = [ + ('check_name_unique', 'UNIQUE(name)', 'Property tag name must be unique'), + ] # Basic Information name = fields.Char(required=True) diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index 05469b6a2ec..736b5a6db54 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -4,10 +4,9 @@ class EstatePropertyType(models.Model): _name = "estate.property.type" _description = "Real Estate Property Type" - _check_name_unique = models.Constraint( - 'UNIQUE(name)', - 'Property type name must be unique.', - ) + _sql_constraints = [ + ('check_name_unique', 'UNIQUE(name)', 'Property type name must be unique'), + ] # Basic Information name = fields.Char(required=True) From 6fd7240ebc4cd53c50af153aea43d7c81c50dd13 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 15:46:09 +0300 Subject: [PATCH 39/59] Update version number to 18.0.1.0.35 in __manifest__.py and add validation constraint in EstateProperty model to ensure selling price is not lower than 90% of expected price, enhancing data integrity and user feedback. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 0495555766f..2c0f84d07cf 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.34", # Version + "version": "18.0.1.0.35", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 3eab3f965da..9284a98fac8 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,5 +1,6 @@ from odoo import models, fields, api -from odoo.exceptions import UserError +from odoo.exceptions import UserError, ValidationError +from odoo.tools.float_utils import float_compare, float_is_zero class EstateProperty(models.Model): _name = "estate.property" @@ -94,4 +95,21 @@ def action_sold(self): if record.state == 'cancelled': raise UserError("Cannot sell a cancelled property") record.state = 'sold' - return True \ No newline at end of file + return True + + # Python Constraints + @api.constrains('selling_price', 'expected_price') + def _check_selling_price(self): + for record in self: + # Skip validation if selling price is zero (not yet sold) + if float_is_zero(record.selling_price, precision_digits=2): + continue + + # Calculate 90% of expected price + min_selling_price = record.expected_price * 0.9 + + # Compare selling price with minimum allowed (90% of expected) + if float_compare(record.selling_price, min_selling_price, precision_digits=2) < 0: + raise ValidationError( + f"Selling price ({record.selling_price:.2f}) cannot be lower than 90% of expected price ({min_selling_price:.2f})" + ) \ No newline at end of file From 053ca5e59a4b888d17b06ff568759c1700dc6a8b Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 15:53:31 +0300 Subject: [PATCH 40/59] Add property_ids relationship to EstatePropertyType model and enhance views with a new "Properties" tab for better property management. --- estate/__manifest__.py | 2 +- estate/models/estate_property_type.py | 3 +++ estate/views/estate_property_type_views.xml | 11 +++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 2c0f84d07cf..d64b6511ddd 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.35", # Version + "version": "18.0.1.0.36", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index 736b5a6db54..372e19f8224 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -10,4 +10,7 @@ class EstatePropertyType(models.Model): # Basic Information name = fields.Char(required=True) + + # Relationships + property_ids = fields.One2many('estate.property', 'property_type_id', string='Properties') \ No newline at end of file diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml index 594c2af94bc..6dad188bbc3 100644 --- a/estate/views/estate_property_type_views.xml +++ b/estate/views/estate_property_type_views.xml @@ -21,6 +21,17 @@

+ + + + + + + + + + +
From 2814a8fa76aad7094b148b41b60798d3ce00077a Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 15:56:19 +0300 Subject: [PATCH 41/59] Update version number to 18.0.1.0.37 in __manifest__.py and add ordering to EstatePropertyOffer, EstatePropertyTag, EstatePropertyType, and EstateProperty models for improved data retrieval and organization. --- estate/__manifest__.py | 2 +- estate/models/estate_property.py | 1 + estate/models/estate_property_offer.py | 1 + estate/models/estate_property_tag.py | 1 + estate/models/estate_property_type.py | 1 + 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index d64b6511ddd..21161578417 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.36", # Version + "version": "18.0.1.0.37", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 9284a98fac8..034fdf9dde8 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -5,6 +5,7 @@ class EstateProperty(models.Model): _name = "estate.property" _description = "Real Estate Property" + _order = "id desc" _sql_constraints = [ ('check_expected_price', 'CHECK(expected_price > 0)', 'Expected price must be strictly positive'), diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index e116d19976d..34b5171002f 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -5,6 +5,7 @@ class EstatePropertyOffer(models.Model): _name = "estate.property.offer" _description = "Real Estate Property Offer" + _order = "price desc" _sql_constraints = [ ('check_offer_price', 'CHECK(price > 0)', 'Offer price must be strictly positive'), diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py index c6d8fce2fde..2cdc2f2b035 100644 --- a/estate/models/estate_property_tag.py +++ b/estate/models/estate_property_tag.py @@ -3,6 +3,7 @@ class EstatePropertyTag(models.Model): _name = "estate.property.tag" _description = "Real Estate Property Tag" + _order = "name" _sql_constraints = [ ('check_name_unique', 'UNIQUE(name)', 'Property tag name must be unique'), diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index 372e19f8224..a684d4ce68e 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -3,6 +3,7 @@ class EstatePropertyType(models.Model): _name = "estate.property.type" _description = "Real Estate Property Type" + _order = "name" _sql_constraints = [ ('check_name_unique', 'UNIQUE(name)', 'Property type name must be unique'), From 1b90e463b3473a23d1f3c929ef9e533a48cc122f Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 16:00:23 +0300 Subject: [PATCH 42/59] Enhance EstatePropertyType model by adding a sequence field for ordering and update the view to include a handle widget for better user experience in property type management. --- estate/models/estate_property_type.py | 3 ++- estate/views/estate_property_type_views.xml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index a684d4ce68e..eaa5321911f 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -3,13 +3,14 @@ class EstatePropertyType(models.Model): _name = "estate.property.type" _description = "Real Estate Property Type" - _order = "name" + _order = "sequence, name" _sql_constraints = [ ('check_name_unique', 'UNIQUE(name)', 'Property type name must be unique'), ] # Basic Information + sequence = fields.Integer(default=10) name = fields.Char(required=True) # Relationships diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml index 6dad188bbc3..2442944dff5 100644 --- a/estate/views/estate_property_type_views.xml +++ b/estate/views/estate_property_type_views.xml @@ -6,6 +6,7 @@ estate.property.type + From d42d7fefa1d8747c343cbe0efdd9537bbf56828a Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 16:05:45 +0300 Subject: [PATCH 43/59] Update version number to 18.0.1.0.38 in __manifest__.py, add color field to EstatePropertyTag model, and enhance tag_ids field in views to utilize color options for improved user experience in property management. --- estate/__manifest__.py | 2 +- estate/models/estate_property_tag.py | 1 + estate/views/estate_property_views.xml | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 21161578417..de0f476e79d 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.37", # Version + "version": "18.0.1.0.38", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py index 2cdc2f2b035..88668412ee3 100644 --- a/estate/models/estate_property_tag.py +++ b/estate/models/estate_property_tag.py @@ -11,4 +11,5 @@ class EstatePropertyTag(models.Model): # Basic Information name = fields.Char(required=True) + color = fields.Integer() \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 8eab5438380..f0bb3e97c26 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -36,11 +36,11 @@

- + - + From 0cf2057310b734a3c2188ae3250e4e8f3dc7c59d Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 16:12:40 +0300 Subject: [PATCH 44/59] Update version number to 18.0.1.0.39 in __manifest__.py, make property offers and tags editable in the list view, and enhance button visibility in property offer and property views based on status for improved user experience in property management. --- estate/__manifest__.py | 2 +- estate/views/estate_property_offer_views.xml | 6 +++--- estate/views/estate_property_tag_views.xml | 2 +- estate/views/estate_property_views.xml | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index de0f476e79d..a130300baed 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.38", # Version + "version": "18.0.1.0.39", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index d0ec7e02c70..0d888436faf 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -5,7 +5,7 @@ estate.property.offer.list estate.property.offer - + @@ -22,8 +22,8 @@
-
diff --git a/estate/views/estate_property_tag_views.xml b/estate/views/estate_property_tag_views.xml index 8e65c5e03b7..12e9b17ca18 100644 --- a/estate/views/estate_property_tag_views.xml +++ b/estate/views/estate_property_tag_views.xml @@ -5,7 +5,7 @@ estate.property.tag.list estate.property.tag - + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index f0bb3e97c26..bff7d45f5cf 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -14,7 +14,7 @@ - + @@ -27,8 +27,8 @@
-
@@ -77,7 +77,7 @@
- + From 02359f3706c47ad96dab3c33e1dc250c654003ea Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 16:16:16 +0300 Subject: [PATCH 45/59] Enhance estate property views by adding conditional decorations for offer statuses and updating the living area field with a filter domain. Also, improve the action window definition by including a context for better search functionality in property management. --- estate/__manifest__.py | 2 +- estate/views/estate_property_offer_views.xml | 4 ++-- estate/views/estate_property_views.xml | 9 +++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index a130300baed..36e07c2dcef 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.39", # Version + "version": "18.0.1.0.40", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 0d888436faf..10b5e9c02b8 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -5,12 +5,12 @@ estate.property.offer.list estate.property.offer - + - + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index bff7d45f5cf..7e52591ced0 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -5,7 +5,7 @@ estate.property.list estate.property - + @@ -99,7 +99,7 @@ - + @@ -117,9 +117,10 @@ Estate Properties - estate.property + estate.property list,form - + {'search_default_available': True} + \ No newline at end of file From c0027895c9ea9e3d959b2159856f34090b73d266 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 16:19:16 +0300 Subject: [PATCH 46/59] Add property_type_id field to EstatePropertyOffer model, enhance EstatePropertyType model with offer_ids and offer_count, and update views to include property type in offers and a stat button for offer count. This improves data relationships and user interaction in property management. --- estate/__manifest__.py | 2 +- estate/models/estate_property_offer.py | 1 + estate/models/estate_property_type.py | 10 +++++++++- estate/views/estate_property_offer_views.xml | 10 ++++++++++ estate/views/estate_property_type_views.xml | 5 +++++ 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 36e07c2dcef..5ec984f7404 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.40", # Version + "version": "18.0.1.0.41", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index 34b5171002f..f27118ebbe1 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -24,6 +24,7 @@ class EstatePropertyOffer(models.Model): # Relationships partner_id = fields.Many2one('res.partner', string='Partner', required=True) property_id = fields.Many2one('estate.property', string='Property', required=True) + property_type_id = fields.Many2one('estate.property.type', related='property_id.property_type_id', string='Property Type', store=True) # Computed Methods @api.depends('create_date', 'validity') diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index eaa5321911f..dca9e90ef81 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -1,4 +1,4 @@ -from odoo import models, fields +from odoo import models, fields, api class EstatePropertyType(models.Model): _name = "estate.property.type" @@ -15,4 +15,12 @@ class EstatePropertyType(models.Model): # Relationships property_ids = fields.One2many('estate.property', 'property_type_id', string='Properties') + offer_ids = fields.One2many('estate.property.offer', 'property_type_id', string='Offers') + offer_count = fields.Integer(compute='_compute_offer_count', string='Offers Count') + + # Computed Methods + @api.depends('offer_ids') + def _compute_offer_count(self): + for record in self: + record.offer_count = len(record.offer_ids) \ No newline at end of file diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 10b5e9c02b8..13677c4f9c7 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -8,6 +8,7 @@ + @@ -37,4 +38,13 @@ + + + + Property Offers + estate.property.offer + list,form + [('property_type_id', '=', active_id)] + {'default_property_type_id': active_id} + diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml index 2442944dff5..3fdc7c8a159 100644 --- a/estate/views/estate_property_type_views.xml +++ b/estate/views/estate_property_type_views.xml @@ -19,6 +19,11 @@
+
+ +

From 603d8215643ef6402a5acf4073098759798339c4 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 16:30:29 +0300 Subject: [PATCH 47/59] Refactor estate property views by commenting out unused button elements and enhancing the tag_ids field with color options for improved user experience in property management. --- estate/__manifest__.py | 2 +- estate/views/estate_property_offer_views.xml | 4 ++-- estate/views/estate_property_type_views.xml | 4 ++-- estate/views/estate_property_views.xml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 5ec984f7404..2aeea10ff37 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.41", # Version + "version": "18.0.1.0.42", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 13677c4f9c7..9975af21083 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -39,12 +39,12 @@ - + diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml index 3fdc7c8a159..31678cc6010 100644 --- a/estate/views/estate_property_type_views.xml +++ b/estate/views/estate_property_type_views.xml @@ -19,11 +19,11 @@ -
+

diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 7e52591ced0..7ec467376e2 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -9,7 +9,7 @@ - + From 6a431929423f239b15d35984bd6983c1eb21eb3e Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 16:39:15 +0300 Subject: [PATCH 48/59] Reorganize estate property views by moving the action window definition for the stat button from the estate_property_offer_views.xml to the estate_property_type_views.xml, ensuring better structure and accessibility for property offers in the user interface. --- estate/__manifest__.py | 2 +- estate/views/estate_property_offer_views.xml | 8 -------- estate/views/estate_property_type_views.xml | 13 +++++++++++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 2aeea10ff37..a83d7cc8d83 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.42", # Version + "version": "18.0.1.0.43", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 9975af21083..590cda205b6 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -39,12 +39,4 @@ - diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml index 31678cc6010..1c97706ab4b 100644 --- a/estate/views/estate_property_type_views.xml +++ b/estate/views/estate_property_type_views.xml @@ -19,11 +19,11 @@ - +

@@ -62,4 +62,13 @@ + + + + Property Offers + estate.property.offer + list,form + [('property_type_id', '=', active_id)] + {'default_property_type_id': active_id} + From 61864b4587b2836e4c3134f28155fd4fbd95d05e Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 16:54:05 +0300 Subject: [PATCH 49/59] Refactor estate property views by reintroducing the action window definition for property offers in estate_property_type_views.xml, ensuring improved accessibility and functionality in the user interface. Remove the previous definition from estate_property_offer_views.xml for better organization. --- estate/__manifest__.py | 4 ++-- estate/views/estate_property_type_views.xml | 22 +++++++++++---------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index a83d7cc8d83..22b8d4dcfaa 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,14 +1,14 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.43", # Version + "version": "18.0.1.0.44", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ 'security/ir.model.access.csv', 'views/estate_property_views.xml', + 'views/estate_property_offer_views.xml', 'views/estate_property_type_views.xml', 'views/estate_property_tag_views.xml', - 'views/estate_property_offer_views.xml', 'views/estate_menus.xml', ], diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml index 1c97706ab4b..5553b5cbb41 100644 --- a/estate/views/estate_property_type_views.xml +++ b/estate/views/estate_property_type_views.xml @@ -12,6 +12,15 @@ + + + Property Offers + estate.property.offer + list,form + [('property_type_id', '=', active_id)] + {'default_property_type_id': active_id} + + estate.property.type.form @@ -20,7 +29,7 @@
-
@@ -54,6 +63,8 @@
+ + Property Types @@ -62,13 +73,4 @@ - - - - Property Offers - estate.property.offer - list,form - [('property_type_id', '=', active_id)] - {'default_property_type_id': active_id} - From 92003f6feaacb4d961f1fe42a4a6ef1476b68fd0 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 16:57:55 +0300 Subject: [PATCH 50/59] Comment out the button box in estate_property_type_views.xml to temporarily disable the action for viewing offers, improving the clarity of the form layout while maintaining the existing structure for future use. --- estate/__manifest__.py | 2 +- estate/views/estate_property_type_views.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 22b8d4dcfaa..fd4ba0962ce 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.44", # Version + "version": "18.0.1.0.45", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml index 5553b5cbb41..9c148ed3a95 100644 --- a/estate/views/estate_property_type_views.xml +++ b/estate/views/estate_property_type_views.xml @@ -28,11 +28,11 @@ -
+

From 2770cce698f18d4afe10523c78821cc291dfde72 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 17:11:24 +0300 Subject: [PATCH 51/59] Update version number to 18.0.1.0.46 in __manifest__.py, reintroduce the action button for viewing offers in estate_property_type_views.xml, and add new lines in estate_property_offer.py for code consistency. This enhances the user interface and maintains code readability. --- estate/__manifest__.py | 2 +- estate/models/estate_property_offer.py | 2 ++ estate/views/estate_property_type_views.xml | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index fd4ba0962ce..c8045e4f1cd 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.45", # Version + "version": "18.0.1.0.46", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index f27118ebbe1..f80efd82b22 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -66,3 +66,5 @@ def action_refuse(self): for record in self: record.status = 'refused' return True + + \ No newline at end of file diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml index 9c148ed3a95..95044f7b09c 100644 --- a/estate/views/estate_property_type_views.xml +++ b/estate/views/estate_property_type_views.xml @@ -28,11 +28,11 @@ - +

From 10cccdad25df01537a6b8186da567b83793d4547 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 17:18:22 +0300 Subject: [PATCH 52/59] Add CRUD method overrides in EstatePropertyOffer and EstateProperty models to enforce business rules on offer creation and property deletion. This ensures offers are higher than existing ones and restricts deletion of properties in certain states, enhancing data integrity and user experience. --- estate/__manifest__.py | 2 +- estate/models/__init__.py | 3 ++- estate/models/estate_property.py | 9 ++++++++- estate/models/estate_property_offer.py | 21 +++++++++++++++++++++ estate/models/res_users.py | 6 ++++++ 5 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 estate/models/res_users.py diff --git a/estate/__manifest__.py b/estate/__manifest__.py index c8045e4f1cd..ddff0a0f6a9 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.46", # Version + "version": "18.0.1.0.47", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 09b2099fe84..a9459ed5906 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,4 +1,5 @@ from . import estate_property from . import estate_property_type from . import estate_property_tag -from . import estate_property_offer \ No newline at end of file +from . import estate_property_offer +from . import res_users \ No newline at end of file diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 034fdf9dde8..435a8e0a92b 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -113,4 +113,11 @@ def _check_selling_price(self): if float_compare(record.selling_price, min_selling_price, precision_digits=2) < 0: raise ValidationError( f"Selling price ({record.selling_price:.2f}) cannot be lower than 90% of expected price ({min_selling_price:.2f})" - ) \ No newline at end of file + ) + + # CRUD Method Overrides + @api.ondelete(at_uninstall=False) + def _check_property_deletion(self): + for record in self: + if record.state not in ['new', 'cancelled']: + raise UserError(f"Cannot delete property '{record.name}' because it is in '{record.state}' state. Only 'New' or 'Cancelled' properties can be deleted.") \ No newline at end of file diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index f80efd82b22..1ede4152a53 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -67,4 +67,25 @@ def action_refuse(self): record.status = 'refused' return True + # CRUD Method Overrides + @api.model + def create(self, vals): + # Get the property record + property_id = vals.get('property_id') + if property_id: + property_record = self.env['estate.property'].browse(property_id) + + # Check if offer price is higher than existing offers + existing_offers = property_record.offer_ids + if existing_offers: + max_existing_price = max(existing_offers.mapped('price')) + if vals.get('price', 0) <= max_existing_price: + raise UserError(f"Offer price must be higher than existing offers. Current highest offer: {max_existing_price}") + + # Set property state to 'Offer Received' + property_record.state = 'offer_received' + + # Always call super() to maintain the flow + return super().create(vals) + \ No newline at end of file diff --git a/estate/models/res_users.py b/estate/models/res_users.py new file mode 100644 index 00000000000..2c7fbf53afd --- /dev/null +++ b/estate/models/res_users.py @@ -0,0 +1,6 @@ +from odoo import fields, models + +class ResUsers(models.Model): + _inherit = "res.users" + + property_ids = fields.One2many('estate.property', 'salesperson_id', string='Properties', domain=[('state', 'in', ['new', 'offer_received'])]) From f594dbd66064514e5b7ca3020424a6dd6a53d471 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 17:24:59 +0300 Subject: [PATCH 53/59] Update version number to 18.0.1.0.48 in __manifest__.py and add res_users_views.xml to data list, enhancing module functionality and ensuring proper integration of user views. --- estate/__manifest__.py | 3 ++- estate/views/res_users_views.xml | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 estate/views/res_users_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index ddff0a0f6a9..fc6d2a9fa1e 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.47", # Version + "version": "18.0.1.0.48", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ @@ -9,6 +9,7 @@ 'views/estate_property_offer_views.xml', 'views/estate_property_type_views.xml', 'views/estate_property_tag_views.xml', + 'views/res_users_views.xml', 'views/estate_menus.xml', ], diff --git a/estate/views/res_users_views.xml b/estate/views/res_users_views.xml new file mode 100644 index 00000000000..99a7c54b6de --- /dev/null +++ b/estate/views/res_users_views.xml @@ -0,0 +1,24 @@ + + + + + res.users.form.inherit.estate + res.users + + + + + + + + + + + + + + + + + + From b45e63e34f6886cf02117c22f8054e3ac6eff747 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 17:32:10 +0300 Subject: [PATCH 54/59] Refactor create method in EstatePropertyOffer to support batch creation of offers, ensuring that each offer price is validated against existing offers. This enhances data integrity and maintains the flow of property state updates. --- estate/__manifest__.py | 2 +- estate/models/estate_property_offer.py | 40 +++++++++++++++----------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index fc6d2a9fa1e..678edd0c243 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate", # The name that will appear in the App list - "version": "18.0.1.0.48", # Version + "version": "18.0.1.0.49", # Version "application": True, # This line says the module is an App, and not a module "depends": ["base"], # dependencies 'data': [ diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index 1ede4152a53..1325b5da28e 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -68,24 +68,30 @@ def action_refuse(self): return True # CRUD Method Overrides - @api.model - def create(self, vals): - # Get the property record - property_id = vals.get('property_id') - if property_id: - property_record = self.env['estate.property'].browse(property_id) - - # Check if offer price is higher than existing offers - existing_offers = property_record.offer_ids - if existing_offers: - max_existing_price = max(existing_offers.mapped('price')) - if vals.get('price', 0) <= max_existing_price: - raise UserError(f"Offer price must be higher than existing offers. Current highest offer: {max_existing_price}") - - # Set property state to 'Offer Received' - property_record.state = 'offer_received' + @api.model_create_multi + def create(self, vals_list): + # Handle both single record and batch creation + if not isinstance(vals_list, list): + vals_list = [vals_list] + + # Process each record in the batch + for vals in vals_list: + # Get the property record + property_id = vals.get('property_id') + if property_id: + property_record = self.env['estate.property'].browse(property_id) + + # Check if offer price is higher than existing offers + existing_offers = property_record.offer_ids + if existing_offers: + max_existing_price = max(existing_offers.mapped('price')) + if vals.get('price', 0) <= max_existing_price: + raise UserError(f"Offer price must be higher than existing offers. Current highest offer: {max_existing_price}") + + # Set property state to 'Offer Received' + property_record.state = 'offer_received' # Always call super() to maintain the flow - return super().create(vals) + return super().create(vals_list) \ No newline at end of file From 52b9c8b6c6b7054134dbfaab4027a9b3b30cb0c1 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 17:35:42 +0300 Subject: [PATCH 55/59] Enhance EstatePropertyOffer model by adding validation for batch creation of offers, ensuring each offer price is compared against existing offers. This improves data integrity and user experience in property management. --- estate_account/__init__.py | 1 + estate_account/__manifest__.py | 11 +++++++++++ estate_account/models/__init__.py | 1 + 3 files changed, 13 insertions(+) create mode 100644 estate_account/__init__.py create mode 100644 estate_account/__manifest__.py create mode 100644 estate_account/models/__init__.py diff --git a/estate_account/__init__.py b/estate_account/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/estate_account/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/estate_account/__manifest__.py b/estate_account/__manifest__.py new file mode 100644 index 00000000000..99612ea5074 --- /dev/null +++ b/estate_account/__manifest__.py @@ -0,0 +1,11 @@ +{ + "name": "Estate Account", + "version": "18.0.1.0.1", + "application": False, # This is a module, not an app + "depends": ["estate", "account"], # Depends on both estate and account modules + 'data': [ + # Empty for now - will add data files as needed + ], + "installable": True, + 'license': 'LGPL-3', +} diff --git a/estate_account/models/__init__.py b/estate_account/models/__init__.py new file mode 100644 index 00000000000..f4ff338f825 --- /dev/null +++ b/estate_account/models/__init__.py @@ -0,0 +1 @@ +# Empty for now - will add model imports as needed From 9cf95e1402eab1811f7039bd11de5dfe9a0fc9a3 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 17:42:03 +0300 Subject: [PATCH 56/59] Update __manifest__.py to include security access file and modify __init__.py to import estate_account model, enhancing module structure and security compliance. --- estate_account/README.md | 17 +++++++++++++++++ estate_account/__manifest__.py | 4 ++-- estate_account/models/__init__.py | 2 +- estate_account/models/estate_account.py | 9 +++++++++ estate_account/security/ir.model.access.csv | 2 ++ 5 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 estate_account/README.md create mode 100644 estate_account/models/estate_account.py create mode 100644 estate_account/security/ir.model.access.csv diff --git a/estate_account/README.md b/estate_account/README.md new file mode 100644 index 00000000000..8921befd37e --- /dev/null +++ b/estate_account/README.md @@ -0,0 +1,17 @@ +# Estate Account Module + +## Description +This module serves as a bridge between the Estate and Account modules, enabling integration between real estate management and accounting functionality. + +## Dependencies +- **estate**: Real Estate Property Management +- **account**: Odoo Accounting Module + +## Status +Currently an empty shell module, ready for future development of estate-accounting integration features. + +## Future Features +- Invoice generation for property sales +- Commission tracking for sales agents +- Payment management integration +- Real estate financial reporting diff --git a/estate_account/__manifest__.py b/estate_account/__manifest__.py index 99612ea5074..716215de7e8 100644 --- a/estate_account/__manifest__.py +++ b/estate_account/__manifest__.py @@ -1,10 +1,10 @@ { "name": "Estate Account", - "version": "18.0.1.0.1", + "version": "18.0.1.0.2", "application": False, # This is a module, not an app "depends": ["estate", "account"], # Depends on both estate and account modules 'data': [ - # Empty for now - will add data files as needed + 'security/ir.model.access.csv', ], "installable": True, 'license': 'LGPL-3', diff --git a/estate_account/models/__init__.py b/estate_account/models/__init__.py index f4ff338f825..02b688798a3 100644 --- a/estate_account/models/__init__.py +++ b/estate_account/models/__init__.py @@ -1 +1 @@ -# Empty for now - will add model imports as needed +from . import estate_account diff --git a/estate_account/models/estate_account.py b/estate_account/models/estate_account.py new file mode 100644 index 00000000000..fd958125878 --- /dev/null +++ b/estate_account/models/estate_account.py @@ -0,0 +1,9 @@ +from odoo import models, fields + +class EstateAccount(models.Model): + _name = "estate.account" + _description = "Estate Account Integration" + + # Basic Information + name = fields.Char(required=True) + description = fields.Text() diff --git a/estate_account/security/ir.model.access.csv b/estate_account/security/ir.model.access.csv new file mode 100644 index 00000000000..0cb3e16f01f --- /dev/null +++ b/estate_account/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_account_user,access_estate_account_user,model_estate_account,base.group_user,1,1,1,1 From 948d034f3ce2cc6a33d927c628f24a5f4b6bd3da Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 17:51:33 +0300 Subject: [PATCH 57/59] Import estate_property model in __init__.py to enhance module structure and support additional functionalities related to property management. --- estate_account/__manifest__.py | 2 +- estate_account/models/__init__.py | 1 + estate_account/models/estate_property.py | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 estate_account/models/estate_property.py diff --git a/estate_account/__manifest__.py b/estate_account/__manifest__.py index 716215de7e8..59c277cfb4b 100644 --- a/estate_account/__manifest__.py +++ b/estate_account/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate Account", - "version": "18.0.1.0.2", + "version": "18.0.1.0.3", "application": False, # This is a module, not an app "depends": ["estate", "account"], # Depends on both estate and account modules 'data': [ diff --git a/estate_account/models/__init__.py b/estate_account/models/__init__.py index 02b688798a3..89fe4948834 100644 --- a/estate_account/models/__init__.py +++ b/estate_account/models/__init__.py @@ -1 +1,2 @@ from . import estate_account +from . import estate_property diff --git a/estate_account/models/estate_property.py b/estate_account/models/estate_property.py new file mode 100644 index 00000000000..d3043383c43 --- /dev/null +++ b/estate_account/models/estate_property.py @@ -0,0 +1,15 @@ +from odoo import models +import logging + +_logger = logging.getLogger(__name__) + +class EstateProperty(models.Model): + _inherit = "estate.property" + + def action_sold(self): + # Add debugging to verify the override is working + _logger.info("Estate Account: action_sold method called for property: %s", self.name) + print(f"Estate Account: Selling property '{self.name}' - Invoice creation will be added here") + + # Call the parent method to maintain original functionality + return super().action_sold() From f093f9cf0865864c759257fd72fb05a22c522a3d Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 17:55:12 +0300 Subject: [PATCH 58/59] Implement invoice creation in action_sold method of EstateProperty model, including commission and administrative fee calculations. Add debugging logs for better traceability during property sales. --- estate_account/__manifest__.py | 2 +- estate_account/models/estate_property.py | 31 ++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/estate_account/__manifest__.py b/estate_account/__manifest__.py index 59c277cfb4b..e95b78fb671 100644 --- a/estate_account/__manifest__.py +++ b/estate_account/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate Account", - "version": "18.0.1.0.3", + "version": "18.0.1.0.4", "application": False, # This is a module, not an app "depends": ["estate", "account"], # Depends on both estate and account modules 'data': [ diff --git a/estate_account/models/estate_property.py b/estate_account/models/estate_property.py index d3043383c43..6b3284548be 100644 --- a/estate_account/models/estate_property.py +++ b/estate_account/models/estate_property.py @@ -1,4 +1,4 @@ -from odoo import models +from odoo import models, Command import logging _logger = logging.getLogger(__name__) @@ -9,7 +9,34 @@ class EstateProperty(models.Model): def action_sold(self): # Add debugging to verify the override is working _logger.info("Estate Account: action_sold method called for property: %s", self.name) - print(f"Estate Account: Selling property '{self.name}' - Invoice creation will be added here") + print(f"Estate Account: Selling property '{self.name}' - Creating invoice") + + # Create invoice for the property sale + for record in self: + # Calculate commission (6% of selling price) and administrative fee + commission_amount = record.selling_price * 0.06 + admin_fee = 100.00 + + # Create the invoice + invoice = self.env['account.move'].create({ + 'partner_id': record.buyer_id.id, + 'move_type': 'out_invoice', # Customer Invoice + 'invoice_line_ids': [ + Command.create({ + 'name': f'Commission for property: {record.name}', + 'quantity': 1, + 'price_unit': commission_amount, + }), + Command.create({ + 'name': 'Administrative fees', + 'quantity': 1, + 'price_unit': admin_fee, + }), + ], + }) + + _logger.info("Estate Account: Created invoice %s for property %s", invoice.name, record.name) + print(f"Estate Account: Created invoice {invoice.name} for property '{record.name}'") # Call the parent method to maintain original functionality return super().action_sold() From 76a685ca70eafbaa24dde8a9ad2be678e543b2d3 Mon Sep 17 00:00:00 2001 From: Kenny Date: Tue, 16 Sep 2025 18:00:59 +0300 Subject: [PATCH 59/59] Add Kanban view for estate properties and update action window view mode to include Kanban. Increment version number to 18.0.1.0.5 in __manifest__.py for module enhancement. --- estate/views/estate_property_views.xml | 41 +++++++++++++++++++++++++- estate_account/__manifest__.py | 2 +- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 7ec467376e2..5b858108d2f 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -114,11 +114,50 @@
+ + + estate.property.kanban + estate.property + + + + + + + + + + +
+
+
+ +
+
+
Expected Price:
+
+ Best Price: +
+
+ Selling Price: +
+
+ +
+
+
+
+
+
+
+
+
+ Estate Properties estate.property - list,form + kanban,list,form {'search_default_available': True} diff --git a/estate_account/__manifest__.py b/estate_account/__manifest__.py index e95b78fb671..225f6e5d616 100644 --- a/estate_account/__manifest__.py +++ b/estate_account/__manifest__.py @@ -1,6 +1,6 @@ { "name": "Estate Account", - "version": "18.0.1.0.4", + "version": "18.0.1.0.5", "application": False, # This is a module, not an app "depends": ["estate", "account"], # Depends on both estate and account modules 'data': [