From 876005a3d8617e02239417e9b5510d587d7b629a Mon Sep 17 00:00:00 2001 From: abshe Date: Tue, 18 Nov 2025 14:30:23 +0100 Subject: [PATCH 01/12] [ADD] estate : init --- estate/__init__.py | 0 estate/__manifest__.py | 6 ++++++ 2 files changed, 6 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..81ede71722b --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,6 @@ +{ + 'name' : "Real estate", + 'depends': 'base', + 'application': True, + 'installable': True +} \ No newline at end of file From d5ee7fcf35d8b94617882cb2cece68df31f0a196 Mon Sep 17 00:00:00 2001 From: abshe Date: Tue, 18 Nov 2025 15:43:14 +0100 Subject: [PATCH 02/12] [ADD] estate: added first tabel --- estate/__init__.py | 1 + estate/__manifest__.py | 6 +++--- estate/models/__init__.py | 1 + estate/models/estate_property.py | 21 +++++++++++++++++++++ 4 files changed, 26 insertions(+), 3 deletions(-) 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..0650744f6bc 100644 --- a/estate/__init__.py +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 81ede71722b..4dd4d0509f7 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,6 +1,6 @@ { - 'name' : "Real estate", - 'depends': 'base', + 'name': "Real estate", + 'depends': ['base'], 'application': True, 'installable': True -} \ No newline at end of file +} diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..5e1963c9d2f --- /dev/null +++ b/estate/models/__init__.py @@ -0,0 +1 @@ +from . import estate_property diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py new file mode 100644 index 00000000000..b6f3a5f2ad6 --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,21 @@ +from odoo import fields, models + + +class Property(models.Model): + _name = "estate.property" + _description = "estate property info" + + name = fields.Char(required=True, translate=True) + description = fields.Text(translate=True) + 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_area = fields.Boolean() + garden_area = fields.Integer() + garden_orientation = fields.Selection(string='garden_orientation' , selection=[('North','north'),('east','East'),('West','west'),('South','south')]) + \ No newline at end of file From e797cc512cc1ef66eacaf5626db99fea3dd81fff Mon Sep 17 00:00:00 2001 From: abshe Date: Tue, 18 Nov 2025 16:23:12 +0100 Subject: [PATCH 03/12] [ADD] estate: added access rights --- estate/__manifest__.py | 3 ++- estate/models/estate_property.py | 5 ++--- estate/security/ir.model.access.csv | 2 ++ 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 estate/security/ir.model.access.csv diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 4dd4d0509f7..5bc62c8a02b 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -2,5 +2,6 @@ 'name': "Real estate", 'depends': ['base'], 'application': True, - 'installable': True + 'installable': True, + 'data': ['security/ir.model.access.csv'] } diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index b6f3a5f2ad6..59d957c4291 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -15,7 +15,6 @@ class Property(models.Model): living_area = fields.Integer() facades = fields.Integer() garage = fields.Boolean() - garden_area = fields.Boolean() + garden = fields.Boolean() garden_area = fields.Integer() - garden_orientation = fields.Selection(string='garden_orientation' , selection=[('North','north'),('east','East'),('West','west'),('South','south')]) - \ No newline at end of file + garden_orientation = fields.Selection(string='garden_orientation', selection=[('North', 'north'), ('east', 'East'), ('West', 'west'), ('South', 'south')]) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..4e89e06fae0 --- /dev/null +++ b/estate/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_estate_model,access_estate_model,model_estate_property,base.group_user,1,1,1,1 From 052766fcd76fd2d42bfb067b06df2626a4ac92ce Mon Sep 17 00:00:00 2001 From: abshe Date: Tue, 18 Nov 2025 17:32:03 +0100 Subject: [PATCH 04/12] [ADD] estate: added views --- estate/__manifest__.py | 8 +++++++- estate/views/estate_menus.xml | 8 ++++++++ estate/views/estate_property_views.xml | 8 ++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) 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 5bc62c8a02b..37242489398 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -3,5 +3,11 @@ 'depends': ['base'], 'application': True, 'installable': True, - 'data': ['security/ir.model.access.csv'] + 'data': [ + 'security/ir.model.access.csv', + 'views/estate_menus.xml', + 'views/estate_property_views.xml' + ], + 'license': 'LGPL-3', + 'author': 'Abdallah' } diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml new file mode 100644 index 00000000000..47db906581a --- /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..af3e64394a2 --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,8 @@ + + + + property + estate.property + list,form + + From 109e9a39e40dcd04d8ec2a391f90f7315beea44a Mon Sep 17 00:00:00 2001 From: abshe Date: Wed, 19 Nov 2025 11:03:00 +0100 Subject: [PATCH 05/12] [ADD] estate: CH5 added extra fields --- estate/__manifest__.py | 6 +++--- estate/models/estate_property.py | 12 +++++++----- estate/views/estate_menus.xml | 15 ++++++++++----- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 37242489398..22ad9f0de30 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,13 +1,13 @@ { 'name': "Real estate", - 'depends': ['base'], + 'depends': ['base',], 'application': True, 'installable': True, 'data': [ 'security/ir.model.access.csv', + 'views/estate_property_views.xml', 'views/estate_menus.xml', - 'views/estate_property_views.xml' ], 'license': 'LGPL-3', - 'author': 'Abdallah' + 'author': 'Abdallah', } diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 59d957c4291..52f184be14c 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -3,18 +3,20 @@ class Property(models.Model): _name = "estate.property" - _description = "estate property info" + _description = "Estate Property Info" name = fields.Char(required=True, translate=True) description = fields.Text(translate=True) postcode = fields.Char() - date_availability = fields.Date() + date_availability = fields.Date(copy=False, default=fields.Datetime.add(fields.Datetime.today(), months=3)) 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() garden = fields.Boolean() garden_area = fields.Integer() - garden_orientation = fields.Selection(string='garden_orientation', selection=[('North', 'north'), ('east', 'East'), ('West', 'west'), ('South', 'south')]) + garden_orientation = fields.Selection(string='garden_orientation', selection=[('north', 'North'), ('east', 'East'), ('west', 'West'), ('south', 'South')]) + active = fields.Boolean(default=True) + status = fields.Selection(required=True, copy=False, default='new', selection=[('new', 'New'), ('offer', 'Offer'), ('recieved', 'Recieved'), ('accepted', 'Accepted'), ('sold', 'Sold')]) diff --git a/estate/views/estate_menus.xml b/estate/views/estate_menus.xml index 47db906581a..a6c7a596d17 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -1,8 +1,13 @@ - - - - - + + + + + From 176b95e43e6c2d17c5c9ce7851acd907ebf2a994 Mon Sep 17 00:00:00 2001 From: abshe Date: Wed, 19 Nov 2025 11:05:50 +0100 Subject: [PATCH 06/12] [FIX] estate: fixed naming --- 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 52f184be14c..5e2b0879cce 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -17,6 +17,6 @@ class Property(models.Model): garage = fields.Boolean() garden = fields.Boolean() garden_area = fields.Integer() - garden_orientation = fields.Selection(string='garden_orientation', selection=[('north', 'North'), ('east', 'East'), ('west', 'West'), ('south', 'South')]) + garden_orientation = fields.Selection(string='Garden_Orientation', selection=[('north', 'North'), ('east', 'East'), ('west', 'West'), ('south', 'South')]) active = fields.Boolean(default=True) status = fields.Selection(required=True, copy=False, default='new', selection=[('new', 'New'), ('offer', 'Offer'), ('recieved', 'Recieved'), ('accepted', 'Accepted'), ('sold', 'Sold')]) From 26010220467d91b7b36e7b9aa28b4e7f896e9665 Mon Sep 17 00:00:00 2001 From: abshe Date: Wed, 19 Nov 2025 14:41:25 +0100 Subject: [PATCH 07/12] [IMP] estate: CH6 added list,form,search views --- estate/__manifest__.py | 20 +++---- estate/models/estate_property.py | 35 +++++++++-- estate/views/estate_property_views.xml | 81 +++++++++++++++++++++++++- 3 files changed, 119 insertions(+), 17 deletions(-) diff --git a/estate/__manifest__.py b/estate/__manifest__.py index 22ad9f0de30..ab8ac561802 100644 --- a/estate/__manifest__.py +++ b/estate/__manifest__.py @@ -1,13 +1,13 @@ { - 'name': "Real estate", - 'depends': ['base',], - 'application': True, - 'installable': True, - 'data': [ - 'security/ir.model.access.csv', - 'views/estate_property_views.xml', - 'views/estate_menus.xml', + "name": "Real estate", + "depends": ["base"], + "application": True, + "installable": True, + "data": [ + "security/ir.model.access.csv", + "views/estate_property_views.xml", + "views/estate_menus.xml", ], - 'license': 'LGPL-3', - 'author': 'Abdallah', + "license": "LGPL-3", + "author": "Abdallah", } diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 5e2b0879cce..609533d01f7 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -5,18 +5,41 @@ class Property(models.Model): _name = "estate.property" _description = "Estate Property Info" - name = fields.Char(required=True, translate=True) + name = fields.Char(required=True, translate=True, string="Title") description = fields.Text(translate=True) postcode = fields.Char() - date_availability = fields.Date(copy=False, default=fields.Datetime.add(fields.Datetime.today(), months=3)) + date_availability = fields.Date( + copy=False, + default=fields.Datetime.add(fields.Datetime.today(), months=3), + string="Available From", + ) expected_price = fields.Float(required=True) selling_price = fields.Float(readonly=True, copy=False) bedrooms = fields.Integer(default=2) - living_area = fields.Integer() + living_area = fields.Integer(string="Living Area(sqm)") facades = fields.Integer() garage = fields.Boolean() garden = fields.Boolean() - garden_area = fields.Integer() - garden_orientation = fields.Selection(string='Garden_Orientation', selection=[('north', 'North'), ('east', 'East'), ('west', 'West'), ('south', 'South')]) + garden_area = fields.Integer(string="Garden Area(sqm)") + garden_orientation = fields.Selection( + string="Garden Orientation", + selection=[ + ("north", "North"), + ("east", "East"), + ("west", "West"), + ("south", "South"), + ], + ) active = fields.Boolean(default=True) - status = fields.Selection(required=True, copy=False, default='new', selection=[('new', 'New'), ('offer', 'Offer'), ('recieved', 'Recieved'), ('accepted', 'Accepted'), ('sold', 'Sold')]) + status = fields.Selection( + required=True, + copy=False, + default="new", + selection=[ + ("new", "New"), + ("offer_recieved", "Offer Recieved"), + ("offer_accepted", "Offer Accepted"), + ("sold", "Sold"), + ("cancelled", "Cancelled"), + ], + ) diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index af3e64394a2..11f0fd22f37 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,7 +1,86 @@ + + + estate.property.search + estate.property + + + + + + + + + + + + + estate.property.form + estate.property + +
+ + +

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + estate.property.list + estate.property + + + + + + + + + + + + + - property + properties estate.property list,form From a0c2536f2571861c2f205192478f6c2b2352e21c Mon Sep 17 00:00:00 2001 From: abshe Date: Thu, 20 Nov 2025 11:28:23 +0100 Subject: [PATCH 08/12] [ADD] estate: added models + relations --- estate/models/__init__.py | 2 +- estate/models/estate_property.py | 10 ++ estate/models/estate_property_misc.py | 32 ++++ estate/security/ir.model.access.csv | 3 + estate/views/estate_menus.xml | 21 ++- estate/views/estate_property_views.xml | 202 +++++++++++++++---------- 6 files changed, 179 insertions(+), 91 deletions(-) create mode 100644 estate/models/estate_property_misc.py diff --git a/estate/models/__init__.py b/estate/models/__init__.py index 5e1963c9d2f..52242756a4e 100644 --- a/estate/models/__init__.py +++ b/estate/models/__init__.py @@ -1 +1 @@ -from . import estate_property +from . import estate_property, estate_property_misc diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 609533d01f7..e23dea32b9d 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -43,3 +43,13 @@ class Property(models.Model): ("cancelled", "Cancelled"), ], ) + + property_type_id = fields.Many2one("estate.property.type", string="Property Type") + buyer_id = fields.Many2one("res.partner", string="Buyer", copy="False") + salesperson_id = fields.Many2one( + "res.users", + string="Salesman", + default=lambda self: self.env.user, + ) + tag_ids = fields.Many2many("estate.property.tags", string="Tags") + offer_ids = fields.One2many("estate.property.offer", "property_id", string="Tags") diff --git a/estate/models/estate_property_misc.py b/estate/models/estate_property_misc.py new file mode 100644 index 00000000000..255216a5879 --- /dev/null +++ b/estate/models/estate_property_misc.py @@ -0,0 +1,32 @@ +from odoo import fields, models + + +class PropertyType(models.Model): + _name = "estate.property.type" + _description = "Estate Property Type" + + name = fields.Char(required=True) + + +class PropertyTags(models.Model): + _name = "estate.property.tags" + _description = "Estate Property Tags" + + name = fields.Char(required=True) + + +class PropertyOffer(models.Model): + _name = "estate.property.offer" + _descrption = "Estate Property Offer" + + price = fields.Float(required=True) + status = fields.Selection( + string="Status", + copy=False, + selection=[ + ("accepted", "Accepted"), + ("refused", "Refused"), + ], + ) + buyer_id = fields.Many2one("res.partner", string="Buyer", required="True") + property_id = fields.Many2one("estate.property", string="Property", required="True") diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv index 4e89e06fae0..179038c5b2b 100644 --- a/estate/security/ir.model.access.csv +++ b/estate/security/ir.model.access.csv @@ -1,2 +1,5 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink access_estate_model,access_estate_model,model_estate_property,base.group_user,1,1,1,1 +access_estate_property_type,access_estate_property_type,model_estate_property_type,base.group_user,1,1,1,1 +access_estate_property_tags,access_estate_property_tags,model_estate_property_tags,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 a6c7a596d17..950115825a8 100644 --- a/estate/views/estate_menus.xml +++ b/estate/views/estate_menus.xml @@ -1,13 +1,22 @@ - - - + - - + parent="estate_ads_menu"/> + + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 11f0fd22f37..4fcefd0da6a 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -1,87 +1,121 @@ - - - estate.property.search - estate.property - - - - - - - - - - - - - estate.property.form - estate.property - -
- - -

