From 6d4aa815f0b3bb75d5093bbf9115246f641ca4bd Mon Sep 17 00:00:00 2001 From: Antonio Pimentel Date: Mon, 16 Feb 2026 17:24:50 +0100 Subject: [PATCH 1/9] [ADD] estate: add basic estate module (ch 1-4) --- estate/__init__.py | 1 + estate/__manifest__.py | 20 ++++++++++++++++++++ estate/models/__init__.py | 2 ++ estate/models/estate_property.py | 21 +++++++++++++++++++++ estate/security/ir.model.access.csv | 2 ++ 5 files changed, 46 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 create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/__init__.py b/estate/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/estate/__manifest__.py b/estate/__manifest__.py new file mode 100644 index 00000000000..6624bc2f4f9 --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +{ + 'name': 'Real Estate', + 'summary': """ + Real estate" + """, + 'description': """ + Descrption" + """, + 'author': 'Antonio', + 'category': 'Tutorials', + 'version': '1.0', + 'application': True, + 'installable': True, + 'depends': ['base'], + 'data': [ + 'security/ir.model.access.csv', + ], + 'license': 'LGPL-3', +} diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..63a07a131a7 --- /dev/null +++ b/estate/models/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import estate_property diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py new file mode 100644 index 00000000000..90416eadec7 --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,21 @@ +from odoo import fields, models + +class EstateProperty(models.Model): + _name = "estate_property" + _description = "Estate properties" + + 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')]) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..976b61e8cb3 --- /dev/null +++ b/estate/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file From 45e892117273f0bfe7bc8c377bdc14a9576a28c9 Mon Sep 17 00:00:00 2001 From: Antonio Pimentel Date: Tue, 17 Feb 2026 11:41:37 +0100 Subject: [PATCH 2/9] [IMP] estate: add fields and menu (ch 5) --- estate/__manifest__.py | 2 ++ estate/models/estate_property.py | 27 ++++++++++++++++++++------ estate/security/ir.model.access.csv | 2 +- estate/views/estate_menus.xml | 7 +++++++ estate/views/estate_property_views.xml | 7 +++++++ 5 files changed, 38 insertions(+), 7 deletions(-) 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 6624bc2f4f9..f2c76f1937d 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -15,6 +15,8 @@ 'depends': ['base'], 'data': [ 'security/ir.model.access.csv', + 'views/estate_property_views.xml', + 'views/estate_menus.xml', ], 'license': 'LGPL-3', } diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 90416eadec7..6682077720b 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -4,18 +4,33 @@ class EstateProperty(models.Model): _name = "estate_property" _description = "Estate properties" - name = fields.Char(required=True) + name = fields.Char('Title', required=True) description = fields.Text() postcode = fields.Char() - date_availability = fields.Date() + date_availability = fields.Date( + string='Available From', + copy=False, + default=lambda _: fields.Date.add(fields.Date.today(), months=+3)) expected_price = fields.Float(required=True) - selling_price = fields.Float() - bedrooms = fields.Integer() - living_area= fields.Integer() + selling_price = fields.Float(readonly=True, copy=False) + bedrooms = fields.Integer(default=2) + living_area= fields.Integer(string='Living area (sqm)') facades = fields.Integer() garage = fields.Boolean() garden = fields.Boolean() - garden_area = fields.Integer() + garden_area = fields.Integer(string='Garden area (sqm)') garden_orientation = fields.Selection( string='Garden Orientation', selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')]) + state = fields.Selection( + string='Status', + required=True, + copy=False, + default='new', + selection=[ + ('new', 'New'), + ('offer_received', 'Offer Received'), + ('offer_accepted', 'Offer Accepted'), + ('sold', 'Sold'), + ('cancelled', 'Cancelled')]) + active = fields.Boolean(default=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 976b61e8cb3..d9d6ba57cc5 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,access_estate_property,model_estate_property,base.group_user,1,1,1,1 \ No newline at end of file +access_estate_property,access_estate_property,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..ef7ee1badfa --- /dev/null +++ b/estate/views/estate_menus.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml new file mode 100644 index 00000000000..76041020552 --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,7 @@ + + + Properties + estate_property + list,form + + From 6604169902b40604d4fe325e6e043d04e543c132 Mon Sep 17 00:00:00 2001 From: Antonio Pimentel Date: Tue, 17 Feb 2026 16:08:13 +0100 Subject: [PATCH 3/9] [IMP] estate: customize EstateProperty views (ch 6) --- estate/models/estate_property.py | 2 +- estate/views/estate_property_views.xml | 77 +++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 6682077720b..042fc27f18c 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,7 +1,7 @@ from odoo import fields, models class EstateProperty(models.Model): - _name = "estate_property" + _name = "estate.property" _description = "Estate properties" name = fields.Char('Title', required=True) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 76041020552..50e0ef8d5c5 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,7 +1,82 @@ Properties - estate_property + estate.property list,form + + + estate.property.list + estate.property + + + + + + + + + + + + + + + estate.property.search + estate.property + + + + + + + + + + + + + + + + estate.property.form + estate.property + +
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
From 8f1cf2e46940e7f2aed38674f30c7990c3e05cf7 Mon Sep 17 00:00:00 2001 From: Antonio Pimentel Date: Wed, 18 Feb 2026 11:38:04 +0100 Subject: [PATCH 4/9] [IMP] estate: Add property types, tags and offers (ch 7) --- estate/__manifest__.py | 3 ++ estate/models/__init__.py | 3 ++ estate/models/estate_property.py | 5 ++++ estate/models/estate_property_offer.py | 10 +++++++ estate/models/estate_property_tag.py | 7 +++++ estate/models/estate_property_type.py | 7 +++++ estate/security/ir.model.access.csv | 3 ++ estate/views/estate_menus.xml | 4 +++ estate/views/estate_property_offer_views.xml | 29 ++++++++++++++++++++ estate/views/estate_property_tag_views.xml | 23 ++++++++++++++++ estate/views/estate_property_type_views.xml | 23 ++++++++++++++++ estate/views/estate_property_views.xml | 16 ++++++++++- 12 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 estate/models/estate_property_offer.py create mode 100644 estate/models/estate_property_tag.py create mode 100644 estate/models/estate_property_type.py create mode 100644 estate/views/estate_property_offer_views.xml create mode 100644 estate/views/estate_property_tag_views.xml create mode 100644 estate/views/estate_property_type_views.xml diff --git a/estate/__manifest__.py b/estate/__manifest__.py index f2c76f1937d..b2670d08006 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -16,6 +16,9 @@ 'data': [ 'security/ir.model.access.csv', 'views/estate_property_views.xml', + 'views/estate_property_type_views.xml', + 'views/estate_property_tag_views.xml', + 'views/estate_property_offer_views.xml', 'views/estate_menus.xml', ], 'license': 'LGPL-3', diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 63a07a131a7..d45f7f62cb8 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,2 +1,5 @@ # -*- coding: utf-8 -*- from . import estate_property +from . import estate_property_type +from . import estate_property_tag +from . import estate_property_offer diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 042fc27f18c..0d7534fe8cd 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -34,3 +34,8 @@ class EstateProperty(models.Model): ('sold', 'Sold'), ('cancelled', 'Cancelled')]) active = fields.Boolean(default=True) + property_type_id = fields.Many2one("estate.property.type", string="Type") + buyer_id = fields.Many2one("res.partner", string="Buyer", copy=False) + salesperson_id = fields.Many2one("res.users", string="Salesperson", default=lambda self: self.env.user) + tag_ids = fields.Many2many("estate.property.tag", string="Tags") + offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers") diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py new file mode 100644 index 00000000000..f0120a9e1d5 --- /dev/null +++ b/estate/models/estate_property_offer.py @@ -0,0 +1,10 @@ +from odoo import fields, models + +class EstatePropertyOffer(models.Model): + _name = "estate.property.offer" + _description = "Estate property offer" + + price = fields.Float() + status = fields.Selection(copy=False, selection=[('accepted', 'Accepted'), ('refused', 'Refused')]) + partner_id = fields.Many2one("res.partner", string="Partner", required=True) + property_id = fields.Many2one("estate.property", string="Property", required=True) diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py new file mode 100644 index 00000000000..a7d7c4bf4d3 --- /dev/null +++ b/estate/models/estate_property_tag.py @@ -0,0 +1,7 @@ +from odoo import fields, models + +class EstatePropertyTag(models.Model): + _name = "estate.property.tag" + _description = "Estate property tag" + + name = fields.Char('Tag', required=True) diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py new file mode 100644 index 00000000000..3f46935899f --- /dev/null +++ b/estate/models/estate_property_type.py @@ -0,0 +1,7 @@ +from odoo import fields, models + +class EstatePropertyType(models.Model): + _name = "estate.property.type" + _description = "Estate property type" + + name = fields.Char('Type', required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index d9d6ba57cc5..49bca99cac8 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,2 +1,5 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1 +access_estate_property_type,access_estate_property_type,model_estate_property_type,base.group_user,1,1,1,1 +access_estate_property_tag,access_estate_property_tag,model_estate_property_tag,base.group_user,1,1,1,1 +access_estate_property_offer,access_estate_property_offer,model_estate_property_offer,base.group_user,1,1,1,1 diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index ef7ee1badfa..6705af22070 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -3,5 +3,9 @@ + + + + diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml new file mode 100644 index 00000000000..88389624870 --- /dev/null +++ b/estate/views/estate_property_offer_views.xml @@ -0,0 +1,29 @@ + + + estate.property.offer.list + estate.property.offer + + + + + + + + + + + estate.property.offer.form + estate.property.offer + +
+ + + + + + + +
+
+
+
diff --git a/estate/views/estate_property_tag_views.xml b/estate/views/estate_property_tag_views.xml new file mode 100644 index 00000000000..1596115ef30 --- /dev/null +++ b/estate/views/estate_property_tag_views.xml @@ -0,0 +1,23 @@ + + + Property Tags + estate.property.tag + list,form + + + + estate.property.tag.form + estate.property.tag + +
+ +
+

+ +

+
+
+
+
+
+
diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml new file mode 100644 index 00000000000..96f9332b7a3 --- /dev/null +++ b/estate/views/estate_property_type_views.xml @@ -0,0 +1,23 @@ + + + Property Types + estate.property.type + list,form + + + + estate.property.type.form + estate.property.type + +
+ +
+

+ +

+
+
+
+
+
+
diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 50e0ef8d5c5..cd6e829b80b 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -11,6 +11,8 @@ + + @@ -32,6 +34,7 @@ + @@ -46,12 +49,14 @@
-

+

+ + @@ -73,6 +78,15 @@ + + + + + + + + +
From c2b6c09976ea444794e965a6b3138a7b13c75e14 Mon Sep 17 00:00:00 2001 From: Antonio Pimentel Date: Wed, 18 Feb 2026 16:17:24 +0100 Subject: [PATCH 5/9] [IMP] estate: Add onchange/computed fields to property and offer (ch 8) --- estate/models/estate_property.py | 27 ++++++++++++++++++-- estate/models/estate_property_offer.py | 20 ++++++++++++++- estate/views/estate_property_offer_views.xml | 4 +++ estate/views/estate_property_views.xml | 3 ++- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 0d7534fe8cd..5c097ac760c 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,9 +1,9 @@ -from odoo import fields, models +from odoo import api, fields, models class EstateProperty(models.Model): _name = "estate.property" _description = "Estate properties" - + name = fields.Char('Title', required=True) description = fields.Text() postcode = fields.Char() @@ -22,6 +22,7 @@ class EstateProperty(models.Model): garden_orientation = fields.Selection( string='Garden Orientation', selection=[('north', 'North'), ('south', 'South'), ('east', 'East'), ('west', 'West')]) + total_area = fields.Integer(string='Total area (sqm)', compute="_compute_total_area") state = fields.Selection( string='Status', required=True, @@ -39,3 +40,25 @@ class EstateProperty(models.Model): salesperson_id = fields.Many2one("res.users", string="Salesperson", default=lambda self: self.env.user) tag_ids = fields.Many2many("estate.property.tag", string="Tags") offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers") + best_price = fields.Float(string="Best Offer", compute="_compute_best_offer") + + @api.depends("living_area", "garden_area") + def _compute_total_area(self): + for record in self: + record.total_area = record.living_area + record.garden_area + + @api.depends("offer_ids") + def _compute_best_offer(self): + for record in self: + record.best_price = max(record.offer_ids.mapped('price')) if record.offer_ids else 0 + + @api.onchange("garden") + def _onchange_garden(self): + if self.garden: + if not self.garden_area: + self.garden_area = 10 + if not self.garden_orientation: + self.garden_orientation = "north" + else: + self.garden_area = 0 + self.garden_orientation = None diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index f0120a9e1d5..b24e61970f3 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,4 +1,6 @@ -from odoo import fields, models +from datetime import date, timedelta + +from odoo import api, fields, models class EstatePropertyOffer(models.Model): _name = "estate.property.offer" @@ -8,3 +10,19 @@ class EstatePropertyOffer(models.Model): status = fields.Selection(copy=False, selection=[('accepted', 'Accepted'), ('refused', 'Refused')]) partner_id = fields.Many2one("res.partner", string="Partner", required=True) property_id = fields.Many2one("estate.property", string="Property", required=True) + validity = fields.Integer(string="Validity (days)", default=7) + date_deadline = fields.Date(string="Deadline", + compute="_compute_date_deadline", + inverse="_inverse_date_deadline") + + @api.depends("validity") + def _compute_date_deadline(self): + for record in self: + start_date = record.create_date or date.today() + record.date_deadline = start_date + timedelta(days=record.validity) + + def _inverse_date_deadline(self): + for record in self: + start_date = record.create_date.date() if record.create_date else date.today() + date_dif = record.date_deadline - start_date + record.validity = date_dif.days diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 88389624870..0c1f5a30aab 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -6,6 +6,8 @@ + +
@@ -20,6 +22,8 @@ + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index cd6e829b80b..6d342f2e8f6 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -63,6 +63,7 @@ + @@ -76,6 +77,7 @@ + @@ -92,5 +94,4 @@ - From e4e3622ac937fa2680c1d160c20e9df1214307c4 Mon Sep 17 00:00:00 2001 From: Antonio Pimentel Date: Wed, 18 Feb 2026 16:28:33 +0100 Subject: [PATCH 6/9] [LINT] estate: fix whitespace; remove encoding declarations --- estate/__manifest__.py | 1 - estate/models/__init__.py | 1 - estate/models/estate_property.py | 3 ++- estate/models/estate_property_offer.py | 1 + estate/models/estate_property_tag.py | 3 ++- estate/models/estate_property_type.py | 3 ++- 6 files changed, 7 insertions(+), 5 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index b2670d08006..1194a153fff 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- { 'name': 'Real Estate', 'summary': """ diff --git a/estate/models/__init__.py b/estate/models/__init__.py index d45f7f62cb8..2f1821a39c1 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from . import estate_property from . import estate_property_type from . import estate_property_tag diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 5c097ac760c..7c607c096a3 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,5 +1,6 @@ from odoo import api, fields, models + class EstateProperty(models.Model): _name = "estate.property" _description = "Estate properties" @@ -14,7 +15,7 @@ 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(string='Living area (sqm)') + living_area = fields.Integer(string='Living area (sqm)') facades = fields.Integer() garage = fields.Boolean() garden = fields.Boolean() diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index b24e61970f3..e949358c152 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -2,6 +2,7 @@ from odoo import api, fields, models + class EstatePropertyOffer(models.Model): _name = "estate.property.offer" _description = "Estate property offer" diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py index a7d7c4bf4d3..54d8c1eb264 100644 --- a/estate/models/estate_property_tag.py +++ b/estate/models/estate_property_tag.py @@ -1,7 +1,8 @@ from odoo import fields, models + class EstatePropertyTag(models.Model): _name = "estate.property.tag" _description = "Estate property tag" - + name = fields.Char('Tag', required=True) diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py index 3f46935899f..36d86cba657 100644 --- a/estate/models/estate_property_type.py +++ b/estate/models/estate_property_type.py @@ -1,7 +1,8 @@ from odoo import fields, models + class EstatePropertyType(models.Model): _name = "estate.property.type" _description = "Estate property type" - + name = fields.Char('Type', required=True) From cf1a949b685132d71265c38f610553b400472b4c Mon Sep 17 00:00:00 2001 From: Antonio Pimentel Date: Thu, 19 Feb 2026 10:48:49 +0100 Subject: [PATCH 7/9] [IMP] estate: add buttons to modify offer/property state (ch 9) --- estate/models/estate_property.py | 17 +++++++++++++++++ estate/models/estate_property_offer.py | 17 +++++++++++++++++ estate/views/estate_property_offer_views.xml | 2 ++ estate/views/estate_property_views.xml | 5 +++++ 4 files changed, 41 insertions(+) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 7c607c096a3..b5904a0db8c 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 class EstateProperty(models.Model): @@ -63,3 +64,19 @@ def _onchange_garden(self): else: self.garden_area = 0 self.garden_orientation = None + + def action_sold(self): + for record in self: + if record.state == "cancelled": + raise UserError("Canceled properties cannot be sold.") + else: + record.state = "sold" + return True + + def action_cancel(self): + for record in self: + if record.state == "sold": + raise UserError("Sold properties cannot be canceled.") + else: + record.state = "cancelled" + return True diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py index e949358c152..26adef0f135 100644 --- a/estate/models/estate_property_offer.py +++ b/estate/models/estate_property_offer.py @@ -1,6 +1,7 @@ from datetime import date, timedelta from odoo import api, fields, models +from odoo.exceptions import UserError class EstatePropertyOffer(models.Model): @@ -27,3 +28,19 @@ def _inverse_date_deadline(self): start_date = record.create_date.date() if record.create_date else date.today() date_dif = record.date_deadline - start_date record.validity = date_dif.days + + def action_accept_offer(self): + for record in self: + if any([offer.status == 'accepted' for offer in record.property_id.offer_ids]): + raise UserError("An offer for this property has already been accepted.") + else: + record.status = 'accepted' + record.property_id.selling_price = record.price + record.property_id.buyer_id = record.partner_id + record.property_id.state = 'offer_accepted' + return True + + def action_refuse_offer(self): + for record in self: + record.status = 'refused' + return True diff --git a/estate/views/estate_property_offer_views.xml b/estate/views/estate_property_offer_views.xml index 0c1f5a30aab..6e025c25e98 100644 --- a/estate/views/estate_property_offer_views.xml +++ b/estate/views/estate_property_offer_views.xml @@ -8,6 +8,8 @@ + +

+ + + + + + + + + + +
diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index bedac58c004..b067bb0b61c 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -3,22 +3,26 @@ Properties estate.property list,form + {'search_default_available': True} estate.property.list estate.property - + - + - + @@ -32,7 +36,7 @@ - +
-
@@ -58,10 +69,9 @@
- + - - + @@ -80,13 +90,13 @@ - - + + - +