From affda17c8f6ced5474c1835dae91d837dcefdd5c Mon Sep 17 00:00:00 2001 From: prcha-odoo Date: Thu, 7 May 2026 18:54:09 +0530 Subject: [PATCH 1/4] [ADD] real_estate: added real_estate module Added the basic structure for the new module by creating the and files. --- real_estate/__init__.py | 0 real_estate/__manifest__.py | 11 +++++++++++ 2 files changed, 11 insertions(+) create mode 100644 real_estate/__init__.py create mode 100644 real_estate/__manifest__.py diff --git a/real_estate/__init__.py b/real_estate/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/real_estate/__manifest__.py b/real_estate/__manifest__.py new file mode 100644 index 00000000000..77750872f06 --- /dev/null +++ b/real_estate/__manifest__.py @@ -0,0 +1,11 @@ + +{ + 'name': 'real_estate', + 'version': '1.0', + 'depends': ['base'], + 'category': 'tutorials', + 'author': "prcha-odoo", + 'description': "A real estate module", + 'installable': True, + 'application': True +} From ac2558d4ab01ed499288338b99a7520251d92cb0 Mon Sep 17 00:00:00 2001 From: prcha-odoo Date: Mon, 11 May 2026 18:48:53 +0530 Subject: [PATCH 2/4] [ADD] real_estate: add models and module metadata - Created real estate property model --- real_estate/__init__.py | 4 ++++ real_estate/__manifest__.py | 3 ++- real_estate/models/__init__.py | 5 +++++ real_estate/models/estate_property.py | 24 ++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 real_estate/models/__init__.py create mode 100644 real_estate/models/estate_property.py diff --git a/real_estate/__init__.py b/real_estate/__init__.py index e69de29bb2d..e9917144f69 100644 --- a/real_estate/__init__.py +++ b/real_estate/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models \ No newline at end of file diff --git a/real_estate/__manifest__.py b/real_estate/__manifest__.py index 77750872f06..f14ba9d8f5a 100644 --- a/real_estate/__manifest__.py +++ b/real_estate/__manifest__.py @@ -5,7 +5,8 @@ 'depends': ['base'], 'category': 'tutorials', 'author': "prcha-odoo", + 'license': 'LGPL-3', 'description': "A real estate module", 'installable': True, - 'application': True + 'application': True, } diff --git a/real_estate/models/__init__.py b/real_estate/models/__init__.py new file mode 100644 index 00000000000..19c0241a16a --- /dev/null +++ b/real_estate/models/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import estate_property +from . import timepass \ No newline at end of file diff --git a/real_estate/models/estate_property.py b/real_estate/models/estate_property.py new file mode 100644 index 00000000000..7cd851a29ba --- /dev/null +++ b/real_estate/models/estate_property.py @@ -0,0 +1,24 @@ +from odoo import fields, models + +class EstateProperty(models.Model): + _name = "estate.property" + _description = "real estate property module" + + name = fields.Char(string="Property Name") + description = fields.Text(string="Description") + postcode = fields.Char(string="Postal Code") + date_availability = fields.Date(string="Available Date") + expected_price = fields.Float(string='Expected Price', required=True) + selling_price = fields.Float(string='Selling Price', required=True) + bedrooms = fields.Integer(string="Bedroom Count") + living_area = fields.Integer(string="Living Area Count") + facades = fields.Integer(string="Facades Count") + has_garage = fields.Boolean(string="Has any Garage ?") + has_garden = fields.Boolean(string="Has any Garden ?") + garden_area = fields.Integer(string="Garden Area in (sq meter)") + garden_orientation = fields.Selection( + string="Garden Orientation", + selection=[ + ('north','North'),('south','South'),('east','East'),('west','West') + ] + ) \ No newline at end of file From 683f04e6f4133801c97ad0e9fb2688cc6983b398 Mon Sep 17 00:00:00 2001 From: prcha-odoo Date: Tue, 12 May 2026 18:45:35 +0530 Subject: [PATCH 3/4] [IMP] real_estate: update model fields - Updated estate model field definitions - Improved ORM API usage and structure - Added changes based on ORM API study --- real_estate/models/__init__.py | 3 +-- real_estate/models/estate_property.py | 5 ++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/real_estate/models/__init__.py b/real_estate/models/__init__.py index 19c0241a16a..a37be05899b 100644 --- a/real_estate/models/__init__.py +++ b/real_estate/models/__init__.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from . import estate_property -from . import timepass \ No newline at end of file +from . import estate_property \ No newline at end of file diff --git a/real_estate/models/estate_property.py b/real_estate/models/estate_property.py index 7cd851a29ba..81b7990bb88 100644 --- a/real_estate/models/estate_property.py +++ b/real_estate/models/estate_property.py @@ -7,7 +7,10 @@ class EstateProperty(models.Model): name = fields.Char(string="Property Name") description = fields.Text(string="Description") postcode = fields.Char(string="Postal Code") - date_availability = fields.Date(string="Available Date") + date_availability = fields.Date( + string='Available From', + default=lambda self: fields.Date.today() + ) expected_price = fields.Float(string='Expected Price', required=True) selling_price = fields.Float(string='Selling Price', required=True) bedrooms = fields.Integer(string="Bedroom Count") From 076c461d1c3e1a525456d2633e679fa1466d9be6 Mon Sep 17 00:00:00 2001 From: prcha-odoo Date: Fri, 15 May 2026 18:08:39 +0530 Subject: [PATCH 4/4] [IMP] real_estate: model access permissions and code formatting - Added ir.model.access.csv for estate.property model - Fixed linting and style issues - Icon added --- real_estate/__init__.py | 5 +---- real_estate/__manifest__.py | 22 ++++++++++++---------- real_estate/models/__init__.py | 6 ++---- real_estate/models/estate_property.py | 18 +++++++++++------- real_estate/security/ir.model.access.csv | 2 ++ real_estate/static/description/icon.png | Bin 0 -> 14466 bytes 6 files changed, 28 insertions(+), 25 deletions(-) create mode 100644 real_estate/security/ir.model.access.csv create mode 100644 real_estate/static/description/icon.png diff --git a/real_estate/__init__.py b/real_estate/__init__.py index e9917144f69..0650744f6bc 100644 --- a/real_estate/__init__.py +++ b/real_estate/__init__.py @@ -1,4 +1 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import models \ No newline at end of file +from . import models diff --git a/real_estate/__manifest__.py b/real_estate/__manifest__.py index f14ba9d8f5a..8f5680a39dd 100644 --- a/real_estate/__manifest__.py +++ b/real_estate/__manifest__.py @@ -1,12 +1,14 @@ - { - 'name': 'real_estate', - 'version': '1.0', - 'depends': ['base'], - 'category': 'tutorials', - 'author': "prcha-odoo", - 'license': 'LGPL-3', - 'description': "A real estate module", - 'installable': True, - 'application': True, + "name": "real_estate", + "version": "1.0", + "depends": ["base"], + "category": "tutorials", + "author": "prcha-odoo", + "license": "LGPL-3", + "description": "A real estate module", + "installable": True, + "application": True, + "data": [ + "security/ir.model.access.csv", + ], } diff --git a/real_estate/models/__init__.py b/real_estate/models/__init__.py index a37be05899b..7de8335eb4f 100644 --- a/real_estate/models/__init__.py +++ b/real_estate/models/__init__.py @@ -1,4 +1,2 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. - -from . import estate_property \ No newline at end of file +from . import estate_property + \ No newline at end of file diff --git a/real_estate/models/estate_property.py b/real_estate/models/estate_property.py index 81b7990bb88..edf4acd2957 100644 --- a/real_estate/models/estate_property.py +++ b/real_estate/models/estate_property.py @@ -1,5 +1,6 @@ from odoo import fields, models + class EstateProperty(models.Model): _name = "estate.property" _description = "real estate property module" @@ -8,11 +9,10 @@ class EstateProperty(models.Model): description = fields.Text(string="Description") postcode = fields.Char(string="Postal Code") date_availability = fields.Date( - string='Available From', - default=lambda self: fields.Date.today() + string="Available From", default=lambda self: fields.Date.today() ) - expected_price = fields.Float(string='Expected Price', required=True) - selling_price = fields.Float(string='Selling Price', required=True) + expected_price = fields.Float(string="Expected Price", required=True) + selling_price = fields.Float(string="Selling Price", required=True) bedrooms = fields.Integer(string="Bedroom Count") living_area = fields.Integer(string="Living Area Count") facades = fields.Integer(string="Facades Count") @@ -22,6 +22,10 @@ class EstateProperty(models.Model): garden_orientation = fields.Selection( string="Garden Orientation", selection=[ - ('north','North'),('south','South'),('east','East'),('west','West') - ] - ) \ No newline at end of file + ("north", "North"), + ("south", "South"), + ("east", "East"), + ("west", "West"), + ], + ) + active = fields.Boolean(string="Field Activity Status", default=True) diff --git a/real_estate/security/ir.model.access.csv b/real_estate/security/ir.model.access.csv new file mode 100644 index 00000000000..d9d6ba57cc5 --- /dev/null +++ b/real_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 diff --git a/real_estate/static/description/icon.png b/real_estate/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..622335d712d851c7181cf4d8bed53ce8f0ab581d GIT binary patch literal 14466 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