From dc64d10ea9e4ea8d2fd251721abcd194fbb5677b Mon Sep 17 00:00:00 2001 From: Surap Date: Tue, 15 Sep 2026 13:27:18 +0200 Subject: [PATCH 01/34] Chapter 2 --- estate/__init__.py | 0 estate/__manifest__.py | 8 ++++++++ 2 files changed, 8 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..223b3a8f4c5 --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,8 @@ +{ + 'name': 'Estate', + 'depends': [ + 'base' + ], + 'application': True, + 'installable': True +} \ No newline at end of file From 2fb7c3f93062be2494dfb347fe4b71ad17e6e5d8 Mon Sep 17 00:00:00 2001 From: Surap Date: Wed, 16 Sep 2026 09:12:44 +0200 Subject: [PATCH 02/34] modified: estate/__init__.py import modified: estate/__manifest__.py import new file: estate/data/.gitkeep new file: estate/models/__init__.py creation + import new file: estate/models/estate_property.py define model --- estate/__init__.py | 1 + estate/__manifest__.py | 6 +++--- estate/data/.gitkeep | 0 estate/models/__init__.py | 1 + estate/models/estate_property.py | 25 +++++++++++++++++++++++++ 5 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 estate/data/.gitkeep 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 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/__manifest__.py b/estate/__manifest__.py index 223b3a8f4c5..9f42845d294 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,8 +1,8 @@ { - 'name': 'Estate', + 'name': 'estate', 'depends': [ 'base' ], 'application': True, - 'installable': True -} \ No newline at end of file + 'installable': True, +} diff --git a/estate/data/.gitkeep b/estate/data/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..f4c8fd6db6d --- /dev/null +++ b/estate/models/__init__.py @@ -0,0 +1 @@ +from . import estate_property \ No newline at end of file diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py new file mode 100644 index 00000000000..bc38f1dd429 --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,25 @@ + + +from odoo import fields, models + + +class EstateProperty(models.Model): + _name: str = "estate.propety" + + name: fields.Char = fields.Char() + description: fields.Text = fields.Text() + postcode: fields.Char = fields.Char() + date_availability: fields.Date = fields.Date('Creation Date') + expected_price: fields.Float = fields.Float() + selling_price: fields.Float = fields.Float() + bedroom: fields.Integer = fields.Integer() + living_area: fields.Integer = fields.Integer() + facades: fields.Integer = fields.Integer() + garage: fields.Boolean = fields.Boolean() + garden: fields.Boolean = fields.Boolean() + garden_area: fields.Integer = fields.Integer() + garden_orientation: fields.Selection( + string='Type', + selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')], + help="Type is used to separate Leads and Opportunities") + From 9b34aef10b887e1cb9436d747e481acf11e11a1d Mon Sep 17 00:00:00 2001 From: Surap Date: Wed, 16 Sep 2026 09:25:59 +0200 Subject: [PATCH 03/34] =?UTF-8?q?chapter=203=20=09modified:=20=20=20estate?= =?UTF-8?q?/models/estate=5Fproperty.py=20=09=09try=20to=20fix=20weird=20b?= =?UTF-8?q?asedpylance=20error=20=09=09=09Argument=20of=20type=20"list[tup?= =?UTF-8?q?le[str,=20str]]"=20cannot=20be=20assigned=20to=20parameter=20"s?= =?UTF-8?q?election"=20of=20type=20"Sentinel"=20in=20function=20"=5F=5Fini?= =?UTF-8?q?t=5F=5F"=20=09=09=09=C2=A0=C2=A0"list[tuple[str,=20str]]"=20is?= =?UTF-8?q?=20not=20assignable=20to=20"Sentinel"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- estate/models/estate_property.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index bc38f1dd429..4774ac2adb6 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -15,11 +15,10 @@ class EstateProperty(models.Model): bedroom: fields.Integer = fields.Integer() living_area: fields.Integer = fields.Integer() facades: fields.Integer = fields.Integer() - garage: fields.Boolean = fields.Boolean() garden: fields.Boolean = fields.Boolean() garden_area: fields.Integer = fields.Integer() - garden_orientation: fields.Selection( + garage: fields.Boolean = fields.Boolean() + garden_orientation: fields.Selection = fields.Selection( + selection=[("north", "North"), ("south", "South"), ("east", "East"), ("west", "West")], string='Type', - selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')], help="Type is used to separate Leads and Opportunities") - From 933a256bee1a0d2deeab8de6e09ce71044a2647f Mon Sep 17 00:00:00 2001 From: Surap Date: Wed, 16 Sep 2026 09:42:27 +0200 Subject: [PATCH 04/34] modified: estate/models/estate_property.py adding description --- estate/models/estate_property.py | 1 + 1 file changed, 1 insertion(+) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 4774ac2adb6..55abfe8dd63 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -6,6 +6,7 @@ class EstateProperty(models.Model): _name: str = "estate.propety" + _description: str | None = None name: fields.Char = fields.Char() description: fields.Text = fields.Text() postcode: fields.Char = fields.Char() From 96115d5f0a474f38803c4fe8f729e0a9c1e73707 Mon Sep 17 00:00:00 2001 From: Surap Date: Wed, 16 Sep 2026 10:16:32 +0200 Subject: [PATCH 05/34] modified: estate/models/estate_property.py fix typo; remove nl --- estate/models/estate_property.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 55abfe8dd63..e83b77193cf 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -4,7 +4,7 @@ class EstateProperty(models.Model): - _name: str = "estate.propety" + _name: str = "estate.property" _description: str | None = None name: fields.Char = fields.Char() From 4507a29d6e0c7fb4ee0396450a80f2b6acca8ceb Mon Sep 17 00:00:00 2001 From: Surap Date: Wed, 16 Sep 2026 10:31:21 +0200 Subject: [PATCH 06/34] Chapter 4 new file: estate/security/ir.model.access.csv defining acces --- estate/security/ir.model.access.csv | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..2109ce9a591 --- /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,estate.property,models_estate_property,base.group_user,1,1,1,1 \ No newline at end of file From 8e9e61ea315b0dce5df9f6f9fabfb0433babcf2c Mon Sep 17 00:00:00 2001 From: Surap Date: Wed, 16 Sep 2026 10:32:23 +0200 Subject: [PATCH 07/34] modified: estate/security/ir.model.access.csv typo --- 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 2109ce9a591..9ccf73e191e 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_property,estate.property,models_estate_property,base.group_user,1,1,1,1 \ No newline at end of file +access_estate_property,estate.property,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file From d481893e2641e79a7509036512b95ee21aec1025 Mon Sep 17 00:00:00 2001 From: Surap Date: Wed, 16 Sep 2026 10:35:20 +0200 Subject: [PATCH 08/34] modified: estate/__manifest__.py reference security --- estate/__manifest__.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 9f42845d294..0122ee9bdfc 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -5,4 +5,7 @@ ], 'application': True, 'installable': True, + 'data': [ + 'security/ir.model.access.csv', + ], } From d507cbc60ac11cc0171f7acdfc99c40620bdfa2f Mon Sep 17 00:00:00 2001 From: Surap Date: Wed, 16 Sep 2026 11:05:53 +0200 Subject: [PATCH 09/34] Chapter 5 modified: estate/__manifest__.py ref view new file: estate/views/estate_property_views.xml basic view --- estate/__manifest__.py | 1 + estate/views/estate_property_views.xml | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 estate/views/estate_property_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 0122ee9bdfc..7abe4223867 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -7,5 +7,6 @@ 'installable': True, 'data': [ 'security/ir.model.access.csv', + 'views/estate_property_views.xml', ], } diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml new file mode 100644 index 00000000000..590caab2404 --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,5 @@ + + Estate property + estate_property + list,form + \ No newline at end of file From 1e08dec023db8a15d53298b84c2b119a46f5697c Mon Sep 17 00:00:00 2001 From: Surap Date: Wed, 16 Sep 2026 11:29:46 +0200 Subject: [PATCH 10/34] Chapter 5 modified: estate/__manifest__.py ref menu new file: estate/views/estate_menus.xml modified: estate/views/estate_property_views.xml fix --- estate/__manifest__.py | 1 + estate/views/estate_menus.xml | 8 ++++++++ estate/views/estate_property_views.xml | 13 ++++++++----- 3 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 estate/views/estate_menus.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 7abe4223867..6bddf38f0b7 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -8,5 +8,6 @@ 'data': [ 'security/ir.model.access.csv', 'views/estate_property_views.xml', + 'views/estate_menus.xml', ], } diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml new file mode 100644 index 00000000000..a128b1ac49e --- /dev/null +++ b/estate/views/estate_menus.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 590caab2404..22855612360 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,5 +1,8 @@ - - Estate property - estate_property - list,form - \ No newline at end of file + + + + Estate action + estate.property + list,form + + From 9b2f068ecfe6088e8f442d3e6d2e0a97c1846358 Mon Sep 17 00:00:00 2001 From: srapyx Date: Wed, 16 Sep 2026 11:45:47 +0200 Subject: [PATCH 11/34] Update estate/models/estate_property.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Leclerc Léo (leol) <74907637+leclerc-leo@users.noreply.github.com> --- estate/models/estate_property.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index e83b77193cf..e88a7ca32f2 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -22,4 +22,5 @@ class EstateProperty(models.Model): garden_orientation: fields.Selection = fields.Selection( selection=[("north", "North"), ("south", "South"), ("east", "East"), ("west", "West")], string='Type', - help="Type is used to separate Leads and Opportunities") + help="Type is used to separate Leads and Opportunities", + ) From 9c44b0a0c361a3f25a1b39287e66ad76254f6dc5 Mon Sep 17 00:00:00 2001 From: srapyx Date: Wed, 16 Sep 2026 11:47:42 +0200 Subject: [PATCH 12/34] Update estate/models/estate_property.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Leclerc Léo (leol) <74907637+leclerc-leo@users.noreply.github.com> --- estate/models/estate_property.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index e88a7ca32f2..87e45d70c69 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,5 +1,3 @@ - - from odoo import fields, models From fe387302ababeae664ae229f908ef3f3c4cfb772 Mon Sep 17 00:00:00 2001 From: Surap Date: Wed, 16 Sep 2026 11:48:28 +0200 Subject: [PATCH 13/34] --Fix PR feedback-- deleted: estate/data/.gitkeep --- estate/data/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 estate/data/.gitkeep diff --git a/estate/data/.gitkeep b/estate/data/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 From f7fc4d7124d4cc0de7d11993b676b5e8d8b0d477 Mon Sep 17 00:00:00 2001 From: Surap Date: Wed, 16 Sep 2026 11:50:23 +0200 Subject: [PATCH 14/34] --Feedback fix linter modified: estate/__init__.py modified: estate/models/__init__.py modified: estate/security/ir.model.access.csv --- estate/__init__.py | 2 +- estate/models/__init__.py | 2 +- estate/security/ir.model.access.csv | 2 +- 3 files changed, 3 insertions(+), 3 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/models/__init__.py b/estate/models/__init__.py index f4c8fd6db6d..5e1963c9d2f 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1 @@ -from . import estate_property \ No newline at end of file +from . import estate_property diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 9ccf73e191e..6531f331708 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_property,estate.property,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file +access_estate_property,estate.property,model_estate_property,base.group_user,1,1,1,1 From 00f45ad7fd8d27fa2962e39e9b171f4f86d5d450 Mon Sep 17 00:00:00 2001 From: Surap Date: Wed, 16 Sep 2026 13:36:35 +0200 Subject: [PATCH 15/34] chapter5; form and list view should be okay modified: estate/views/estate_menus.xml modified: estate/views/estate_property_views.xml --- estate/views/estate_menus.xml | 4 ++-- estate/views/estate_property_views.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index a128b1ac49e..0686b542e49 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -1,7 +1,7 @@ - - + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 22855612360..795bc161b39 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -2,7 +2,7 @@ Estate action - estate.property + estate.property list,form From 349283cb59362926b559cf35d30d596c9a788bdc Mon Sep 17 00:00:00 2001 From: Surap Date: Wed, 16 Sep 2026 13:38:36 +0200 Subject: [PATCH 16/34] Chapter 5 - base form and list ok modified: estate/views/estate_menus.xml modified: estate/views/estate_property_views.xml --- estate/views/estate_menus.xml | 2 +- estate/views/estate_property_views.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index 0686b542e49..5b85b27b63b 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -1,7 +1,7 @@ - + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 795bc161b39..22855612360 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -2,7 +2,7 @@ Estate action - estate.property + estate.property list,form From 01bc01dd835f1e9f021f5c8bc5fb30e189576a98 Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 09:41:34 +0200 Subject: [PATCH 17/34] Chapter 5 (end) modified: estate/models/estate_property.py add state --- estate/models/estate_property.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index e83b77193cf..fb7eb0d17a9 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,19 +1,21 @@ - +from copy import copy +from typing import override from odoo import fields, models - +from odoo.tools import date_utils class EstateProperty(models.Model): _name: str = "estate.property" - + _active = True _description: str | None = None + name: fields.Char = fields.Char() description: fields.Text = fields.Text() postcode: fields.Char = fields.Char() - date_availability: fields.Date = fields.Date('Creation Date') + date_availability: fields.Date = fields.Date('Availability Date', copy=False, default=date_utils.add(fields.Date.today(), months=3)) expected_price: fields.Float = fields.Float() - selling_price: fields.Float = fields.Float() - bedroom: fields.Integer = fields.Integer() + selling_price: fields.Float = fields.Float(readonly=True, copy=False) + bedroom: fields.Integer = fields.Integer(default=2) living_area: fields.Integer = fields.Integer() facades: fields.Integer = fields.Integer() garden: fields.Boolean = fields.Boolean() @@ -23,3 +25,7 @@ class EstateProperty(models.Model): selection=[("north", "North"), ("south", "South"), ("east", "East"), ("west", "West")], string='Type', help="Type is used to separate Leads and Opportunities") + state = fields.Selection( + [(word.lower(), word) for word in ["New", "Offer Received", "Offer Accepted", "Sold", "Cancelled"]], + copy=False, + default="New") From 55b4abda6908e89abbb3c1f73614ab2a8ffd8d95 Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 09:44:07 +0200 Subject: [PATCH 18/34] Style 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 fb7eb0d17a9..9e099b463b7 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,9 +1,7 @@ -from copy import copy -from typing import override - from odoo import fields, models from odoo.tools import date_utils + class EstateProperty(models.Model): _name: str = "estate.property" _active = True From adf9e21b37afc9812a1ba09b69f507cb2324d479 Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 10:52:32 +0200 Subject: [PATCH 19/34] Chapter 6 list view ok modified: estate/views/estate_property_views.xml --- estate/views/estate_property_views.xml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 22855612360..567c073c514 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -5,4 +5,21 @@ estate.property list,form + + estate.property.list + estate.property + + + + + + + + + + + + + + From 77a4b8d6e21fa2cd74d2c822e988ff1d9c9198e7 Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 10:57:29 +0200 Subject: [PATCH 20/34] modified: estate/models/estate_property.py fix state default value --- estate/models/estate_property.py | 2 +- estate/views/estate_property_views.xml | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 9e099b463b7..59260c1b6cf 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -26,4 +26,4 @@ class EstateProperty(models.Model): state = fields.Selection( [(word.lower(), word) for word in ["New", "Offer Received", "Offer Accepted", "Sold", "Cancelled"]], copy=False, - default="New") + default=("new", "New")) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 567c073c514..4d54f8a4b7a 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -5,11 +5,11 @@ estate.property list,form - + estate.property.list estate.property - + @@ -20,6 +20,14 @@ + + estate.property.form + estate.property + +
+
+
+
From 1bbd311a9396fb6863a889906ee16ccf18cfd65b Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 11:00:32 +0200 Subject: [PATCH 21/34] modified: estate/models/estate_property.py -> same fix as previous commit --- estate/models/estate_property.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 59260c1b6cf..4c5cecdeb49 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -26,4 +26,4 @@ class EstateProperty(models.Model): state = fields.Selection( [(word.lower(), word) for word in ["New", "Offer Received", "Offer Accepted", "Sold", "Cancelled"]], copy=False, - default=("new", "New")) + default="new") From 939e3e346f9c92c7aad0dada3e1c112c39242782 Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 11:59:19 +0200 Subject: [PATCH 22/34] modified: estate/views/estate_property_views.xml form ok --- estate/views/estate_property_views.xml | 42 ++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 4d54f8a4b7a..fdbfb6a43e7 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -20,14 +20,52 @@ + estate.property.form estate.property -
+ + +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + +
- From 302637d7811748e60b5f7f3e9942f1567c2b8865 Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 12:13:00 +0200 Subject: [PATCH 23/34] modified: estate/views/estate_property_views.xml search ok --- estate/views/estate_property_views.xml | 31 +++++++++++++++++--------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index fdbfb6a43e7..8588f771351 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -20,17 +20,7 @@ - + estate.property.form estate.property @@ -68,4 +58,23 @@ + + + estate.property.search + estate.property + + + + + + + + + + + + + + + From 08bddf26c5edd8591a372d9040a4220edc17e3fe Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 13:22:09 +0200 Subject: [PATCH 24/34] Chapter 6-end (group by ok) modified: estate/views/estate_property_views.xml --- estate/views/estate_property_views.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 8588f771351..37bdf4fe1f5 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -69,9 +69,9 @@ - - + + From e43ee0621db8d1d36ae7bbac32c94d6a68b6185e Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 13:39:51 +0200 Subject: [PATCH 25/34] Chapter 7 - property type base setup modified: __manifest__.py modified: models/__init__.py new file: models/estate_property_type.py modified: security/ir.model.access.csv modified: views/estate_menus.xml new file: views/estate_property_type_views.xml --- estate/__manifest__.py | 3 ++- estate/models/__init__.py | 2 +- 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 | 21 +++++++++++++++++++++ 6 files changed, 36 insertions(+), 2 deletions(-) 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 6bddf38f0b7..4899d1d1c75 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,13 +1,14 @@ { 'name': 'estate', 'depends': [ - 'base' + 'base', ], 'application': True, 'installable': True, '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..76e779e73b0 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1 @@ -from . import estate_property +from . import estate_property, estate_property_type diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py new file mode 100644 index 00000000000..e0d94d65068 --- /dev/null +++ b/estate/models/estate_property_type.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class EstatePropertyType(models.Model): + _name: str = "estate.property.type" + _description: str | None = None + + name: fields.Char = fields.Char() diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 6531f331708..7020102ce14 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,estate.property,model_estate_property,base.group_user,1,1,1,1 +access_estate_property_type,estate.property.type,model_estate_property_type,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index 5b85b27b63b..fcf70588915 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..44831ff92bf --- /dev/null +++ b/estate/views/estate_property_type_views.xml @@ -0,0 +1,21 @@ + + + + Estate action + estate.property.type + list,form + + + estate.property.type.form + estate.property.type + +
+ +

+ +

+
+
+
+
+
\ No newline at end of file From 185bcbca6d50f52365018f3925147c06fc13994d Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 13:53:24 +0200 Subject: [PATCH 26/34] 7 propert type in properti model + fix weird name in view modified: models/estate_property.py modified: views/estate_property_type_views.xml modified: views/estate_property_views.xml --- estate/models/estate_property.py | 1 + estate/views/estate_property_type_views.xml | 2 +- estate/views/estate_property_views.xml | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 4c5cecdeb49..13bdc545221 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -27,3 +27,4 @@ class EstateProperty(models.Model): [(word.lower(), word) for word in ["New", "Offer Received", "Offer Accepted", "Sold", "Cancelled"]], copy=False, default="new") + property_type_id = fields.Many2one("estate.property.type") diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml index 44831ff92bf..a1963fbf756 100644 --- a/estate/views/estate_property_type_views.xml +++ b/estate/views/estate_property_type_views.xml @@ -1,7 +1,7 @@ - Estate action + Properties types estate.property.type list,form diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 37bdf4fe1f5..ac1cd39162e 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,7 +1,7 @@ - Estate action + Properties estate.property list,form @@ -51,6 +51,7 @@ + @@ -70,6 +71,7 @@ + From a14c1bb458223275aef1845a03846219b023d6d0 Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 14:36:12 +0200 Subject: [PATCH 27/34] 7-adding many2many field modified: models/estate_property.py modified: views/estate_property_views.xml --- estate/models/estate_property.py | 4 ++++ estate/views/estate_property_views.xml | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 13bdc545221..936eb1aeb7f 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,3 +1,5 @@ +from collections import defaultdict + from odoo import fields, models from odoo.tools import date_utils @@ -28,3 +30,5 @@ class EstateProperty(models.Model): copy=False, default="new") property_type_id = fields.Many2one("estate.property.type") + salesperson_id = fields.Many2one("res.users", default=lambda self: self.env.uid) + buyer_id = fields.Many2one("res.partner", copy=False) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index ac1cd39162e..c5dd5f01ea5 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -54,6 +54,12 @@ + + + + + + From bd618778c4154d6fa88103a056424a347700368d Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 14:55:54 +0200 Subject: [PATCH 28/34] 7-tags creating view model +integration modified: __manifest__.py modified: models/__init__.py modified: models/estate_property.py new file: models/estate_property_tag.py modified: security/ir.model.access.csv modified: views/estate_menus.xml new file: views/estate_property_tag_views.xml modified: views/estate_property_views.xml --- estate/__manifest__.py | 1 + estate/models/__init__.py | 2 +- estate/models/estate_property.py | 1 + estate/models/estate_property_tag.py | 8 ++++++++ estate/security/ir.model.access.csv | 3 ++- estate/views/estate_menus.xml | 1 + estate/views/estate_property_tag_views.xml | 21 +++++++++++++++++++++ estate/views/estate_property_views.xml | 2 ++ 8 files changed, 37 insertions(+), 2 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 4899d1d1c75..703943303dd 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -9,6 +9,7 @@ '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 76e779e73b0..95039dab5e2 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1 @@ -from . import estate_property, estate_property_type +from . import estate_property, estate_property_tag, estate_property_type diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 936eb1aeb7f..95be2236a0e 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -32,3 +32,4 @@ class EstateProperty(models.Model): property_type_id = fields.Many2one("estate.property.type") salesperson_id = fields.Many2one("res.users", default=lambda self: self.env.uid) buyer_id = fields.Many2one("res.partner", copy=False) + tag_ids = fields.Many2many("estate.property.tag", string="Tags") diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py new file mode 100644 index 00000000000..dc72e52b2b6 --- /dev/null +++ b/estate/models/estate_property_tag.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class EstatePropertyTag(models.Model): + _name: str = "estate.property.tag" + _description: str | None = None + + name: fields.Char = fields.Char() diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 7020102ce14..f732cadc740 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,estate.property,model_estate_property,base.group_user,1,1,1,1 -access_estate_property_type,estate.property.type,model_estate_property_type,base.group_user,1,1,1,1 \ No newline at end of file +access_estate_property_type,estate.property.type,model_estate_property_type,base.group_user,1,1,1,1 +access_estate_property_tag,estate.property.tag,model_estate_property_tag,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index fcf70588915..42f194b10c9 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..cba93749e91 --- /dev/null +++ b/estate/views/estate_property_tag_views.xml @@ -0,0 +1,21 @@ + + + + Properties Tags + estate.property.tag + list,form + + + estate.property.tag + estate.property.tag + +
+ +

