From c2f4e01d47ec470a6d72acaa06388fcfaeec65bf Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Mon, 20 Oct 2025 13:47:05 +0200 Subject: [PATCH 01/26] [ADD] estate: create the app. --- estate /__init__.py | 0 estate /__manifest__.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 estate /__init__.py create mode 100644 estate /__manifest__.py diff --git a/estate /__init__.py b/estate /__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/estate /__manifest__.py b/estate /__manifest__.py new file mode 100644 index 00000000000..e69de29bb2d From ae40a80c0e1c213bdc6607a9ea1b2d8462d03d52 Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Mon, 20 Oct 2025 15:04:11 +0200 Subject: [PATCH 02/26] [IMP] estate: fill the manifest --- estate/__init__.py | 1 + estate/__manifest__.py | 8 ++++++++ estate/models/__init__.py | 1 + estate/models/estate_property.py | 8 ++++++++ 4 files changed, 18 insertions(+) create mode 100644 estate/__init__.py create mode 100644 estate/__manifest__.py create mode 100644 estate/models/__init__.py create mode 100644 estate/models/estate_property.py diff --git a/estate/__init__.py b/estate/__init__.py new file mode 100644 index 00000000000..9a7e03eded3 --- /dev/null +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/estate/__manifest__.py b/estate/__manifest__.py new file mode 100644 index 00000000000..c21167d103b --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,8 @@ +{ + 'name' : 'Odoo Tutorial Real Estate', + 'category': 'Real Estate', + 'version': '19.0.1.0', + 'summary' : 'Real Estate Management Tutorial', + 'application': True, + +} \ No newline at end of file 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..ce53d16f86e --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,8 @@ +from odoo import models, fields + +class EstateProperty(models.Model): + _name = "estate.property" + _description = "Real Estate Property" + + name = fields.char(string="Title", required=true) expected_price = fields.Float(required=True) bedrooms = field.Integer(default=2) + From 2ebfca3ad7257fa27841a7f551b4849cea3fe26b Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Mon, 20 Oct 2025 15:24:21 +0200 Subject: [PATCH 03/26] [IMP] estate: estate_property.py --- estate/models/estate_property.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index ce53d16f86e..bd43c21cb39 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -4,5 +4,7 @@ class EstateProperty(models.Model): _name = "estate.property" _description = "Real Estate Property" - name = fields.char(string="Title", required=true) expected_price = fields.Float(required=True) bedrooms = field.Integer(default=2) + name = fields.Char(string="Title", required=True) + expected_price = fields.Float(required=True) + bedrooms = field.Integer(default=2) From c451738feb08e42a02be687ad2c7fc8c05a43078 Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Mon, 20 Oct 2025 16:39:47 +0200 Subject: [PATCH 04/26] [IMP] estate: fix --- estate/__init__.py | 2 +- estate/__manifest__.py | 4 ++-- estate/models/estate_property.py | 20 +++++++++++++++++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/estate/__init__.py b/estate/__init__.py index 9a7e03eded3..0650744f6bc 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -1 +1 @@ -from . import models \ No newline at end of file +from . import models diff --git a/estate/__manifest__.py b/estate/__manifest__.py index c21167d103b..5dbc33d30d8 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,8 +1,8 @@ { 'name' : 'Odoo Tutorial Real Estate', - 'category': 'Real Estate', + 'category':'Real Estate', 'version': '19.0.1.0', 'summary' : 'Real Estate Management Tutorial', 'application': True, -} \ No newline at end of file +} diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index bd43c21cb39..eae8a1327ef 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,10 +1,24 @@ from odoo import models, fields + class EstateProperty(models.Model): _name = "estate.property" _description = "Real Estate Property" name = fields.Char(string="Title", required=True) - expected_price = fields.Float(required=True) - bedrooms = field.Integer(default=2) - + description = fields.Text() + postcode = fields.Char() + date_availability = fields.Date() + expected_price = fields.Float() + selling_price = fields.Float() + bedrooms = fields.Integer() + living_area = fields.Integer() + facades = fields.Integer() + garage = fields.Boolean() + garden = fields.Boolean() + garden_area = fields.Integer() + garden_orientation = fields.Selection( + string='Selection', + selection=[('north', 'North'), ('south', 'South'), + ('east', 'East'), ('west', 'West')]) + From e7f8afa51b88066b287f1372cb0c1344f776c9eb Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Mon, 20 Oct 2025 17:10:37 +0200 Subject: [PATCH 05/26] [IMP] estate: fix2 --- estate/__manifest__.py | 10 ++++++---- estate/models/estate_property.py | 3 +-- estate/security/ir.model.access.csv | 2 ++ 3 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 5dbc33d30d8..f0fa1abf7c9 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,8 +1,10 @@ { - 'name' : 'Odoo Tutorial Real Estate', - 'category':'Real Estate', + 'name': 'Odoo Tutorial Real Estate', + 'category': 'Real Estate', 'version': '19.0.1.0', - 'summary' : 'Real Estate Management Tutorial', + 'summary': 'Real Estate Management Tutorial', 'application': True, - + 'data': [ + 'security/ir.model.access.csv' + ] } diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index eae8a1327ef..d4d327c9654 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 class EstateProperty(models.Model): @@ -21,4 +21,3 @@ class EstateProperty(models.Model): string='Selection', selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')]) - diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..32389642d4f --- /dev/null +++ b/estate/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 From 500f0fcb26fc62a0ff9641ab34bbce73e68437ea Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Mon, 20 Oct 2025 17:18:38 +0200 Subject: [PATCH 06/26] [IMP] estate: manifest --- estate/__manifest__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index f0fa1abf7c9..242a0d518d2 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -2,6 +2,8 @@ 'name': 'Odoo Tutorial Real Estate', 'category': 'Real Estate', 'version': '19.0.1.0', + 'author': 'Hazei', + 'license': 'LGPL-3', 'summary': 'Real Estate Management Tutorial', 'application': True, 'data': [ From c85b9832db05c684cbf8181c9ee6a28463d708e9 Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Tue, 21 Oct 2025 15:42:29 +0200 Subject: [PATCH 07/26] [IMP] estate: CH6 basic view --- estate/__manifest__.py | 9 ++- estate/models/estate_property.py | 22 +++++--- estate/views/estate_property_views.xml | 77 ++++++++++++++++++++++++++ estate/views/menu_views.xml | 10 ++++ 4 files changed, 108 insertions(+), 10 deletions(-) create mode 100644 estate/views/estate_property_views.xml create mode 100644 estate/views/menu_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 242a0d518d2..c04ec96577e 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -6,7 +6,12 @@ 'license': 'LGPL-3', 'summary': 'Real Estate Management Tutorial', 'application': True, + 'depends': [ + 'base', + ], 'data': [ - 'security/ir.model.access.csv' - ] + 'security/ir.model.access.csv', + 'views/estate_property_views.xml', + 'views/menu_views.xml', + ], } diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index d4d327c9654..3e13e310ff7 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,5 +1,6 @@ from odoo import models, fields - +from datetime import date +from dateutil.relativedelta import relativedelta class EstateProperty(models.Model): _name = "estate.property" @@ -8,16 +9,21 @@ class EstateProperty(models.Model): name = fields.Char(string="Title", required=True) description = fields.Text() postcode = fields.Char() - date_availability = fields.Date() - expected_price = fields.Float() - selling_price = fields.Float() - bedrooms = fields.Integer() - living_area = fields.Integer() + date_availability = fields.Date(copy=False, readonly=True, default=date.today() + relativedelta(months=3)) + expected_price = fields.Float(required=True) + selling_price = fields.Float(readonly=True, copy=False) + bedrooms = fields.Integer(default=2) + living_area = fields.Integer(string='Living Area (m2)') facades = fields.Integer() garage = fields.Boolean() garden = fields.Boolean() - garden_area = fields.Integer() + garden_area = fields.Integer(string='Garden Area (m2)') garden_orientation = fields.Selection( - string='Selection', + string='garden_orientation', selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')]) + active = fields.Boolean(default=False) + status = fields.Selection(copy=False, readonly=True, default='new', + string='status', + selection=[('new', 'New'), ('offer_received', 'Offer Received'), ('offer_accepted', 'Offer Accepted'), ('sold', 'Sold'), ('cancelled', 'Cancelled')], + ) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml new file mode 100644 index 00000000000..ed2d7ff80b5 --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,77 @@ + + + + Property + estate.property + list,form + + + estate.property.list + estate.property + + + + + + + + + + + + estate.property.form + estate.property + +
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + estate.property.views.search + estate.property + + + + + + + + + + + + + +
diff --git a/estate/views/menu_views.xml b/estate/views/menu_views.xml new file mode 100644 index 00000000000..40b9c09ec9c --- /dev/null +++ b/estate/views/menu_views.xml @@ -0,0 +1,10 @@ + + + + + + + + + + From 85903f145cccd8a8aa435bd5207d5c047ee9ba3b Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Tue, 21 Oct 2025 15:47:15 +0200 Subject: [PATCH 08/26] [IMP] estate: CH6 basic views --- estate/models/estate_property.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 3e13e310ff7..ccbaf3628e9 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -2,6 +2,7 @@ from datetime import date from dateutil.relativedelta import relativedelta + class EstateProperty(models.Model): _name = "estate.property" _description = "Real Estate Property" @@ -27,3 +28,4 @@ class EstateProperty(models.Model): string='status', selection=[('new', 'New'), ('offer_received', 'Offer Received'), ('offer_accepted', 'Offer Accepted'), ('sold', 'Sold'), ('cancelled', 'Cancelled')], ) + \ No newline at end of file From 26e9cb39c40fe88f8405ca45901b3127ed8ba621 Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Tue, 21 Oct 2025 16:03:03 +0200 Subject: [PATCH 09/26] [IMP] estate: CH6 basic views correction --- estate/models/estate_property.py | 1 - estate/views/estate_property_views.xml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index ccbaf3628e9..580bd7689a5 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -28,4 +28,3 @@ class EstateProperty(models.Model): string='status', selection=[('new', 'New'), ('offer_received', 'Offer Received'), ('offer_accepted', 'Offer Accepted'), ('sold', 'Sold'), ('cancelled', 'Cancelled')], ) - \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index ed2d7ff80b5..2c10cb992c3 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -73,5 +73,5 @@ - + From dd4f93ce226f1cf2685b87ee2350100ee235d053 Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Wed, 22 Oct 2025 14:07:06 +0200 Subject: [PATCH 10/26] [IMP] estate: Ch7 --- estate/__manifest__.py | 5 +++- estate/models/__init__.py | 3 +++ estate/models/estate_property.py | 11 ++++++-- estate/models/estate_property_offer.py | 16 ++++++++++++ estate/models/estate_property_tags.py | 8 ++++++ estate/models/estate_property_type.py | 9 +++++++ estate/security/ir.model.access.csv | 3 +++ estate/views/estate_property_tags_view.xml | 29 ++++++++++++++++++++++ estate/views/estate_property_type.xml | 8 ++++++ estate/views/estate_property_views.xml | 23 +++++++++++++++++ estate/views/menu_views.xml | 14 ++++++----- 11 files changed, 120 insertions(+), 9 deletions(-) create mode 100644 estate/models/estate_property_offer.py create mode 100644 estate/models/estate_property_tags.py create mode 100644 estate/models/estate_property_type.py create mode 100644 estate/views/estate_property_tags_view.xml create mode 100644 estate/views/estate_property_type.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index c04ec96577e..9325f3c5778 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -5,13 +5,16 @@ 'author': 'Hazei', 'license': 'LGPL-3', 'summary': 'Real Estate Management Tutorial', - 'application': True, 'depends': [ 'base', ], 'data': [ 'security/ir.model.access.csv', 'views/estate_property_views.xml', + 'views/estate_property_type.xml', + 'views/estate_property_tags_view.xml', 'views/menu_views.xml', ], + 'installable': True, + 'application': True, } diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 5e1963c9d2f..f6ceb1825e3 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1,4 @@ from . import estate_property +from . import estate_property_type +from . import estate_property_tags +from . import estate_property_offer diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 580bd7689a5..32eb1c4a166 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -8,9 +8,11 @@ class EstateProperty(models.Model): _description = "Real Estate Property" name = fields.Char(string="Title", required=True) + Property_Type = fields.Text() description = fields.Text() postcode = fields.Char() - date_availability = fields.Date(copy=False, readonly=True, default=date.today() + relativedelta(months=3)) + date_availability = fields.Date(copy=False, readonly=True, default=lambda self: date.today() + relativedelta(months=3)) + #date_availability = fields.Date(copy=False, readonly=True, default=date.today() + relativedelta(months=3)) expected_price = fields.Float(required=True) selling_price = fields.Float(readonly=True, copy=False) bedrooms = fields.Integer(default=2) @@ -23,8 +25,13 @@ class EstateProperty(models.Model): string='garden_orientation', selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')]) - active = fields.Boolean(default=False) + active = fields.Boolean(default=True) status = fields.Selection(copy=False, readonly=True, default='new', string='status', selection=[('new', 'New'), ('offer_received', 'Offer Received'), ('offer_accepted', 'Offer Accepted'), ('sold', 'Sold'), ('cancelled', 'Cancelled')], ) + Property_Type_id = fields.Many2one('estate.property.type',string='Type'), + Buyer_id = fields.Many2one('res.partner', string='Buyer', copy=False) + Salesman_id= fields.Many2one('res.users', string='Salesman', default=lambda self:self.env.user) + tags_ids = fields.Many2many('estate.property.tags', string='Tags') + offer_ids = fields.One2many("estate.property.offer", "property_id", string="offer") diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py new file mode 100644 index 00000000000..7eb2a8e197b --- /dev/null +++ b/estate/models/estate_property_offer.py @@ -0,0 +1,16 @@ +from odoo import models, fields + + +class EstatePropertyOffer(models.Model): + _name = 'estate.property.offer' + _description = 'Estate Property Offer' + + price = fields.Float(sting='price', required=True) + status = fields.Selection( selection=[('accepted', 'Accepted'), + ('refused', 'Refused')], + string="Status", + copy=False, + default='accepted', + ) + partner_id = fields.Many2one('res.partner', string='Partner', required=True) + property_id = fields.Many2one('estate.property', required=True) diff --git a/estate/models/estate_property_tags.py b/estate/models/estate_property_tags.py new file mode 100644 index 00000000000..728d3bc34fc --- /dev/null +++ b/estate/models/estate_property_tags.py @@ -0,0 +1,8 @@ +from odoo import models, fields + + +class PropertyTypeTags(models.Model): + _name = 'estate.property.tags' + _description = 'Estate Property Tags' + + name = fields.Char(sting='tags', required=True) diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py new file mode 100644 index 00000000000..99c22cb2b3a --- /dev/null +++ b/estate/models/estate_property_type.py @@ -0,0 +1,9 @@ +from odoo import models, fields + + +class PropertyType(models.Model): + _name = 'estate.property.type' + _description = 'Estate Property Type' + + 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 32389642d4f..7e28e608af5 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,2 +1,5 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 +access_estate_property_type,access_estate_property_type,model_estate_property_type,base.group_user,1,1,1,1 +access_estate_property_tags,access_estate_property_tags,model_estate_property_tags,base.group_user,1,1,1,1 +access_estate_property_offer,access_estate_property_offer,model_estate_property_offer,base.group_user,1,1,1,1 diff --git a/estate/views/estate_property_tags_view.xml b/estate/views/estate_property_tags_view.xml new file mode 100644 index 00000000000..85b33319a44 --- /dev/null +++ b/estate/views/estate_property_tags_view.xml @@ -0,0 +1,29 @@ + + + Property Tags + estate.property.tags + list,form + + + \ No newline at end of file diff --git a/estate/views/estate_property_type.xml b/estate/views/estate_property_type.xml new file mode 100644 index 00000000000..74ac81d055d --- /dev/null +++ b/estate/views/estate_property_type.xml @@ -0,0 +1,8 @@ + + + + Property Type + estate.property.type + list,form + + \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 2c10cb992c3..bd0c157a06b 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -32,6 +32,7 @@ + @@ -51,8 +52,30 @@ + + + + + + + + + + + + + + + +
+ + + + + +
diff --git a/estate/views/menu_views.xml b/estate/views/menu_views.xml index 40b9c09ec9c..d16295ac5f1 100644 --- a/estate/views/menu_views.xml +++ b/estate/views/menu_views.xml @@ -1,10 +1,12 @@ - - + - - + + + + + + - - + \ No newline at end of file From dca37b2c20aad16f87274e738d25a67b23c8ca09 Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Wed, 22 Oct 2025 14:24:00 +0200 Subject: [PATCH 11/26] [IMP] estate: Ch7 fix --- estate/models/estate_property.py | 5 ++--- estate/models/estate_property_offer.py | 6 +++--- estate/models/estate_property_tags.py | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 32eb1c4a166..0196b0f19bb 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -12,7 +12,6 @@ class EstateProperty(models.Model): description = fields.Text() postcode = fields.Char() date_availability = fields.Date(copy=False, readonly=True, default=lambda self: date.today() + relativedelta(months=3)) - #date_availability = fields.Date(copy=False, readonly=True, default=date.today() + relativedelta(months=3)) expected_price = fields.Float(required=True) selling_price = fields.Float(readonly=True, copy=False) bedrooms = fields.Integer(default=2) @@ -30,8 +29,8 @@ class EstateProperty(models.Model): string='status', selection=[('new', 'New'), ('offer_received', 'Offer Received'), ('offer_accepted', 'Offer Accepted'), ('sold', 'Sold'), ('cancelled', 'Cancelled')], ) - Property_Type_id = fields.Many2one('estate.property.type',string='Type'), + Property_Type_id = fields.Many2one('estate.property.type', string='Type') Buyer_id = fields.Many2one('res.partner', string='Buyer', copy=False) - Salesman_id= fields.Many2one('res.users', string='Salesman', default=lambda self:self.env.user) + Salesman_id = fields.Many2one('res.users', string='Salesman', default=lambda self:self.env.user) tags_ids = fields.Many2many('estate.property.tags', string='Tags') offer_ids = fields.One2many("estate.property.offer", "property_id", string="offer") diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index 7eb2a8e197b..840c5d3e2c5 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -4,9 +4,9 @@ class EstatePropertyOffer(models.Model): _name = 'estate.property.offer' _description = 'Estate Property Offer' - - price = fields.Float(sting='price', required=True) - status = fields.Selection( selection=[('accepted', 'Accepted'), + + price = fields.Float(string='price', required=True) + status = fields.Selection(selection=[('accepted', 'Accepted'), ('refused', 'Refused')], string="Status", copy=False, diff --git a/estate/models/estate_property_tags.py b/estate/models/estate_property_tags.py index 728d3bc34fc..d27587f1a1d 100644 --- a/estate/models/estate_property_tags.py +++ b/estate/models/estate_property_tags.py @@ -5,4 +5,4 @@ class PropertyTypeTags(models.Model): _name = 'estate.property.tags' _description = 'Estate Property Tags' - name = fields.Char(sting='tags', required=True) + name = fields.Char(string='tags', required=True) From 5bee9d67e08aa7db14b518ba4fc05eb33970d137 Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Wed, 22 Oct 2025 14:30:32 +0200 Subject: [PATCH 12/26] [IMP] estate: Ch7 fix1 --- estate/models/estate_property.py | 2 +- estate/models/estate_property_tags.py | 2 +- estate/models/estate_property_type.py | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 0196b0f19bb..059523b8c35 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -31,6 +31,6 @@ class EstateProperty(models.Model): ) Property_Type_id = fields.Many2one('estate.property.type', string='Type') Buyer_id = fields.Many2one('res.partner', string='Buyer', copy=False) - Salesman_id = fields.Many2one('res.users', string='Salesman', default=lambda self:self.env.user) + Salesman_id = fields.Many2one('res.users', string='Salesman', default=lambda self: self.env.user) tags_ids = fields.Many2many('estate.property.tags', string='Tags') offer_ids = fields.One2many("estate.property.offer", "property_id", string="offer") diff --git a/estate/models/estate_property_tags.py b/estate/models/estate_property_tags.py index d27587f1a1d..a0fdca7fde8 100644 --- a/estate/models/estate_property_tags.py +++ b/estate/models/estate_property_tags.py @@ -4,5 +4,5 @@ class PropertyTypeTags(models.Model): _name = 'estate.property.tags' _description = 'Estate Property Tags' - + name = fields.Char(string='tags', required=True) diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index 99c22cb2b3a..c2a30447fc7 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -4,6 +4,5 @@ class PropertyType(models.Model): _name = 'estate.property.type' _description = 'Estate Property Type' - + name = fields.Char(required=True) - \ No newline at end of file From fbe810731960f46926892ebb102dc72b12e65345 Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Wed, 22 Oct 2025 16:03:46 +0200 Subject: [PATCH 13/26] [IMP] estate: Ch8 --- estate/models/estate_property.py | 29 ++++++++++++++++++++++++-- estate/models/estate_property_offer.py | 16 +++++++++++++- estate/views/estate_property_views.xml | 13 ++++++++++++ 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 059523b8c35..068f2f13486 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 from datetime import date from dateutil.relativedelta import relativedelta @@ -21,7 +21,7 @@ class EstateProperty(models.Model): garden = fields.Boolean() garden_area = fields.Integer(string='Garden Area (m2)') garden_orientation = fields.Selection( - string='garden_orientation', + string='Garden Orientation', selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')]) active = fields.Boolean(default=True) @@ -34,3 +34,28 @@ class EstateProperty(models.Model): Salesman_id = fields.Many2one('res.users', string='Salesman', default=lambda self: self.env.user) tags_ids = fields.Many2many('estate.property.tags', string='Tags') offer_ids = fields.One2many("estate.property.offer", "property_id", string="offer") + total_area = fields.Integer(string='Total Area(m2)', compute='_compute_total_area', store=True) + best_price = fields.Float(string='Best Offer', compute='_compute_best_price', store=True) + + @api.depends('living_area', 'garden_area') + def _compute_total_area(self): + for property in self: + property.total_area = property.living_area + (property.garden_area or 0) + + + @api.depends('offer_ids.price') + def _compute_best_price(self): + for record in self: + if record.offer_ids: + record.best_price = max(record.offer_ids.mapped('price')) + else: + record.best_price = 0.0 + + @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 diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index 840c5d3e2c5..4b1ca4dba5d 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,4 +1,6 @@ -from odoo import models, fields +from odoo import models, fields, api +from datetime import date +from dateutil.relativedelta import relativedelta class EstatePropertyOffer(models.Model): @@ -12,5 +14,17 @@ class EstatePropertyOffer(models.Model): copy=False, default='accepted', ) + + validity = fields.Integer(string='Validity(days)', default=7) partner_id = fields.Many2one('res.partner', string='Partner', required=True) property_id = fields.Many2one('estate.property', required=True) + date_deadline = fields.Date(string='Deadline', compute='_compute_date_deadline', store=True) + + @api.depends('validity', 'create_date') + def _compute_date_deadline(self): + for offer in self: + if offer.create_date: + create_date = offer.create_date.date() + else: + create_date = fields.Date.today() + offer.date_deadline = create_date + relativedelta(days=offer.validity) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index bd0c157a06b..020b8f25f6f 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -15,6 +15,13 @@ + + + + + + + @@ -54,6 +61,8 @@ + + @@ -68,11 +77,15 @@ + +
+ +
From b78a70456edc529fd328a809e03bf9efa8325f2d Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Wed, 22 Oct 2025 16:12:25 +0200 Subject: [PATCH 14/26] [IMP] estate: Ch8 fix --- estate/models/estate_property.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 068f2f13486..e019c9252d1 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,5 +1,4 @@ from odoo import models, fields, api -from datetime import date from dateutil.relativedelta import relativedelta @@ -42,7 +41,6 @@ def _compute_total_area(self): for property in self: property.total_area = property.living_area + (property.garden_area or 0) - @api.depends('offer_ids.price') def _compute_best_price(self): for record in self: @@ -58,4 +56,4 @@ 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 From cdbf0e2da7021443c97fc11469dd88af54ad72bc Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Wed, 22 Oct 2025 16:17:39 +0200 Subject: [PATCH 15/26] [IMP] estate: Ch8 fix1 --- estate/models/estate_property.py | 3 ++- estate/models/estate_property_offer.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index e019c9252d1..976c12adcc3 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,5 @@ from odoo import models, fields, api +from datetime import date from dateutil.relativedelta import relativedelta @@ -35,7 +36,7 @@ class EstateProperty(models.Model): offer_ids = fields.One2many("estate.property.offer", "property_id", string="offer") total_area = fields.Integer(string='Total Area(m2)', compute='_compute_total_area', store=True) best_price = fields.Float(string='Best Offer', compute='_compute_best_price', store=True) - + @api.depends('living_area', 'garden_area') def _compute_total_area(self): for property in self: diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index 4b1ca4dba5d..f3ac38630bf 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,5 +1,4 @@ from odoo import models, fields, api -from datetime import date from dateutil.relativedelta import relativedelta From ae6c1ab98e57d402222acdab733bc0a4fd625d98 Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Wed, 22 Oct 2025 17:26:59 +0200 Subject: [PATCH 16/26] [IMP] estate: Ch9 --- estate/models/estate_property.py | 32 ++++++++++++++++++++++---- estate/views/estate_property_views.xml | 6 +++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 976c12adcc3..f93f963c120 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,7 +1,7 @@ from odoo import models, fields, api from datetime import date from dateutil.relativedelta import relativedelta - +from odoo.exceptions import UserError class EstateProperty(models.Model): _name = "estate.property" @@ -11,6 +11,7 @@ class EstateProperty(models.Model): Property_Type = fields.Text() description = fields.Text() postcode = fields.Char() + state = fields.Text() date_availability = fields.Date(copy=False, readonly=True, default=lambda self: date.today() + relativedelta(months=3)) expected_price = fields.Float(required=True) selling_price = fields.Float(readonly=True, copy=False) @@ -25,10 +26,33 @@ class EstateProperty(models.Model): selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')]) active = fields.Boolean(default=True) - status = fields.Selection(copy=False, readonly=True, default='new', - string='status', - selection=[('new', 'New'), ('offer_received', 'Offer Received'), ('offer_accepted', 'Offer Accepted'), ('sold', 'Sold'), ('cancelled', 'Cancelled')], + status = fields.Selection( + copy=False, + readonly=True, + default='new', + string='Status', + selection=[ + ('new', 'New'), + ('offer_received', 'Offer Received'), + ('offer_accepted', 'Offer Accepted'), + ('sold', 'Sold'), + ('cancelled', 'Cancelled')] ) + + def action_set_sold(self): + if (self.state != "Cancelled"): + self.state = "Sold" + else: + raise UserError("A cancelled property can not be sold") + return True + + def action_set_cancelled(self): + if (self.state != "Sold"): + self.state = "Cancelled" + else: + raise UserError("A sold property can not be cancelled") + return True + Property_Type_id = fields.Many2one('estate.property.type', string='Type') Buyer_id = fields.Many2one('res.partner', string='Buyer', copy=False) Salesman_id = fields.Many2one('res.users', string='Salesman', default=lambda self: self.env.user) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 020b8f25f6f..0e12d285c42 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -22,6 +22,7 @@ + @@ -31,6 +32,10 @@
+
+

