From 4ddd84326bd88c0e386964b9bac0e49d107c7607 Mon Sep 17 00:00:00 2001 From: "Marceline (matho)" Date: Fri, 14 Aug 2026 13:25:04 +0200 Subject: [PATCH 1/7] [IMP] estate: chapter 2 --- estate/__init__.py | 0 estate/__manifest__.py | 14 ++++++++++++++ 2 files changed, 14 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..2883d4ec4f7 --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,14 @@ +{ + 'name': "My super Real Estate App", + 'version': '1.0', + 'depends': ['base'], + 'author': "matho", + 'description': """ + Voici ma nouvelle application + """, + 'application': True, + 'installable': True, + # data files always loaded at installation + 'data': [], + # data files containing optionally loaded demonstration data +} From ba16db04e00c9fe3850511465d3b6155250d8e6a Mon Sep 17 00:00:00 2001 From: "Marceline (matho)" Date: Fri, 14 Aug 2026 14:20:19 +0200 Subject: [PATCH 2/7] [IMP] chapter 3 --- estate/__init__.py | 1 + estate/models/__init__.py | 1 + estate/models/estate_property.py | 27 +++++++++++++++++++++++++++ 3 files changed, 29 insertions(+) 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/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..c88c795c1ef --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,27 @@ +from odoo import fields, models + +class EstateProperty(models.Model): + _name = "estate.property" + _description = "Real Estate Property" + + name = fields.Char(required=True) + description = fields.Text() + postcode = fields.Char() + date_availability = fields.Date() + expected_price = fields.Float(required=True) + 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='Garden Orientation', + selection=[ + ('north', 'North'), + ('south', 'South'), + ('east', 'East'), + ('west', 'West') + ], + help='Orientation of the garden') \ No newline at end of file From 3dca57f80396d484c4161deb0ff4a6bb5ee5c258 Mon Sep 17 00:00:00 2001 From: "Marceline (matho)" Date: Fri, 14 Aug 2026 15:21:29 +0200 Subject: [PATCH 3/7] [IMP] chapter 4 --- estate/__manifest__.py | 5 ++++- estate/data/estate.csv | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 estate/data/estate.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 2883d4ec4f7..655685b111d 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -9,6 +9,9 @@ 'application': True, 'installable': True, # data files always loaded at installation - 'data': [], + 'data': [ + 'data/estate.csv', + ], + 'license': 'LGPL-3', # data files containing optionally loaded demonstration data } diff --git a/estate/data/estate.csv b/estate/data/estate.csv new file mode 100644 index 00000000000..26ccb335f42 --- /dev/null +++ b/estate/data/estate.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +estate.access_estate_property,access_estate_property,estate.model_estate_property,base.group_user,1,0,0,0 From 286675d58378ec6a0833ff88e0a41e170f906faf Mon Sep 17 00:00:00 2001 From: "Marceline (matho)" Date: Fri, 14 Aug 2026 16:18:22 +0200 Subject: [PATCH 4/7] [WIP] chapter 5 --- estate/__manifest__.py | 4 +++- estate/models/estate_property.py | 22 +++++++++++++++---- .../ir.model.access.csv} | 2 +- estate/views/estate_menus.xml | 8 +++++++ estate/views/estate_property_views.xml | 8 +++++++ 5 files changed, 38 insertions(+), 6 deletions(-) rename estate/{data/estate.csv => security/ir.model.access.csv} (76%) create mode 100644 estate/views/estate_menus.xml create mode 100644 estate/views/estate_property_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 655685b111d..01d3070fc61 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -10,7 +10,9 @@ 'installable': True, # data files always loaded at installation 'data': [ - 'data/estate.csv', + 'security/ir.model.access.csv', + 'views/estate_property_views.xml', + 'views/estate_menus.xml', ], 'license': 'LGPL-3', # data files containing optionally loaded demonstration data diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index c88c795c1ef..251e714eb16 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -7,10 +7,10 @@ class EstateProperty(models.Model): name = fields.Char(required=True) description = fields.Text() postcode = fields.Char() - date_availability = fields.Date() + date_availability = fields.Date(copy=False) expected_price = fields.Float(required=True) - selling_price = fields.Float() - bedrooms = fields.Integer() + selling_price = fields.Float(readonly=True, copy=False) + bedrooms = fields.Integer(default=2) living_area = fields.Integer() facades = fields.Integer() garage = fields.Boolean() @@ -24,4 +24,18 @@ class EstateProperty(models.Model): ('east', 'East'), ('west', 'West') ], - help='Orientation of the garden') \ No newline at end of file + help='Orientation of the garden') + state = fields.Selection( + string='Status', + selection=[ + ('new', 'New'), + ('offer_received', 'Offer Received'), + ('offer_accepted', 'Offer Accepted'), + ('sold', 'Sold'), + ('cancelled', 'Cancelled') + ], + required=True, + copy=False, + default='new' + ) + diff --git a/estate/data/estate.csv b/estate/security/ir.model.access.csv similarity index 76% rename from estate/data/estate.csv rename to estate/security/ir.model.access.csv index 26ccb335f42..98f4671fb0d 100644 --- a/estate/data/estate.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 -estate.access_estate_property,access_estate_property,estate.model_estate_property,base.group_user,1,0,0,0 +estate.access_estate_property,access_estate_property,estate.model_estate_property,base.group_user,1,1,1,1 diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml new file mode 100644 index 00000000000..1a70bf05183 --- /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 new file mode 100644 index 00000000000..0119f8f5ffc --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,8 @@ + + + + Estate Properties + estate.property + list,form + + \ No newline at end of file From 81570f0fec3b379edd1d13306f59f80568ff2984 Mon Sep 17 00:00:00 2001 From: "Marceline (matho)" Date: Fri, 21 Aug 2026 09:24:20 +0200 Subject: [PATCH 5/7] chapter 6 --- estate/views/estate_property_views.xml | 60 +++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 0119f8f5ffc..e0d5088a546 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,8 +1,58 @@ - - Estate Properties - estate.property - list,form - + + Estate Properties + estate.property + list,form + + + + estate.property.list + estate.property + + + + + + + + + + + + + + + estate.property.form + estate.property + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
\ No newline at end of file From 45c32aeba0114dde220c262351f66a22e2af8eff Mon Sep 17 00:00:00 2001 From: "Marceline (matho)" Date: Wed, 26 Aug 2026 15:28:24 +0200 Subject: [PATCH 6/7] [WIP] chapter 7 --- estate/__manifest__.py | 2 ++ estate/models/__init__.py | 4 +++- estate/models/estate_property.py | 3 +++ estate/models/property_tag.py | 7 ++++++ estate/models/property_type.py | 7 ++++++ estate/security/ir.model.access.csv | 2 ++ estate/views/estate_menus.xml | 8 +++++-- estate/views/estate_property_views.xml | 18 +++++++++++---- estate/views/property_tag_views.xml | 32 ++++++++++++++++++++++++++ estate/views/property_type_views.xml | 32 ++++++++++++++++++++++++++ 10 files changed, 107 insertions(+), 8 deletions(-) create mode 100644 estate/models/property_tag.py create mode 100644 estate/models/property_type.py create mode 100644 estate/views/property_tag_views.xml create mode 100644 estate/views/property_type_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 01d3070fc61..76e7cea20bc 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -12,6 +12,8 @@ 'data': [ 'security/ir.model.access.csv', 'views/estate_property_views.xml', + 'views/property_type_views.xml', + 'views/property_tag_views.xml', 'views/estate_menus.xml', ], 'license': 'LGPL-3', diff --git a/estate/models/__init__.py b/estate/models/__init__.py index f4c8fd6db6d..e58b0a372ef 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1,3 @@ -from . import estate_property \ No newline at end of file +from . import estate_property +from . import property_type +from . import property_tag \ No newline at end of file diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 251e714eb16..1e62286ec08 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -38,4 +38,7 @@ class EstateProperty(models.Model): copy=False, default='new' ) + property_type_id = fields.Many2one('property.type', string='Property Type') + tag_ids = fields.Many2many('property.tag', string='Property Tags') + diff --git a/estate/models/property_tag.py b/estate/models/property_tag.py new file mode 100644 index 00000000000..36a3054dbe1 --- /dev/null +++ b/estate/models/property_tag.py @@ -0,0 +1,7 @@ +from odoo import fields, models + +class PropertyTag(models.Model): + _name = "property.tag" + _description = "Property Tag" + + name = fields.Char(required=True) diff --git a/estate/models/property_type.py b/estate/models/property_type.py new file mode 100644 index 00000000000..96890d99e4a --- /dev/null +++ b/estate/models/property_type.py @@ -0,0 +1,7 @@ +from odoo import fields, models + +class PropertyType(models.Model): + _name = "property.type" + _description = "Property Type" + + name = fields.Char(required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 98f4671fb0d..215f9ccd5ba 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,2 +1,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink estate.access_estate_property,access_estate_property,estate.model_estate_property,base.group_user,1,1,1,1 +estate.access_property_type,access_property_type,estate.model_property_type,base.group_user,1,1,1,1 +estate.access_property_tag,access_property_tag,estate.model_property_tag,base.group_user,1,1,1,1 diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index 1a70bf05183..eea33f19ed2 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -1,8 +1,12 @@ - - + + + + + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index e0d5088a546..f8dc72626b9 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -22,7 +22,7 @@ - + estate.property.form estate.property @@ -30,10 +30,18 @@ - - - - + + + + + + + + + + + + diff --git a/estate/views/property_tag_views.xml b/estate/views/property_tag_views.xml new file mode 100644 index 00000000000..92b90334cfe --- /dev/null +++ b/estate/views/property_tag_views.xml @@ -0,0 +1,32 @@ + + + + Property Tags + property.tag + list,form + + + + property.tag.list + property.tag + + + + + + + + + property.tag.form + property.tag + +
+ + + + + +
+
+
+
\ No newline at end of file diff --git a/estate/views/property_type_views.xml b/estate/views/property_type_views.xml new file mode 100644 index 00000000000..c0d9e40b118 --- /dev/null +++ b/estate/views/property_type_views.xml @@ -0,0 +1,32 @@ + + + + Property Types + property.type + list,form + + + + property.type.list + property.type + + + + + + + + + property.type.form + property.type + +
+ + + + + +
+
+
+
\ No newline at end of file From c0e62909f716c9ab6dbf74fc6202de2e4bea9883 Mon Sep 17 00:00:00 2001 From: "Marceline (matho)" Date: Wed, 26 Aug 2026 16:34:38 +0200 Subject: [PATCH 7/7] [WIP] chapter 8 --- estate/models/__init__.py | 3 ++- estate/models/estate_property.py | 12 ++++++++++-- estate/models/property_offer.py | 18 ++++++++++++++++++ estate/security/ir.model.access.csv | 1 + estate/views/estate_property_views.xml | 1 + 5 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 estate/models/property_offer.py diff --git a/estate/models/__init__.py b/estate/models/__init__.py index e58b0a372ef..b76fdcf686e 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,3 +1,4 @@ from . import estate_property from . import property_type -from . import property_tag \ No newline at end of file +from . import property_tag +from . import property_offer \ No newline at end of file diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 1e62286ec08..02194402f19 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 api, fields, models class EstateProperty(models.Model): _name = "estate.property" @@ -11,11 +11,12 @@ class EstateProperty(models.Model): expected_price = fields.Float(required=True) selling_price = fields.Float(readonly=True, copy=False) bedrooms = fields.Integer(default=2) - living_area = fields.Integer() facades = fields.Integer() garage = fields.Boolean() garden = fields.Boolean() + living_area = fields.Integer() garden_area = fields.Integer() + total_area = fields.Integer(compute='_compute_total_area') garden_orientation = fields.Selection( string='Garden Orientation', selection=[ @@ -40,5 +41,12 @@ class EstateProperty(models.Model): ) property_type_id = fields.Many2one('property.type', string='Property Type') tag_ids = fields.Many2many('property.tag', string='Property Tags') + offer_ids = fields.One2many('property.offer', 'property_id', string='Offers') + + @api.depends('living_area', 'garden_area') + def _compute_total_area(self): + for record in self: + record.total_area = record.living_area + record.garden_area + diff --git a/estate/models/property_offer.py b/estate/models/property_offer.py new file mode 100644 index 00000000000..1f7ca2610a4 --- /dev/null +++ b/estate/models/property_offer.py @@ -0,0 +1,18 @@ +from odoo import fields, models + +class PropertyOffer(models.Model): + _name = "property.offer" + _description = "Property Offer" + + name = fields.Char(required=True) + property_id = fields.Many2one('estate.property', string='Property') + price = fields.Float(required=True) + status = fields.Selection( + string='Status', + selection=[ + ('accepted', 'Accepted'), + ('refused', 'Refused') + ], + copy=False, + ) + partner_id = fields.Many2one('res.partner', string='Partner') diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 215f9ccd5ba..c2349003e63 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -2,3 +2,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink estate.access_estate_property,access_estate_property,estate.model_estate_property,base.group_user,1,1,1,1 estate.access_property_type,access_property_type,estate.model_property_type,base.group_user,1,1,1,1 estate.access_property_tag,access_property_tag,estate.model_property_tag,base.group_user,1,1,1,1 +estate.access_property_offer,access_property_offer,estate.model_property_offer,base.group_user,1,1,1,1 diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index f8dc72626b9..87686e587b0 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -55,6 +55,7 @@ +