+ +

+
+
+
+
+
\ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index c5dd5f01ea5..b80e2e7d1af 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -17,6 +17,7 @@ + @@ -32,6 +33,7 @@ + From fd7edc78aadf9f4c607ff3aee64d8967ecdb1987 Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 15:38:39 +0200 Subject: [PATCH 29/34] Chapter 7 - end (one2many)wq modified: estate/__manifest__.py modified: estate/models/__init__.py modified: estate/models/estate_property.py new file: estate/models/estate_property_offer.py modified: estate/security/ir.model.access.csv new file: estate/views/estate_property_offer_views.xml modified: estate/views/estate_property_views.xml --- estate/__manifest__.py | 1 + estate/models/__init__.py | 7 +++- estate/models/estate_property.py | 1 + estate/models/estate_property_offer.py | 11 ++++++ estate/security/ir.model.access.csv | 3 +- estate/views/estate_property_offer_views.xml | 40 ++++++++++++++++++++ estate/views/estate_property_views.xml | 5 +++ 7 files changed, 66 insertions(+), 2 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 703943303dd..413e5dbd31a 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -8,6 +8,7 @@ 'data': [ 'security/ir.model.access.csv', 'views/estate_property_views.xml', + 'views/estate_property_offer_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 95039dab5e2..3683ff97b61 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1,6 @@ -from . import estate_property, estate_property_tag, estate_property_type +from . import ( + estate_property, + estate_property_offer, + estate_property_tag, + estate_property_type, +) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 95be2236a0e..0630f6545ed 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -33,3 +33,4 @@ class EstateProperty(models.Model): salesperson_id = fields.Many2one("res.users", default=lambda self: self.env.uid) buyer_id = fields.Many2one("res.partner", copy=False) tag_ids = fields.Many2many("estate.property.tag", string="Tags") + offer_ids = fields.One2many("estate.property.offer", "property_id") diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py new file mode 100644 index 00000000000..f76f4374ead --- /dev/null +++ b/estate/models/estate_property_offer.py @@ -0,0 +1,11 @@ +from odoo import fields, models + + +class EstatePropertyOffer(models.Model): + _name: str = "estate.property.offer" + _description: str | None = None + + price: fields.Float = fields.Float() + status: fields.Selection = fields.Selection([(word.lower(), word) for word in ['Accepted', 'Refused']], copy=False) + partner_id = fields.Many2one("res.partner", required=True) + property_id = fields.Many2one("estate.property", required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index f732cadc740..4e660d26253 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,4 +1,5 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink access_estate_property,estate.property,model_estate_property,base.group_user,1,1,1,1 access_estate_property_type,estate.property.type,model_estate_property_type,base.group_user,1,1,1,1 -access_estate_property_tag,estate.property.tag,model_estate_property_tag,base.group_user,1,1,1,1 \ No newline at end of file +access_estate_property_tag,estate.property.tag,model_estate_property_tag,base.group_user,1,1,1,1 +access_estate_property_offer,estate.property.offer,model_estate_property_offer,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml new file mode 100644 index 00000000000..064cf0f19a7 --- /dev/null +++ b/estate/views/estate_property_offer_views.xml @@ -0,0 +1,40 @@ + + + + Properties + estate.property.offer + list,form + + + + estate.property.offer.list + estate.property.offer + + + + + + + + + + + + estate.property.form + estate.property.offer + +
+ + + + + + + + + + +
+
+
+
diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index b80e2e7d1af..f538d85e226 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -56,6 +56,11 @@
+ + + + + From 70ceb5cb27b6077debc845ed4fd3cbf6a5797029 Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 15:52:43 +0200 Subject: [PATCH 30/34] Chapter 8 - start 8.1 - totalarea modified: estate/models/estate_property.py modified: estate/views/estate_property_views.xml --- estate/models/estate_property.py | 10 +++++++--- estate/views/estate_property_views.xml | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 0630f6545ed..b9710a158c1 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,6 +1,4 @@ -from collections import defaultdict - -from odoo import fields, models +from odoo import api, fields, models from odoo.tools import date_utils @@ -34,3 +32,9 @@ class EstateProperty(models.Model): buyer_id = fields.Many2one("res.partner", copy=False) tag_ids = fields.Many2many("estate.property.tag", string="Tags") offer_ids = fields.One2many("estate.property.offer", "property_id") + total_area = fields.Integer(compute='_compute_total_area') + + @api.depends('garden_area', 'living_area') + def _compute_total_area(self): + for record in self: + record.total_area = record.living_area + record.garden_area diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index f538d85e226..7bfde78f345 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -54,6 +54,7 @@ + From 50d8700757b690b8e41f943331f63a0320956daa Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 16:02:03 +0200 Subject: [PATCH 31/34] 8.2 (best price) modified: estate/models/estate_property.py modified: estate/views/estate_property_views.xml --- estate/models/estate_property.py | 6 ++++++ estate/views/estate_property_views.xml | 1 + 2 files changed, 7 insertions(+) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index b9710a158c1..65737ec6557 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -33,8 +33,14 @@ class EstateProperty(models.Model): tag_ids = fields.Many2many("estate.property.tag", string="Tags") offer_ids = fields.One2many("estate.property.offer", "property_id") total_area = fields.Integer(compute='_compute_total_area') + best_price = fields.Float(compute='_compute_best_price') @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('offer_ids.price') + def _compute_best_price(self): + for record in self: + record.best_price = max([offer.price for offer in record.offer_ids] + [0]) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 7bfde78f345..203245ce7ce 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -39,6 +39,7 @@ + From 8c744dba4eedde9a8b1ce4bad59b334e0db51819 Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 16:56:50 +0200 Subject: [PATCH 32/34] Inverse 8.3 modified: estate/models/estate_property_offer.py modified: estate/views/estate_property_offer_views.xml --- estate/models/estate_property_offer.py | 16 +++++++++++++++- estate/views/estate_property_offer_views.xml | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index f76f4374ead..5a9c7753b8a 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,4 +1,7 @@ -from odoo import fields, models +import logging + +from odoo import api, fields, models +from odoo.tools import date_utils class EstatePropertyOffer(models.Model): @@ -9,3 +12,14 @@ class EstatePropertyOffer(models.Model): status: fields.Selection = fields.Selection([(word.lower(), word) for word in ['Accepted', 'Refused']], copy=False) partner_id = fields.Many2one("res.partner", required=True) property_id = fields.Many2one("estate.property", required=True) + date_deadline: fields.Date = fields.Date(compute='_compute_date_deadline', inverse='_inverse_date_deadline') + validity = fields.Integer() + + @api.depends('validity') + def _compute_date_deadline(self): + for offer in self: + offer.date_deadline = date_utils.add(fields.Date.today(), days=offer.validity) + + def _inverse_date_deadline(self): + for offer in self: + offer.validity = (offer.date_deadline - fields.Date.today()).days diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 064cf0f19a7..9cacd569c60 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -31,6 +31,8 @@ + + From 2a60c14aa256811540647315b907a35895506f85 Mon Sep 17 00:00:00 2001 From: Surap Date: Thu, 17 Sep 2026 17:06:41 +0200 Subject: [PATCH 33/34] 8.4 - onchange modified: estate/models/estate_property.py --- estate/models/estate_property.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 65737ec6557..904c36a950f 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -44,3 +44,12 @@ def _compute_total_area(self): def _compute_best_price(self): for record in self: record.best_price = max([offer.price for offer in record.offer_ids] + [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 = None From 471ac5e73de85ed77d49ce2ccd63316ae0a31dc7 Mon Sep 17 00:00:00 2001 From: Surap Date: Fri, 18 Sep 2026 09:43:33 +0200 Subject: [PATCH 34/34] Chapter 9 - full modified: estate/models/estate_property.py modified: estate/models/estate_property_offer.py modified: estate/views/estate_property_offer_views.xml modified: estate/views/estate_property_views.xml --- estate/models/estate_property.py | 17 +++++++++++++++++ estate/models/estate_property_offer.py | 8 ++++++++ estate/views/estate_property_offer_views.xml | 4 ++++ estate/views/estate_property_views.xml | 4 ++++ 4 files changed, 33 insertions(+) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 904c36a950f..dc7a41a11fd 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,5 @@ from odoo import api, fields, models +from odoo.exceptions import UserError from odoo.tools import date_utils @@ -53,3 +54,19 @@ def _onchange_garden(self): else: self.garden_area = 0 self.garden_orientation = None + + def _check_state_compatibility_because(self, record, state, message): + if record.state == state: + raise UserError(message) + + def sell(self): + for record in self: + self._check_state_compatibility_because(record, "cancelled", "Canceled property can not be sold") + record.state = "sold" + return True + + def cancel(self): + for record in self: + self._check_state_compatibility_because(record, "sold", "Sold property can not be canceld") + record.state = "cancelled" + return True diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index 5a9c7753b8a..87f1809dfad 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -23,3 +23,11 @@ def _compute_date_deadline(self): def _inverse_date_deadline(self): for offer in self: offer.validity = (offer.date_deadline - fields.Date.today()).days + + def accept(self): + self.status = "accepted" + self.property_id.buyer_id = self.partner_id + self.property_id.selling_price = self.price + + def deny(self): + self.status = "refused" diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 9cacd569c60..3127599f96a 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -15,6 +15,9 @@ +