From 5ed10cfbcece8fb89ca91f5a877a5d55c5fc9256 Mon Sep 17 00:00:00 2001 From: "Tom Hermann (toher)" Date: Mon, 20 Jul 2026 15:13:39 +0200 Subject: [PATCH 01/13] Server framwork101 chap2 exercices --- estate/__init__.py | 0 estate/__manifest__.py | 5 +++++ 2 files changed, 5 insertions(+) create mode 100644 estate/__init__.py create mode 100644 estate/__manifest__.py diff --git a/estate/__init__.py b/estate/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/estate/__manifest__.py b/estate/__manifest__.py new file mode 100644 index 00000000000..54dfbe5a1ff --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,5 @@ +{ + 'name': 'Estate', + 'depends': ['base'], + 'application': True, +} \ No newline at end of file From 5dfaca34eda846e93827adf37f2c57c409c5d0df Mon Sep 17 00:00:00 2001 From: "Tom Hermann (toher)" Date: Mon, 20 Jul 2026 16:05:11 +0200 Subject: [PATCH 02/13] [ADD] Chapter 3 exercices --- estate/__init__.py | 1 + estate/models/__init__.py | 1 + estate/models/estate.py | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 estate/models/__init__.py create mode 100644 estate/models/estate.py diff --git a/estate/__init__.py b/estate/__init__.py index e69de29bb2d..9a7e03eded3 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models \ No newline at end of file diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..912e8d6a61f --- /dev/null +++ b/estate/models/__init__.py @@ -0,0 +1 @@ +from . import estate \ No newline at end of file diff --git a/estate/models/estate.py b/estate/models/estate.py new file mode 100644 index 00000000000..df23cc309b0 --- /dev/null +++ b/estate/models/estate.py @@ -0,0 +1,18 @@ +from odoo import fields, models + +class Estate(models.Model): + _name = "estate_property" + _description = "Estate Property Module" + + name = fields.Char(string="Title", required=True) + description = fields.Text(string="Description") + postcode = fields.Char(string="Postcode") + expected_date = fields.Float(string="Expected Date", required=True) + selling_price = fields.Float(string="Selling Price", required=True) + bedroom = fields.Integer(string="Number of Bedroom") + living_area = fields.Integer(string="Living area (square metter)") + facades = fields.Integer(string="Number of facades") + garage = fields.Boolean(string="Have a garage?") + garden = fields.Boolean(string="Have a garden?") + garden_area = fields.Integer(string="Garden area (square metter)") + garden_orientation = fields.Selection(string="Garden's orientation", selection=[('north', 'North'), ('sud', 'Sud'), ('east', ' East'), ('west', 'West')]) From f9aa9c018e67893f16704782931f815920587fbf Mon Sep 17 00:00:00 2001 From: "Tom Hermann (toher)" Date: Mon, 20 Jul 2026 16:54:24 +0200 Subject: [PATCH 03/13] [ADD] cahp4 --- estate/__manifest__.py | 4 ++++ estate/models/estate.py | 2 +- estate/security/ir.model.access.csv | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 54dfbe5a1ff..607ac5448f3 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -2,4 +2,8 @@ 'name': 'Estate', 'depends': ['base'], 'application': True, + + 'data' : [ + 'security/ir.model.access.csv', + ], } \ No newline at end of file diff --git a/estate/models/estate.py b/estate/models/estate.py index df23cc309b0..fc5665a7c58 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -1,7 +1,7 @@ from odoo import fields, models class Estate(models.Model): - _name = "estate_property" + _name = "estate.property" _description = "Estate Property Module" name = fields.Char(string="Title", required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..47af3abc9eb --- /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_model,access_estate_model, estate.property,base.group_user,1,1,1,1 \ No newline at end of file From e0449a03aff7f74b2a3cbf30cb397213841ad1c5 Mon Sep 17 00:00:00 2001 From: "Tom Hermann (toher)" Date: Mon, 20 Jul 2026 16:58:31 +0200 Subject: [PATCH 04/13] [REM] space in csv --- estate/security/ir.model.access.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 47af3abc9eb..6923cfaaa0c 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,2 +1,2 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_estate_model,access_estate_model, estate.property,base.group_user,1,1,1,1 \ No newline at end of file +access_estate_model,access_estate_model,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file From 10693186a28d452f69e9b7b49c4c27bb26c7085a Mon Sep 17 00:00:00 2001 From: "Tom Hermann (toher)" Date: Wed, 22 Jul 2026 10:54:02 +0200 Subject: [PATCH 05/13] [ADD] Chapter 5 --- estate/__manifest__.py | 2 ++ estate/models/estate.py | 40 ++++++++++++++++++++++++--- estate/view/estate_menus.xml | 8 ++++++ estate/view/estate_property_views.xml | 8 ++++++ 4 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 estate/view/estate_menus.xml create mode 100644 estate/view/estate_property_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 607ac5448f3..ec01c964827 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -5,5 +5,7 @@ 'data' : [ 'security/ir.model.access.csv', + 'view/estate_property_views.xml', + 'view/estate_menus.xml' ], } \ No newline at end of file diff --git a/estate/models/estate.py b/estate/models/estate.py index fc5665a7c58..3d4f0c8f21d 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -1,4 +1,6 @@ from odoo import fields, models +from datetime import timedelta + class Estate(models.Model): _name = "estate.property" @@ -7,12 +9,42 @@ class Estate(models.Model): name = fields.Char(string="Title", required=True) description = fields.Text(string="Description") postcode = fields.Char(string="Postcode") - expected_date = fields.Float(string="Expected Date", required=True) - selling_price = fields.Float(string="Selling Price", required=True) - bedroom = fields.Integer(string="Number of Bedroom") + + exprected_price = fields.Float(string="Exprected Price", required=True) + selling_price = fields.Float(string="Selling Price", copy=False, readonly=True) + + expected_date = fields.Date( + string="Expected Date", + required=True, + copy=False, + default=(fields.Date.today() + timedelta(days=90)), + ) + + bedroom = fields.Integer(string="Number of Bedroom", default=2) living_area = fields.Integer(string="Living area (square metter)") facades = fields.Integer(string="Number of facades") garage = fields.Boolean(string="Have a garage?") garden = fields.Boolean(string="Have a garden?") garden_area = fields.Integer(string="Garden area (square metter)") - garden_orientation = fields.Selection(string="Garden's orientation", selection=[('north', 'North'), ('sud', 'Sud'), ('east', ' East'), ('west', 'West')]) + garden_orientation = fields.Selection( + string="Garden's orientation", + selection=[ + ("north", "North"), + ("sud", "Sud"), + ("east", " East"), + ("west", "West"), + ], + ) + sate = fields.Selection( + string="Estate's state", + selection=[ + ("new", "New"), + ("offer_recieved", "Offer Received"), + ("offer_accepted", " Offer Accepted"), + ("sold", "Sold"), + ("cancelled", "Cancelled"), + ], + default="new", + ) + + active = fields.Boolean(default=False) diff --git a/estate/view/estate_menus.xml b/estate/view/estate_menus.xml new file mode 100644 index 00000000000..26abe2dd1df --- /dev/null +++ b/estate/view/estate_menus.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/estate/view/estate_property_views.xml b/estate/view/estate_property_views.xml new file mode 100644 index 00000000000..ff11b0f5fa9 --- /dev/null +++ b/estate/view/estate_property_views.xml @@ -0,0 +1,8 @@ + + + + Estate action + estate.property + list,form + + \ No newline at end of file From da12ac2cefb98f89665dd68749c63a1dca99ba01 Mon Sep 17 00:00:00 2001 From: "Tom Hermann (toher)" Date: Wed, 22 Jul 2026 11:08:34 +0200 Subject: [PATCH 06/13] [FIX] ci style errors --- estate/__init__.py | 2 +- estate/__manifest__.py | 4 ++-- estate/models/__init__.py | 2 +- 3 files changed, 4 insertions(+), 4 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 ec01c964827..ff7482036d0 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -3,9 +3,9 @@ 'depends': ['base'], 'application': True, - 'data' : [ + 'data': [ 'security/ir.model.access.csv', 'view/estate_property_views.xml', 'view/estate_menus.xml' ], -} \ No newline at end of file +} diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 912e8d6a61f..e4f59229d23 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1 @@ -from . import estate \ No newline at end of file +from . import estate From fdcaf6bfabbd76e54f284cd5f1d0939bfe4c662e Mon Sep 17 00:00:00 2001 From: "Tom Hermann (toher)" Date: Wed, 22 Jul 2026 14:26:17 +0200 Subject: [PATCH 07/13] [ADD] Chap 6 --- estate/models/estate.py | 2 +- estate/view/estate_menus.xml | 2 + estate/view/estate_property_views.xml | 85 ++++++++++++++++++++++++++- 3 files changed, 87 insertions(+), 2 deletions(-) diff --git a/estate/models/estate.py b/estate/models/estate.py index 3d4f0c8f21d..b933ea69b5b 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -10,7 +10,7 @@ class Estate(models.Model): description = fields.Text(string="Description") postcode = fields.Char(string="Postcode") - exprected_price = fields.Float(string="Exprected Price", required=True) + expected_price = fields.Float(string="Expected Price", required=True) selling_price = fields.Float(string="Selling Price", copy=False, readonly=True) expected_date = fields.Date( diff --git a/estate/view/estate_menus.xml b/estate/view/estate_menus.xml index 26abe2dd1df..f42668ae520 100644 --- a/estate/view/estate_menus.xml +++ b/estate/view/estate_menus.xml @@ -1,8 +1,10 @@ + + \ No newline at end of file diff --git a/estate/view/estate_property_views.xml b/estate/view/estate_property_views.xml index ff11b0f5fa9..3108db3fe34 100644 --- a/estate/view/estate_property_views.xml +++ b/estate/view/estate_property_views.xml @@ -1,8 +1,91 @@ + Estate action estate.property list,form - \ No newline at end of file + + + + estate.property.list + estate.property + + + + + + + + + + + + + + + + estate.property.form + estate.property + +
+ +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + + estate.property.search + estate.property + + + + + + + + + + + + + + + + + + From 20249882ff2f0ba99a6a06adf29ff13f096efb6e Mon Sep 17 00:00:00 2001 From: "Tom Hermann (toher)" Date: Wed, 22 Jul 2026 15:02:35 +0200 Subject: [PATCH 08/13] [FIX] Typo (sate -> state); add name of filer --- estate/models/estate.py | 2 +- estate/view/estate_property_views.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/estate/models/estate.py b/estate/models/estate.py index b933ea69b5b..66fc4ca3fcd 100644 --- a/estate/models/estate.py +++ b/estate/models/estate.py @@ -35,7 +35,7 @@ class Estate(models.Model): ("west", "West"), ], ) - sate = fields.Selection( + state = fields.Selection( string="Estate's state", selection=[ ("new", "New"), diff --git a/estate/view/estate_property_views.xml b/estate/view/estate_property_views.xml index 3108db3fe34..714b0a703b6 100644 --- a/estate/view/estate_property_views.xml +++ b/estate/view/estate_property_views.xml @@ -57,7 +57,7 @@ - + @@ -80,7 +80,7 @@ - + From 21bfae38db81c9b17f7812cdf96f67f3a5c19764 Mon Sep 17 00:00:00 2001 From: "Tom Hermann (toher)" Date: Wed, 22 Jul 2026 15:47:08 +0200 Subject: [PATCH 09/13] [CLN] Property class and file name --- estate/models/__init__.py | 2 +- estate/models/{estate.py => estate_property.py} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename estate/models/{estate.py => estate_property.py} (97%) diff --git a/estate/models/__init__.py b/estate/models/__init__.py index e4f59229d23..5e1963c9d2f 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1 @@ -from . import estate +from . import estate_property diff --git a/estate/models/estate.py b/estate/models/estate_property.py similarity index 97% rename from estate/models/estate.py rename to estate/models/estate_property.py index 66fc4ca3fcd..6ad7934fa5e 100644 --- a/estate/models/estate.py +++ b/estate/models/estate_property.py @@ -2,7 +2,7 @@ from datetime import timedelta -class Estate(models.Model): +class EstateProperty(models.Model): _name = "estate.property" _description = "Estate Property Module" From 9ea5be2ddeef3c41a5d5621eb047cfabbe27eba8 Mon Sep 17 00:00:00 2001 From: "Tom Hermann (toher)" Date: Thu, 23 Jul 2026 09:29:38 +0200 Subject: [PATCH 10/13] [ADD] Chap 7 --- estate/__manifest__.py | 5 ++++- estate/models/__init__.py | 3 +++ estate/models/estate_offer.py | 17 +++++++++++++++ estate/models/estate_property.py | 16 ++++++++++++++- estate/models/estate_tag.py | 7 +++++++ estate/models/estate_type.py | 7 +++++++ estate/security/ir.model.access.csv | 5 ++++- estate/view/estate_menus.xml | 8 ++++++-- estate/view/estate_property_tag_view.xml | 19 +++++++++++++++++ estate/view/estate_property_type_view.xml | 21 +++++++++++++++++++ estate/view/estate_property_views.xml | 25 +++++++++++++++++++++-- 11 files changed, 126 insertions(+), 7 deletions(-) create mode 100644 estate/models/estate_offer.py create mode 100644 estate/models/estate_tag.py create mode 100644 estate/models/estate_type.py create mode 100644 estate/view/estate_property_tag_view.xml create mode 100644 estate/view/estate_property_type_view.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index ff7482036d0..9a3222726b3 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -6,6 +6,9 @@ 'data': [ 'security/ir.model.access.csv', 'view/estate_property_views.xml', - 'view/estate_menus.xml' + 'view/estate_menus.xml', + 'view/estate_property_type_view.xml', + 'view/estate_property_tag_view.xml', + # 'view/estate_property_offer_view.xml', ], } diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 5e1963c9d2f..8d8063038f5 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1,4 @@ from . import estate_property +from . import estate_type +from . import estate_tag +from . import estate_offer diff --git a/estate/models/estate_offer.py b/estate/models/estate_offer.py new file mode 100644 index 00000000000..93834e456f4 --- /dev/null +++ b/estate/models/estate_offer.py @@ -0,0 +1,17 @@ +from odoo import fields, models + +class EstateOffer(models.Model): + _name = "estate.property.offer" + _description = "Offer" + + price = fields.Float(string="Price") + status = fields.Selection( + string="Status", + selection=[ + ("accepted", "Accepted"), + ("refused", "Refused") + ], + copy=False + ) + partner_id = fields.Many2one("res.partner", string="Buyer", required=True) + property_id = fields.Many2one("estate.property", string="Property", required=True) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 6ad7934fa5e..d1fc8b1b431 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -47,4 +47,18 @@ class EstateProperty(models.Model): default="new", ) - active = fields.Boolean(default=False) + salesman_id = fields.Many2one( + "res.users", + string="Salesman", + default=lambda self: self.env.user + ) + + buyer_id = fields.Many2one("res.partner", string="Buyer", copy=False) + + property_type_id = fields.Many2one("estate.property.type", string="Type") + + property_tag_ids = fields.Many2many("estate.property.tag", string="Tag") + + proterty_offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers") + + active = fields.Boolean(default=True) diff --git a/estate/models/estate_tag.py b/estate/models/estate_tag.py new file mode 100644 index 00000000000..3125a99d0d0 --- /dev/null +++ b/estate/models/estate_tag.py @@ -0,0 +1,7 @@ +from odoo import models, fields + +class PropertyTag(models.Model): + _name = "estate.property.tag" + _description = "Estate Tag" + + name = fields.Char(string="Tag") diff --git a/estate/models/estate_type.py b/estate/models/estate_type.py new file mode 100644 index 00000000000..026a4abf2f5 --- /dev/null +++ b/estate/models/estate_type.py @@ -0,0 +1,7 @@ +from odoo import fields, models + +class EstateType(models.Model): + _name = "estate.property.type" + _description = "Estate Type" + + name = fields.Char(string="Type", required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 6923cfaaa0c..b92b7efad92 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_model,access_estate_model,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file +access_estate_model,access_estate_model,model_estate_property,base.group_user,1,1,1,1 +access_state_type_model,access_state_type_model,model_estate_property_type,base.group_user,1,1,1,1 +access_state_tag_model,access_state_tag_model,model_estate_property_tag,base.group_user,1,1,1,1 +access_state_offer_model,access_state_offer_model,model_estate_property_offer,base.group_user,1,1,1,1 diff --git a/estate/view/estate_menus.xml b/estate/view/estate_menus.xml index f42668ae520..6cdd588fa80 100644 --- a/estate/view/estate_menus.xml +++ b/estate/view/estate_menus.xml @@ -2,9 +2,13 @@ - + + + + + - \ No newline at end of file + diff --git a/estate/view/estate_property_tag_view.xml b/estate/view/estate_property_tag_view.xml new file mode 100644 index 00000000000..da45a44da23 --- /dev/null +++ b/estate/view/estate_property_tag_view.xml @@ -0,0 +1,19 @@ + + + + Estate Tag + estate.property.tag + list,form + + + + + estate.property.tag.list + estate.property.tag + + + + + + + diff --git a/estate/view/estate_property_type_view.xml b/estate/view/estate_property_type_view.xml new file mode 100644 index 00000000000..2a7d17a7cfe --- /dev/null +++ b/estate/view/estate_property_type_view.xml @@ -0,0 +1,21 @@ + + + + + Estate Type + estate.property.type + list,form + + + + + estate.property.type.list + estate.property.type + + + + + + + + diff --git a/estate/view/estate_property_views.xml b/estate/view/estate_property_views.xml index 714b0a703b6..40d9989edb5 100644 --- a/estate/view/estate_property_views.xml +++ b/estate/view/estate_property_views.xml @@ -2,7 +2,7 @@ - Estate action + Properties estate.property list,form @@ -34,6 +34,7 @@

+ @@ -43,10 +44,13 @@ + + + - + @@ -61,6 +65,23 @@ + + + + + + + + + + + + + + + + + From aae4e0c4f8bcde019da06169c6f1ecba3e21cf0c Mon Sep 17 00:00:00 2001 From: "Tom Hermann (toher)" Date: Thu, 23 Jul 2026 10:53:46 +0200 Subject: [PATCH 11/13] [ADD] Chap 8 --- estate/models/estate_offer.py | 15 +++++++++- estate/models/estate_property.py | 40 ++++++++++++++++++++------- estate/view/estate_property_views.xml | 5 +++- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/estate/models/estate_offer.py b/estate/models/estate_offer.py index 93834e456f4..112e791b1b4 100644 --- a/estate/models/estate_offer.py +++ b/estate/models/estate_offer.py @@ -1,4 +1,5 @@ -from odoo import fields, models +from odoo import fields, models, api +from datetime import timedelta class EstateOffer(models.Model): _name = "estate.property.offer" @@ -15,3 +16,15 @@ class EstateOffer(models.Model): ) partner_id = fields.Many2one("res.partner", string="Buyer", required=True) property_id = fields.Many2one("estate.property", string="Property", required=True) + validity = fields.Integer(string="Validity", default=7) + date_deadline = fields.Date(string="Deadline", compute="_compute_dead_line", inverse="_inverse_validity") + + + @api.depends("validity") + def _compute_dead_line(self): + for offer in self: + offer.date_deadline = fields.Date.today() + timedelta(days=offer.validity) + + def _inverse_validity(self): + for offer in self: + offer.validity = (offer.date_deadline - fields.Date.today()).days diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index d1fc8b1b431..d7f8a6abb0e 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,4 @@ -from odoo import fields, models +from odoo import fields, models, api from datetime import timedelta @@ -6,20 +6,20 @@ class EstateProperty(models.Model): _name = "estate.property" _description = "Estate Property Module" + # Base Fields + name = fields.Char(string="Title", required=True) description = fields.Text(string="Description") postcode = fields.Char(string="Postcode") - expected_price = fields.Float(string="Expected Price", required=True) selling_price = fields.Float(string="Selling Price", copy=False, readonly=True) - + best_price = fields.Integer(string="Best Price", compute="_compute_best_price") expected_date = fields.Date( string="Expected Date", required=True, copy=False, default=(fields.Date.today() + timedelta(days=90)), ) - bedroom = fields.Integer(string="Number of Bedroom", default=2) living_area = fields.Integer(string="Living area (square metter)") facades = fields.Integer(string="Number of facades") @@ -35,6 +35,7 @@ class EstateProperty(models.Model): ("west", "West"), ], ) + total_area = fields.Integer(string="Total Area", compute="_compute_total_area") state = fields.Selection( string="Estate's state", selection=[ @@ -46,19 +47,38 @@ class EstateProperty(models.Model): ], default="new", ) - salesman_id = fields.Many2one( "res.users", string="Salesman", default=lambda self: self.env.user ) - buyer_id = fields.Many2one("res.partner", string="Buyer", copy=False) - property_type_id = fields.Many2one("estate.property.type", string="Type") - property_tag_ids = fields.Many2many("estate.property.tag", string="Tag") - proterty_offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers") - active = fields.Boolean(default=True) + + + @api.depends('garden_area', 'living_area') + def _compute_total_area(self): + for record in self: + record.total_area = record.living_area + record.garden_area + + @api.depends('proterty_offer_ids.price') + def _compute_best_price(self): + for record in self: + prices = record.proterty_offer_ids.mapped('price') + if not prices: + record.best_price = 0 + else: + record.best_price = max(prices) + + @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 = '' + # return {'warning': {'title': "Test warning", 'message': "foo", 'type': 'notification'},} diff --git a/estate/view/estate_property_views.xml b/estate/view/estate_property_views.xml index 40d9989edb5..ef4a299db5c 100644 --- a/estate/view/estate_property_views.xml +++ b/estate/view/estate_property_views.xml @@ -42,6 +42,7 @@ + @@ -51,7 +52,6 @@ - @@ -62,6 +62,7 @@ + @@ -70,6 +71,8 @@ + + From 5e71d3b6616544f483fa40f253e75436e2318f2d Mon Sep 17 00:00:00 2001 From: "Tom Hermann (toher)" Date: Thu, 23 Jul 2026 14:27:29 +0200 Subject: [PATCH 12/13] [ADD] Chap 9 --- estate/models/estate_offer.py | 17 ++++++++++++++- estate/models/estate_property.py | 30 ++++++++++++++++++++++++++- estate/view/estate_property_views.xml | 8 ++++++- 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/estate/models/estate_offer.py b/estate/models/estate_offer.py index 112e791b1b4..fd76b4ee989 100644 --- a/estate/models/estate_offer.py +++ b/estate/models/estate_offer.py @@ -1,4 +1,4 @@ -from odoo import fields, models, api +from odoo import fields, models, api, exceptions from datetime import timedelta class EstateOffer(models.Model): @@ -28,3 +28,18 @@ def _compute_dead_line(self): def _inverse_validity(self): for offer in self: offer.validity = (offer.date_deadline - fields.Date.today()).days + + def action_accepte_offer(self): + for offer in self: + if offer.status =="refused": + raise exceptions.UserError("Can't accept an refused offer") + offer.status = "accepted" + offer.property_id.accept_offer() + return True + + def action_refuse_offer(self): + for offer in self: + if offer.status == "accepted": + raise exceptions.UserError("Can't refuse an accepted offer") + offer.status = "refused" + return True diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index d7f8a6abb0e..502295ccf60 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,4 @@ -from odoo import fields, models, api +from odoo import fields, models, api, exceptions from datetime import timedelta @@ -82,3 +82,31 @@ def _onchange_garden(self): self.garden_area = 0 self.garden_orientation = '' # return {'warning': {'title': "Test warning", 'message': "foo", 'type': 'notification'},} + + def action_sold_adv(self): + for advertisements in self: + if advertisements.state == "cancelled": + raise exceptions.UserError("Can't sold an canceled advertise") + advertisements.state = "sold" + return True + + def action_cancel_adv(self): + for advertisements in self: + if advertisements.state == "sold": + raise exceptions.UserError("Can't cancel an sold advertise") + advertisements.state = "cancelled" + return True + + def accept_offer(self): + for adrivertise in self: + # offer = [offer for offer in adrivertise.proterty_offer_ids if offer.status == 'accepted' ][0] + accepted_offer = list() + for offer in adrivertise.proterty_offer_ids: + if accepted_offer: offer.status = "refused" + elif offer.status == 'accepted': accepted_offer.append(offer) + else: offer.status = 'refused' + + accepted_offer = accepted_offer[0] + adrivertise.buyer_id = accepted_offer.partner_id + adrivertise.selling_price = accepted_offer.price + adrivertise.state = 'offer_accepted' diff --git a/estate/view/estate_property_views.xml b/estate/view/estate_property_views.xml index ef4a299db5c..db8a18ceb54 100644 --- a/estate/view/estate_property_views.xml +++ b/estate/view/estate_property_views.xml @@ -30,6 +30,10 @@ estate.property
+
+

@@ -47,6 +51,7 @@ + @@ -61,7 +66,6 @@ - @@ -74,6 +78,8 @@ +