diff --git a/.gitignore b/.gitignore index b6e47617de1..078cf3876be 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,4 @@ dmypy.json # Pyre type checker .pyre/ +.idea/ \ No newline at end of file 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..50a4c5d0824 --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,17 @@ +{ + "name": "Real Estate", + "depends": ["base"], + "application": True, + "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_menus.xml", + ], + "demo": [ + "demo/estate_property_demo.xml", + ], + 'author': 'Hansil Chapadiya', + 'license': 'LGPL-3' +} diff --git a/estate/demo/estate_property_demo.xml b/estate/demo/estate_property_demo.xml new file mode 100644 index 00000000000..d123684ed92 --- /dev/null +++ b/estate/demo/estate_property_demo.xml @@ -0,0 +1,96 @@ + + + + + Villa Sunset + For Sunset Lovers with sea view + 2026-10-01 + 382016 + 400000000 + 4 + 4000 + 3 + True + True + 500 + north + False + True + new + + + + + Skyline Apartment + Modern luxury apartment in city center + 2026-11-15 + 380015 + 15000000 + 2 + 1200 + 1 + True + False + 0 + False + True + offer_received + + + + + Green Valley Bungalow + Peaceful family home with large garden + 2026-09-30 + 382421 + 25000000 + 3 + 2200 + 4 + True + True + 800 + south + False + True + offer_accepted + + + + + Cozy Studio Flat + Ideal for working professionals + 2026-08-01 + 380009 + 5000000 + 1 + 550 + 2 + False + False + 0 + True + False + sold + + + + + Royal Heights Penthouse + Premium penthouse with private terrace garden + 2026-12-01 + 380054 + 85000000 + 5 + 5500 + 4 + True + True + 350 + east + False + True + new + + + diff --git a/estate/models/__init__.py b/estate/models/__init__.py new file mode 100644 index 00000000000..2f1821a39c1 --- /dev/null +++ b/estate/models/__init__.py @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000000..b3c9b3b69a2 --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,52 @@ +from datetime import timedelta + +from odoo import fields, models + + +class EstateProperty(models.Model): + _name = "estate.property" + _description = "Real Estate Property" + _order = "name" + + name = fields.Char('Property Name', required=True, translate=True) + description = fields.Text('Property Description', required=True) + date_availability = fields.Date(copy=False, default=lambda self: fields.Date.today() + timedelta(days=3)) + postcode = fields.Char('Postal Code') + selling_price = fields.Float('Selling Price', readonly=True, copy=False, default=1000000) + expected_price = fields.Float('Expected Price', required=True) + bedrooms = fields.Integer('No of. Bedrooms', default=2) + living_area = fields.Integer('Living Area') + facades = fields.Integer('Facades') + garage = fields.Boolean('Garage', default=False) + garden = fields.Boolean('Garden', default=False) + garden_area = fields.Integer('Garden Area') + garden_orientation = fields.Selection( + selection=[ + ('north', 'North'), + ('south', 'South'), + ('east', 'East'), + ('west', 'West'), + ], + string='Garden Orientation', + default='north' + ) + sold = fields.Boolean('Sold', default=False) + active = fields.Boolean('Active', default=True) + state = fields.Selection( + selection=[ + ('new', 'New'), + ('offer_received', 'Offer Received'), + ('offer_accepted', 'Offer Accepted'), + ('sold', 'Sold'), + ('cancelled', 'Cancelled'), + ], + string='State', + default='new', + required=True, + copy=False + ) + property_type_id = fields.Many2one("estate.property.type", string='Property Type') + buyer_id = fields.Many2one('res.partner', string='Buyer') + salesperson_id = fields.Many2one('res.users', string='Salesperson', default=lambda self: self.env.user) + property_tag_ids = fields.Many2many('estate.property.tag', string='Property 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..936d29e65dd --- /dev/null +++ b/estate/models/estate_property_offer.py @@ -0,0 +1,18 @@ +from odoo import fields, models + + +class EstatePropertyOffer(models.Model): + _name = 'estate.property.offer' + _description = 'Estate Property Offer' + + price = fields.Float(string='Price') + status = fields.Selection( + selection=[ + ('accepted', 'Accepted'), + ('refused', 'Refused'), + ], + string='Status', + copy=False + ) + 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..fcc34b913d7 --- /dev/null +++ b/estate/models/estate_property_tag.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class EstatePropertyTag(models.Model): + _name = 'estate.property.tag' + _description = 'Estate Property Tag' + + name = fields.Char(string='Property 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..a1b2506324f --- /dev/null +++ b/estate/models/estate_property_type.py @@ -0,0 +1,9 @@ +from odoo import fields, models + + +class EstatePropertyType(models.Model): + _name = 'estate.property.type' + _description = 'Estate Property Type' + _rec_name = 'property_name' + + property_name = fields.Char(required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..312627d2247 --- /dev/null +++ b/estate/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_estate_property,estate.property.name,model_estate_property,base.group_user,1,1,1,1 +access_estate_property_type,estate.property.type,model_estate_property_type,base.group_user,1,1,1,1 +access_estate_property_tag,estate.property.tag,model_estate_property_tag,base.group_user,1,1,1,1 +access_estate_property_offer,estate.property.offer,model_estate_property_offer,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/estate/static/description/icon.png b/estate/static/description/icon.png new file mode 100644 index 00000000000..a4963f14a2f Binary files /dev/null and b/estate/static/description/icon.png differ diff --git a/estate/views/estate_property_menus.xml b/estate/views/estate_property_menus.xml new file mode 100644 index 00000000000..d557b1936a5 --- /dev/null +++ b/estate/views/estate_property_menus.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/estate/views/estate_property_tag_views.xml b/estate/views/estate_property_tag_views.xml new file mode 100644 index 00000000000..a9d72d3e4c7 --- /dev/null +++ b/estate/views/estate_property_tag_views.xml @@ -0,0 +1,8 @@ + + + + Property Tag + estate.property.tag + list,form + + \ No newline at end of file diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml new file mode 100644 index 00000000000..8df8d6fa1ca --- /dev/null +++ b/estate/views/estate_property_type_views.xml @@ -0,0 +1,8 @@ + + + + Property Types + estate.property.type + list,form + + \ 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 00000000000..855da5ebebc --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,115 @@ + + + + estate.property.list + estate.property + + + + + + + + + + + estate.property.form + estate.property + +
+
+ +
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + estate.property.search + estate.property + + + + + + + + + + + + + + + + + + All Properties + estate.property + list,form + {'search_default_group_by_garden_orientation' : 1, 'search_default_group_by_state':1} + + +
\ No newline at end of file