@@ -39,6 +44,7 @@ + From 4d8c35de752d32221d7f50ea9a83c70b28306655 Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Thu, 23 Oct 2025 08:13:54 +0200 Subject: [PATCH 17/26] [IMP] estate: Ch9fix --- estate/models/estate_property.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index f93f963c120..a1fc940ae57 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -3,6 +3,7 @@ from dateutil.relativedelta import relativedelta from odoo.exceptions import UserError + class EstateProperty(models.Model): _name = "estate.property" _description = "Real Estate Property" @@ -11,7 +12,7 @@ class EstateProperty(models.Model): Property_Type = fields.Text() description = fields.Text() postcode = fields.Char() - state = fields.Text() + state = fields.Text() date_availability = fields.Date(copy=False, readonly=True, default=lambda self: date.today() + relativedelta(months=3)) expected_price = fields.Float(required=True) selling_price = fields.Float(readonly=True, copy=False) @@ -36,7 +37,7 @@ class EstateProperty(models.Model): ('offer_received', 'Offer Received'), ('offer_accepted', 'Offer Accepted'), ('sold', 'Sold'), - ('cancelled', 'Cancelled')] + ('cancelled', 'Cancelled')] ) def action_set_sold(self): @@ -52,7 +53,7 @@ def action_set_cancelled(self): else: raise UserError("A sold property can not be cancelled") return True - + Property_Type_id = fields.Many2one('estate.property.type', string='Type') Buyer_id = fields.Many2one('res.partner', string='Buyer', copy=False) Salesman_id = fields.Many2one('res.users', string='Salesman', default=lambda self: self.env.user) From 791378e6176fbd509a7adb042da114ae1e178e3a Mon Sep 17 00:00:00 2001 From: hazei-odoo Date: Thu, 23 Oct 2025 09:25:39 +0200 Subject: [PATCH 18/26] [IMP] estate: Ch9fix1 --- estate/models/estate_property_offer.py | 18 +++++++++++++++++- estate/views/estate_property_views.xml | 2 ++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index f3ac38630bf..d40f8c822e2 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,6 +1,6 @@ from odoo import models, fields, api from dateutil.relativedelta import relativedelta - +from odoo.exceptions import UserError class EstatePropertyOffer(models.Model): _name = 'estate.property.offer' @@ -27,3 +27,19 @@ def _compute_date_deadline(self): else: create_date = fields.Date.today() offer.date_deadline = create_date + relativedelta(days=offer.validity) + + def action_accept(self): + for offer in self: + if offer.state != 'Refused': + offer.state = 'Accepted' + else: + raise UserError("A refused offer cannot be accepted.") + return True + + def action_refuse(self): + for offer in self: + if offer.state != 'Accepted': + offer.state = 'Refused' + else: + raise UserError("An accepted offer cannot be refused.") + return True \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 0e12d285c42..59f341f8d88 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -85,6 +85,8 @@ + +

- - - - - - - - + + + + + + + + + + + +
diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 442cc657517..cde3394e284 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -4,18 +4,19 @@ Property estate.property list,form + {'search_default_state': True} estate.property.list estate.property - + - + @@ -32,24 +33,28 @@ estate.property.form estate.property -
+ +
+
-
-

+ + + + - + @@ -65,9 +70,9 @@ - - - + + + @@ -75,24 +80,7 @@ - - - - - - - -