From 0df9ae83e17e5183d702e1d568b9c81d5c55f7b8 Mon Sep 17 00:00:00 2001 From: plha-odoo Date: Mon, 20 Jan 2025 14:43:42 +0100 Subject: [PATCH 01/12] [ADD] first commit of the tutorials of the onboarding --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a0158d919e..033e2b5c41 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Odoo tutorials - +test This repository hosts the code for the bases of the modules used in the [official Odoo tutorials](https://www.odoo.com/documentation/latest/developer/tutorials.html). From 3c8218bb4320ce3ec92fc00c94a6de0082e41128 Mon Sep 17 00:00:00 2001 From: plha-odoo Date: Tue, 21 Jan 2025 14:34:57 +0100 Subject: [PATCH 02/12] [ADD] chap 2 et chap3 du tuto --- estate/__init__.py | 1 + estate/__manifest__.py | 7 +++++++ estate/models/__init__.py | 1 + estate/models/estate_property.py | 20 ++++++++++++++++++++ 4 files changed, 29 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 0000000000..9a7e03eded --- /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 0000000000..957cd40654 --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,7 @@ +{ 'name': 'real estate app plh', + 'depends': [ + 'base',], + '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 0000000000..f4c8fd6db6 --- /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 0000000000..b99a0610b7 --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,20 @@ +from odoo import fields, models + +class EstateProperty(models.Model): + _name = "estate.property" + _description = "reals estate properties" + + name = fields.Char('Property Name',required=True) + description = fields.Text('The Descritption') + 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([("North","North"),("South","South"),("East","East"),("West","West")]) + From 96643d564494328af8205e9b0c6b27062757937d Mon Sep 17 00:00:00 2001 From: plha-odoo Date: Tue, 21 Jan 2025 17:29:45 +0100 Subject: [PATCH 03/12] [ADD] commit for chapter 4 --- estate/__manifest__.py | 3 +++ estate/security/ir.model.access.csv | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 957cd40654..97d00f6711 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -2,6 +2,9 @@ 'depends': [ 'base',], 'application': True, + 'data':[ + 'security/ir.model.access.csv' + ] } \ No newline at end of file diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 0000000000..b5005de0d9 --- /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 +estate.access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file From 455e8d958019c4199fbb93735ba056052eff05b9 Mon Sep 17 00:00:00 2001 From: plha-odoo Date: Wed, 22 Jan 2025 14:26:32 +0100 Subject: [PATCH 04/12] [ADD] Chapter 5 of the tutorial --- estate/.vscode/settings.json | 3 +++ estate/__manifest__.py | 6 +++--- estate/models/estate_property.py | 10 ++++++---- estate/views/estate_menus.xml | 12 ++++++++++++ estate/views/estate_property_views.xml | 8 ++++++++ 5 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 estate/.vscode/settings.json create mode 100644 estate/views/estate_menus.xml create mode 100644 estate/views/estate_property_views.xml diff --git a/estate/.vscode/settings.json b/estate/.vscode/settings.json new file mode 100644 index 0000000000..ff5300ef48 --- /dev/null +++ b/estate/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.languageServer": "None" +} \ No newline at end of file diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 97d00f6711..1bd452138e 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -3,8 +3,8 @@ 'base',], 'application': True, 'data':[ - 'security/ir.model.access.csv' + 'security/ir.model.access.csv', + 'views/estate_property_views.xml', + 'views/estate_menus.xml' ] - - } \ No newline at end of file diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index b99a0610b7..a6dfdcc084 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,5 @@ from odoo import fields, models +from datetime import date, timedelta class EstateProperty(models.Model): _name = "estate.property" @@ -7,14 +8,15 @@ class EstateProperty(models.Model): name = fields.Char('Property Name',required=True) description = fields.Text('The Descritption') postcode = fields.Char() - date_availability = fields.Date() + date_availability = fields.Date(default=date.today()+ timedelta(days=90),copy=False) expected_price = fields.Float(required=True) - selling_price = fields.Float() - bedrooms = fields.Integer() + selling_price = fields.Float(copy=False,readonly=True) + bedrooms = fields.Integer(default=2) living_area = fields.Integer() facades = fields.Integer() garage = fields.Boolean() garden = fields.Boolean() garden_area= fields.Integer() garden_orientation = fields.Selection([("North","North"),("South","South"),("East","East"),("West","West")]) - + active = fields.Boolean(default=True) + state = fields.Selection([("New","New"),("Offer Received","Offer Received"),("Offer Accpeted","Offer Accepted"),("Solde","Solde"),("Cancelled","Cancelled")],copy=False,default="New") \ No newline at end of file diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml new file mode 100644 index 0000000000..7d29307a90 --- /dev/null +++ b/estate/views/estate_menus.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml new file mode 100644 index 0000000000..0004e7c8b9 --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,8 @@ + + + + View properties + estate.property + kanban,list,form + + \ No newline at end of file From 686616c98cb7dc88627362eef240381f590d4e1b Mon Sep 17 00:00:00 2001 From: plha-odoo Date: Thu, 23 Jan 2025 13:53:55 +0100 Subject: [PATCH 05/12] [ADD] chap 6 of the tutorials --- estate/__manifest__.py | 8 ++- estate/models/property_type.py | 0 estate/views/estate_form_view.xml | 51 +++++++++++++++++++ estate/views/estate_list_view.xml | 24 +++++++++ ...s.xml => estate_property_views_action.xml} | 0 estate/views/estate_search_view.xml | 31 +++++++++++ 6 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 estate/models/property_type.py create mode 100644 estate/views/estate_form_view.xml create mode 100644 estate/views/estate_list_view.xml rename estate/views/{estate_property_views.xml => estate_property_views_action.xml} (100%) create mode 100644 estate/views/estate_search_view.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 1bd452138e..d4d2a065f5 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -4,7 +4,11 @@ 'application': True, 'data':[ 'security/ir.model.access.csv', - 'views/estate_property_views.xml', - 'views/estate_menus.xml' + 'views/estate_property_views_action.xml', + 'views/estate_menus.xml', + 'views/estate_list_view.xml', + 'views/estate_form_view.xml', + 'views/estate_search_view.xml', + ] } \ No newline at end of file diff --git a/estate/models/property_type.py b/estate/models/property_type.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/estate/views/estate_form_view.xml b/estate/views/estate_form_view.xml new file mode 100644 index 0000000000..66e1b2110b --- /dev/null +++ b/estate/views/estate_form_view.xml @@ -0,0 +1,51 @@ + + + + estate.property.view.form + estate.property + form + +
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
\ No newline at end of file diff --git a/estate/views/estate_list_view.xml b/estate/views/estate_list_view.xml new file mode 100644 index 0000000000..34c535d2f8 --- /dev/null +++ b/estate/views/estate_list_view.xml @@ -0,0 +1,24 @@ + + + + estate.property.view.list + estate.property + list + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views_action.xml similarity index 100% rename from estate/views/estate_property_views.xml rename to estate/views/estate_property_views_action.xml diff --git a/estate/views/estate_search_view.xml b/estate/views/estate_search_view.xml new file mode 100644 index 0000000000..9bc7e4fd56 --- /dev/null +++ b/estate/views/estate_search_view.xml @@ -0,0 +1,31 @@ + + + + estate.property.view.search + estate.property + search + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 46ce22fb515a4ee32741679d1cec7a6c1729bc24 Mon Sep 17 00:00:00 2001 From: plha-odoo Date: Mon, 27 Jan 2025 11:12:24 +0100 Subject: [PATCH 06/12] [ADD] chapter 7 of the tutorials --- estate/__manifest__.py | 11 +++- estate/models/__init__.py | 5 +- estate/models/estate_property.py | 7 ++- estate/models/property_offer.py | 14 +++++ estate/models/property_tag.py | 9 ++++ estate/models/property_type.py | 10 ++++ estate/security/ir.model.access.csv | 5 +- estate/views/estate_form_view.xml | 28 +++++++--- estate/views/estate_list_view.xml | 7 ++- estate/views/estate_menus.xml | 10 ++-- estate/views/estate_property_views_action.xml | 4 +- estate/views/estate_search_view.xml | 6 ++- estate/views/offer_actions.xml | 8 +++ estate/views/offer_menus.xml | 10 ++++ estate/views/offer_views.xml | 53 +++++++++++++++++++ estate/views/tag_actions.xml | 8 +++ estate/views/tag_menus.xml | 10 ++++ estate/views/tag_views.xml | 47 ++++++++++++++++ estate/views/type_actions.xml | 8 +++ estate/views/type_menus.xml | 10 ++++ estate/views/type_views.xml | 53 +++++++++++++++++++ 21 files changed, 303 insertions(+), 20 deletions(-) create mode 100644 estate/models/property_offer.py create mode 100644 estate/models/property_tag.py create mode 100644 estate/views/offer_actions.xml create mode 100644 estate/views/offer_menus.xml create mode 100644 estate/views/offer_views.xml create mode 100644 estate/views/tag_actions.xml create mode 100644 estate/views/tag_menus.xml create mode 100644 estate/views/tag_views.xml create mode 100644 estate/views/type_actions.xml create mode 100644 estate/views/type_menus.xml create mode 100644 estate/views/type_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index d4d2a065f5..19f0827988 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -9,6 +9,15 @@ 'views/estate_list_view.xml', 'views/estate_form_view.xml', 'views/estate_search_view.xml', + 'views/type_actions.xml', + 'views/type_menus.xml', + 'views/type_views.xml', + 'views/tag_actions.xml', + 'views/tag_menus.xml', + 'views/tag_views.xml', + # 'views/offer_actions.xml', + # 'views/offer_menus.xml', + 'views/offer_views.xml', ] - } \ No newline at end of file + } diff --git a/estate/models/__init__.py b/estate/models/__init__.py index f4c8fd6db6..fc7779d569 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1,4 @@ -from . import estate_property \ No newline at end of file +from . import estate_property +from . import property_type +from . import property_tag +from . import property_offer diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index a6dfdcc084..a4ff0be557 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -6,6 +6,11 @@ class EstateProperty(models.Model): _description = "reals estate properties" name = fields.Char('Property Name',required=True) + offer_ids=fields.One2many("estate.property.offer","property_id",string="Offers Received") + tag_ids=fields.Many2many("estate.property.tags",string="Tags") + buyer_id=fields.Many2one("res.partner",string="Buyer") + salesperson_id=fields.Many2one("res.users",string="Sales Person",default=lambda self: self.env.user) + property_type_id = fields.Many2one("estate.property.types", string="Property Type") description = fields.Text('The Descritption') postcode = fields.Char() date_availability = fields.Date(default=date.today()+ timedelta(days=90),copy=False) @@ -19,4 +24,4 @@ class EstateProperty(models.Model): garden_area= fields.Integer() garden_orientation = fields.Selection([("North","North"),("South","South"),("East","East"),("West","West")]) active = fields.Boolean(default=True) - state = fields.Selection([("New","New"),("Offer Received","Offer Received"),("Offer Accpeted","Offer Accepted"),("Solde","Solde"),("Cancelled","Cancelled")],copy=False,default="New") \ No newline at end of file + state = fields.Selection([("New","New"),("Offer Received","Offer Received"),("Offer Accpeted","Offer Accepted"),("Solde","Solde"),("Cancelled","Cancelled")],copy=False,default="New") diff --git a/estate/models/property_offer.py b/estate/models/property_offer.py new file mode 100644 index 0000000000..64a35a2d3a --- /dev/null +++ b/estate/models/property_offer.py @@ -0,0 +1,14 @@ +from odoo import fields, models +from datetime import date, timedelta + +class EstatePropertyOffer(models.Model): + _name = "estate.property.offer" + _description = "reals estate properties offer" + + property_type_id= fields.Char('Property Offer ID') + price = fields.Float('Le Prix') + status = fields.Selection([("Accepted","Accepted"),("Refused","Refused")],copy=False) + partner_id=fields.Many2one("res.partner",required=True) + property_id=fields.Many2one("estate.property",required=True) + + # properties = fields.One2many("estate.property","property_type_id",string="properties") diff --git a/estate/models/property_tag.py b/estate/models/property_tag.py new file mode 100644 index 0000000000..b4c0290d8d --- /dev/null +++ b/estate/models/property_tag.py @@ -0,0 +1,9 @@ +from odoo import fields, models +from datetime import date, timedelta + +class EstatePropertyType(models.Model): + _name = "estate.property.tags" + _description = "common characteristics of the properties" + + name = fields.Char('Property Tag Name',required=True) + properties = fields.Many2many("estate.property","tag_ids",string="properties") diff --git a/estate/models/property_type.py b/estate/models/property_type.py index e69de29bb2..94c76c1f49 100644 --- a/estate/models/property_type.py +++ b/estate/models/property_type.py @@ -0,0 +1,10 @@ +from odoo import fields, models +from datetime import date, timedelta + +class EstatePropertyType(models.Model): + _name = "estate.property.types" + _description = "reals estate properties" + + name = fields.Char('Property Type Name',required=True) + property_type_id= fields.Char('Property Type ID',required=True) + properties = fields.One2many("estate.property","property_type_id",string="properties") diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index b5005de0d9..6522af7163 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 -estate.access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file +estate.access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 +estate.access_estate_property_types,access_estate_property_types,model_estate_property_types,base.group_user,1,1,1,1 +estate.access_estate_property_tags,access_estate_property_tags,model_estate_property_tags,base.group_user,1,1,1,1 +estate.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_form_view.xml b/estate/views/estate_form_view.xml index 66e1b2110b..eb5d639e51 100644 --- a/estate/views/estate_form_view.xml +++ b/estate/views/estate_form_view.xml @@ -7,12 +7,11 @@
-
-

- -

-
+ + + + @@ -32,7 +31,11 @@ + + + + @@ -42,10 +45,23 @@ + + + + + + + + + + + + +
- \ No newline at end of file + diff --git a/estate/views/estate_list_view.xml b/estate/views/estate_list_view.xml index 34c535d2f8..a35f9ab8bc 100644 --- a/estate/views/estate_list_view.xml +++ b/estate/views/estate_list_view.xml @@ -8,6 +8,11 @@ + + + + + @@ -21,4 +26,4 @@ - \ No newline at end of file + diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index 7d29307a90..fc134e58b0 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -1,12 +1,10 @@ - - + + - - - + - \ No newline at end of file + diff --git a/estate/views/estate_property_views_action.xml b/estate/views/estate_property_views_action.xml index 0004e7c8b9..62911dfe34 100644 --- a/estate/views/estate_property_views_action.xml +++ b/estate/views/estate_property_views_action.xml @@ -3,6 +3,6 @@ View properties estate.property - kanban,list,form + list,kanban,form - \ No newline at end of file + diff --git a/estate/views/estate_search_view.xml b/estate/views/estate_search_view.xml index 9bc7e4fd56..1296cb79ae 100644 --- a/estate/views/estate_search_view.xml +++ b/estate/views/estate_search_view.xml @@ -8,17 +8,21 @@ + + + + @@ -28,4 +32,4 @@ - \ No newline at end of file + diff --git a/estate/views/offer_actions.xml b/estate/views/offer_actions.xml new file mode 100644 index 0000000000..fca4864bad --- /dev/null +++ b/estate/views/offer_actions.xml @@ -0,0 +1,8 @@ + + + + View property Offer + estate.property.offer + list,form + + diff --git a/estate/views/offer_menus.xml b/estate/views/offer_menus.xml new file mode 100644 index 0000000000..71abb34b40 --- /dev/null +++ b/estate/views/offer_menus.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/estate/views/offer_views.xml b/estate/views/offer_views.xml new file mode 100644 index 0000000000..866517e624 --- /dev/null +++ b/estate/views/offer_views.xml @@ -0,0 +1,53 @@ + + + + + + estate.offer.view.list + estate.property.offer + list + + + + + + + + + + + + + + + estate.offer.view.form + estate.property.offer + form + +
+ + + + + + + + +
+
+
+ + + + estate.offer.view.search + estate.property.offer + search + + + + + + + + +
diff --git a/estate/views/tag_actions.xml b/estate/views/tag_actions.xml new file mode 100644 index 0000000000..56ca171157 --- /dev/null +++ b/estate/views/tag_actions.xml @@ -0,0 +1,8 @@ + + + + View property Tags + estate.property.tags + list,form + + diff --git a/estate/views/tag_menus.xml b/estate/views/tag_menus.xml new file mode 100644 index 0000000000..18437320ee --- /dev/null +++ b/estate/views/tag_menus.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/estate/views/tag_views.xml b/estate/views/tag_views.xml new file mode 100644 index 0000000000..be407c6500 --- /dev/null +++ b/estate/views/tag_views.xml @@ -0,0 +1,47 @@ + + + + + + estate.tag.view.list + estate.property.tags + list + + + + + + + + + + + + estate.tag.view.form + estate.property.tags + form + +
+ + + + + +
+
+
+ + + + estate.tag.view.search + estate.property.tags + search + + + + + + + + +
diff --git a/estate/views/type_actions.xml b/estate/views/type_actions.xml new file mode 100644 index 0000000000..479079bf84 --- /dev/null +++ b/estate/views/type_actions.xml @@ -0,0 +1,8 @@ + + + + View property Types + estate.property.types + list,form + + \ No newline at end of file diff --git a/estate/views/type_menus.xml b/estate/views/type_menus.xml new file mode 100644 index 0000000000..06c1b2e570 --- /dev/null +++ b/estate/views/type_menus.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/estate/views/type_views.xml b/estate/views/type_views.xml new file mode 100644 index 0000000000..71a59ae673 --- /dev/null +++ b/estate/views/type_views.xml @@ -0,0 +1,53 @@ + + + + + + estate.type.view.list + estate.property.types + list + + + + + + + + + + + + + + estate.type.view.form + estate.property.types + form + +
+ + + + + + + + +
+
+
+ + + + estate.type.view.search + estate.property.types + search + + + + + + + + + +
From d219fa8fe11e83ad504a74476bdcf013bc5ad667 Mon Sep 17 00:00:00 2001 From: plha-odoo Date: Mon, 27 Jan 2025 15:55:04 +0100 Subject: [PATCH 07/12] [ADD] tuto chap 8 --- estate/models/estate_property.py | 27 ++++++++++++++++++++++++++- estate/models/property_offer.py | 17 +++++++++++++++-- estate/views/estate_form_view.xml | 2 ++ estate/views/offer_views.xml | 4 ++++ 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index a4ff0be557..fc0a0f51a2 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 from datetime import date, timedelta class EstateProperty(models.Model): @@ -25,3 +25,28 @@ class EstateProperty(models.Model): garden_orientation = fields.Selection([("North","North"),("South","South"),("East","East"),("West","West")]) active = fields.Boolean(default=True) state = fields.Selection([("New","New"),("Offer Received","Offer Received"),("Offer Accpeted","Offer Accepted"),("Solde","Solde"),("Cancelled","Cancelled")],copy=False,default="New") + total_area= fields.Integer(compute = "_compute_total_area") + best_price=fields.Float(compute="_compute_best_price") + + + + @api.depends("living_area","garden_area") + def _compute_total_area(self): + for record in self: + record.total_area=record.garden_area+record.living_area + + @api.depends("offer_ids.price") + def _compute_best_price(self): + for record in self: + if record.offer_ids: + record.best_price=max(record.mapped('offer_ids.price')) + else : record.best_price=0 + + @api.onchange("garden") + def _onchange_garden(self): + if self.garden==True: + self.garden_area=10 + self.garden_orientation="North" + if self.garden==False: + self.garden_area=0 + self.garden_orientation=None diff --git a/estate/models/property_offer.py b/estate/models/property_offer.py index 64a35a2d3a..582209bc85 100644 --- a/estate/models/property_offer.py +++ b/estate/models/property_offer.py @@ -1,4 +1,4 @@ -from odoo import fields, models +from odoo import api,fields, models from datetime import date, timedelta class EstatePropertyOffer(models.Model): @@ -10,5 +10,18 @@ class EstatePropertyOffer(models.Model): status = fields.Selection([("Accepted","Accepted"),("Refused","Refused")],copy=False) partner_id=fields.Many2one("res.partner",required=True) property_id=fields.Many2one("estate.property",required=True) + validity= fields.Integer(default=7) + date_deadline=fields.Date(compute="_compute_deadline",inverse="_inverse_deadline",string="Date Limite") - # properties = fields.One2many("estate.property","property_type_id",string="properties") + + @api.depends("validity") + def _compute_deadline(self): + for record in self: + if record.create_date: + record.date_deadline=record.create_date+timedelta(days=record.validity) + else : record.date_deadline=date.today()+timedelta(days=record.validity) + + def _inverse_deadline(self): + for record in self: + date_crea = fields.Date.to_date(record.create_date or fields.Date.today()) + record.validity=(record.date_deadline-date_crea).days diff --git a/estate/views/estate_form_view.xml b/estate/views/estate_form_view.xml index eb5d639e51..77bfc1876d 100644 --- a/estate/views/estate_form_view.xml +++ b/estate/views/estate_form_view.xml @@ -37,12 +37,14 @@ + + diff --git a/estate/views/offer_views.xml b/estate/views/offer_views.xml index 866517e624..ce37a31b30 100644 --- a/estate/views/offer_views.xml +++ b/estate/views/offer_views.xml @@ -10,6 +10,8 @@ + + @@ -28,6 +30,8 @@ + + From 837033e26e257ae5a5ed03f7a5771bc5c725bb69 Mon Sep 17 00:00:00 2001 From: plha-odoo Date: Tue, 28 Jan 2025 11:21:45 +0100 Subject: [PATCH 08/12] chap 9 of the tutorials --- estate/models/estate_property.py | 19 +++++++++++++++++-- estate/models/property_offer.py | 17 ++++++++++++++++- estate/views/estate_form_view.xml | 5 +++++ estate/views/offer_views.xml | 3 +++ 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index fc0a0f51a2..eb0c50d4d2 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,4 @@ -from odoo import api,fields, models +from odoo import api,fields, models,exceptions from datetime import date, timedelta class EstateProperty(models.Model): @@ -24,7 +24,7 @@ class EstateProperty(models.Model): garden_area= fields.Integer() garden_orientation = fields.Selection([("North","North"),("South","South"),("East","East"),("West","West")]) active = fields.Boolean(default=True) - state = fields.Selection([("New","New"),("Offer Received","Offer Received"),("Offer Accpeted","Offer Accepted"),("Solde","Solde"),("Cancelled","Cancelled")],copy=False,default="New") + state = fields.Selection([("New","New"),("Offer Received","Offer Received"),("Offer Accpeted","Offer Accepted"),("Sold","Sold"),("Cancelled","Cancelled")],copy=False,default="New") total_area= fields.Integer(compute = "_compute_total_area") best_price=fields.Float(compute="_compute_best_price") @@ -50,3 +50,18 @@ def _onchange_garden(self): if self.garden==False: self.garden_area=0 self.garden_orientation=None + + def action_sold(self): + if self.state=="Cancelled": + raise exceptions.UserError("impossible car la propriété est cancelled") + else : + self.state="Sold" + return True + + def action_cancelled(self): + if self.state=="Sold": + raise exceptions.UserError("impossible car la propriété est sold") + else : + for record in self: + record.state="Cancelled" + return True diff --git a/estate/models/property_offer.py b/estate/models/property_offer.py index 582209bc85..07254132cb 100644 --- a/estate/models/property_offer.py +++ b/estate/models/property_offer.py @@ -1,4 +1,4 @@ -from odoo import api,fields, models +from odoo import api,fields, models,exceptions from datetime import date, timedelta class EstatePropertyOffer(models.Model): @@ -25,3 +25,18 @@ def _inverse_deadline(self): for record in self: date_crea = fields.Date.to_date(record.create_date or fields.Date.today()) record.validity=(record.date_deadline-date_crea).days + + def offer_accepted(self): + if "Accepted" in self.property_id.offer_ids.mapped('status'): + raise exceptions.UserError("An other offer has already been accepted") + else : + for record in self: + record.status="Accepted" + record.property_id.buyer_id=record.partner_id + record.property_id.selling_price=record.price + return True + + def offer_declined(self): + for record in self: + record.status="Refused" + return True diff --git a/estate/views/estate_form_view.xml b/estate/views/estate_form_view.xml index 77bfc1876d..2c82cd2f3e 100644 --- a/estate/views/estate_form_view.xml +++ b/estate/views/estate_form_view.xml @@ -6,7 +6,12 @@ form
+ +
+
diff --git a/estate/views/offer_views.xml b/estate/views/offer_views.xml index ce37a31b30..7fde75cc08 100644 --- a/estate/views/offer_views.xml +++ b/estate/views/offer_views.xml @@ -10,6 +10,8 @@ + + + diff --git a/estate/views/user_views.xml b/estate/views/user_views.xml new file mode 100644 index 0000000000..ce1581cdc5 --- /dev/null +++ b/estate/views/user_views.xml @@ -0,0 +1,17 @@ + + + + + + res.users.inherited.view + res.users + + + + + + + + + + From 536301c44ddf18d5f2f8141ed28c62cbf704d77d Mon Sep 17 00:00:00 2001 From: plha-odoo Date: Wed, 5 Feb 2025 10:16:02 +0100 Subject: [PATCH 12/12] [ADD] end of the tutorials --- estate/__manifest__.py | 1 + estate/views/estate_kanban_view.xml | 36 +++++++++++++++++++ estate_account/__init__.py | 1 + estate_account/__manifest__.py | 10 ++++++ estate_account/models/__init__.py | 1 + .../models/estate_account_property.py | 31 ++++++++++++++++ 6 files changed, 80 insertions(+) create mode 100644 estate/views/estate_kanban_view.xml create mode 100644 estate_account/__init__.py create mode 100644 estate_account/__manifest__.py create mode 100644 estate_account/models/__init__.py create mode 100644 estate_account/models/estate_account_property.py diff --git a/estate/__manifest__.py b/estate/__manifest__.py index f767933b70..5f92fd6c88 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -8,6 +8,7 @@ 'views/estate_menus.xml', 'views/estate_list_view.xml', 'views/estate_form_view.xml', + 'views/estate_kanban_view.xml', 'views/estate_search_view.xml', 'views/type_actions.xml', 'views/type_menus.xml', diff --git a/estate/views/estate_kanban_view.xml b/estate/views/estate_kanban_view.xml new file mode 100644 index 0000000000..7d424763b5 --- /dev/null +++ b/estate/views/estate_kanban_view.xml @@ -0,0 +1,36 @@ + + + + estate.property.view.kanban + estate.property + kanban + + + + + + +
+ +
+ This is new! +
+
+ Expected Price: + +
+
+ Best Price: + +
+
+ Selling Price: + +
+
+
+
+
+
+
+
diff --git a/estate_account/__init__.py b/estate_account/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/estate_account/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/estate_account/__manifest__.py b/estate_account/__manifest__.py new file mode 100644 index 0000000000..3752d21130 --- /dev/null +++ b/estate_account/__manifest__.py @@ -0,0 +1,10 @@ +{ 'name': 'real estate account app plh', + 'depends': [ + 'estate', + 'account'], + 'application': True, + 'data':[ + + + ] + } diff --git a/estate_account/models/__init__.py b/estate_account/models/__init__.py new file mode 100644 index 0000000000..152b613d38 --- /dev/null +++ b/estate_account/models/__init__.py @@ -0,0 +1 @@ +from . import estate_account_property diff --git a/estate_account/models/estate_account_property.py b/estate_account/models/estate_account_property.py new file mode 100644 index 0000000000..886fec8588 --- /dev/null +++ b/estate_account/models/estate_account_property.py @@ -0,0 +1,31 @@ +from odoo import api,fields, models,exceptions, Command +from datetime import date, timedelta + +class EstateAccountProperty(models.Model): + _name = "estate.property" + _inherit="estate.property" + + def action_sold(self): + print("overriden correctly") + move_values = { + 'partner_id' : self.salesperson_id.id, + 'move_type' : 'out_invoice', + 'invoice_date' : fields.Date.today(), + 'state' : 'draft', + 'invoice_line_ids' : [ + Command.create({ + "name": "6% of Selling Price", + "quantity" : 1, + "price_unit" : self.selling_price * 0.06, + }), + Command.create({ + "name": "Administrative Fee", + "quantity" : 1, + "price_unit" : 100.00, + }) + ], + + } + + invoice = self.env['account.move'].create(move_values) + return super().action_sold()