- -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - - estate.property.list - estate.property - - - - - - - - - - - - - - - properties - estate.property - list,form - + + estate.property.search + estate.property + + + + + + + + + + + + + + + + estate.property.form + estate.property + +
+ + +

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + estate.property.list + estate.property + + + + + + + + + + + + + + + + properties + estate.property + list,form + + + Property Types + estate.property.type + list,form + + + Property Tags + estate.property.tags + list,form +
From 40f2c51454441276775ef860bcee0058d97fa121 Mon Sep 17 00:00:00 2001 From: abshe Date: Thu, 20 Nov 2025 15:05:43 +0100 Subject: [PATCH 09/12] [IMP] estate: CH8 computed fields --- estate/models/estate_property.py | 32 ++++++++++++++++++++++++-- estate/models/estate_property_misc.py | 29 +++++++++++++++++++---- estate/views/estate_property_views.xml | 6 +++++ 3 files changed, 61 insertions(+), 6 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index e23dea32b9d..73c4fccd606 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,4 @@ -from odoo import fields, models +from odoo import fields, models, api class Property(models.Model): @@ -51,5 +51,33 @@ class Property(models.Model): string="Salesman", default=lambda self: self.env.user, ) + tag_ids = fields.Many2many("estate.property.tags", string="Tags") - offer_ids = fields.One2many("estate.property.offer", "property_id", string="Tags") + offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers") + + total_area = fields.Float( + compute="_compute_total_area", + string="Total Area(sqm)", + ) + best_offer = fields.Float( + compute="_compute_best_price", + string="Best Offer", + ) + + @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") + def _compute_best_price(self): + for record in self: + if record.offer_ids: + record.best_offer = max(record.offer_ids.mapped("price")) + else: + record.best_offer = 0 + + @api.onchange("garden") + def _onchange_garden(self): + self.garden_area = 10 if self.garden else 0 + self.garden_orientation = "north" if self.garden else "" diff --git a/estate/models/estate_property_misc.py b/estate/models/estate_property_misc.py index 255216a5879..96f18e67cb8 100644 --- a/estate/models/estate_property_misc.py +++ b/estate/models/estate_property_misc.py @@ -1,4 +1,4 @@ -from odoo import fields, models +from odoo import fields, models, api class PropertyType(models.Model): @@ -17,7 +17,7 @@ class PropertyTags(models.Model): class PropertyOffer(models.Model): _name = "estate.property.offer" - _descrption = "Estate Property Offer" + _description = "Estate Property Offer" price = fields.Float(required=True) status = fields.Selection( @@ -28,5 +28,26 @@ class PropertyOffer(models.Model): ("refused", "Refused"), ], ) - buyer_id = fields.Many2one("res.partner", string="Buyer", required="True") - property_id = fields.Many2one("estate.property", string="Property", required="True") + buyer_id = fields.Many2one("res.partner", string="Buyer", required=True) + property_id = fields.Many2one("estate.property", string="Property", required=True) + + validity = fields.Integer(default=7) + date_deadline = fields.Date(compute="_compute_date", inverse="_inverse_date") + + @api.depends("validity") + def _compute_date(self): + for record in self: + create_date = record.create_date + if not create_date: + create_date = fields.Date.today() + record.date_deadline = fields.Date.add( + create_date, + days=record.validity, + ) + + def _inverse_date(self): + for record in self: + create_date = record.create_date.date() + if not create_date: + create_date = fields.Date.today() + record.validity = (record.date_deadline - create_date).days diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 4fcefd0da6a..5783c6a33a7 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -47,6 +47,9 @@ + + + @@ -60,6 +63,7 @@ + @@ -69,6 +73,8 @@ + + From 2f811b7816a05ce42bd93d0616acef274c513aa3 Mon Sep 17 00:00:00 2001 From: abshe Date: Thu, 20 Nov 2025 15:54:47 +0100 Subject: [PATCH 10/12] [ADD] estate: CH9 Bottons + Actions --- estate/models/estate_property.py | 16 +++++++++++++++- estate/models/estate_property_misc.py | 16 +++++++++++++++- estate/views/estate_property_views.xml | 11 ++++++++++- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/estate/models/estate_property.py b/estate/models/estate_property.py index 73c4fccd606..a965d20c170 100644 --- a/estate/models/estate_property.py +++ b/estate/models/estate_property.py @@ -1,4 +1,4 @@ -from odoo import fields, models, api +from odoo import fields, models, api, exceptions class Property(models.Model): @@ -81,3 +81,17 @@ def _compute_best_price(self): def _onchange_garden(self): self.garden_area = 10 if self.garden else 0 self.garden_orientation = "north" if self.garden else "" + + def sell_property_action(self): + for record in self: + if record.status == "cancelled": + raise exceptions.UserError("Property Cancelled") + record.status = "sold" + return True + + def cancel_property_action(self): + for record in self: + if record.status == "sold": + raise exceptions.UserError("Property Sold") + record.status = "cancelled" + return True diff --git a/estate/models/estate_property_misc.py b/estate/models/estate_property_misc.py index 96f18e67cb8..61f6fb79e93 100644 --- a/estate/models/estate_property_misc.py +++ b/estate/models/estate_property_misc.py @@ -1,4 +1,4 @@ -from odoo import fields, models, api +from odoo import fields, models, api, exceptions class PropertyType(models.Model): @@ -51,3 +51,17 @@ def _inverse_date(self): if not create_date: create_date = fields.Date.today() record.validity = (record.date_deadline - create_date).days + + def accept_offer(self): + if self.property_id.status == "sold": + raise exceptions.UserError("Property is already sold") + self.property_id.buyer_id = self.buyer_id + self.property_id.selling_price = self.price + self.status = "accepted" + return True + + def refuse_offer(self): + if self.property_id.status == "sold": + raise exceptions.UserError("Property is already sold") + self.status = "refused" + return True diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml index 5783c6a33a7..6781290c0f0 100644 --- a/estate/views/estate_property_views.xml +++ b/estate/views/estate_property_views.xml @@ -21,7 +21,11 @@ estate.property.form estate.property -
+ +
+

@@ -32,6 +36,9 @@ + + + @@ -75,6 +82,8 @@ +