diff --git a/estate/__init__.py b/estate/__init__.py new file mode 100644 index 00000000000..ce9807d14fd --- /dev/null +++ b/estate/__init__.py @@ -0,0 +1 @@ +from . import models # noqa: F401 diff --git a/estate/__manifest__.py b/estate/__manifest__.py new file mode 100644 index 00000000000..d8092989963 --- /dev/null +++ b/estate/__manifest__.py @@ -0,0 +1,19 @@ +{ + "name": "Real Estate", + "depends": ["base"], + "application": True, + "installable": True, + "author": "Aditya Maurya", + "license": "LGPL-3", + "category": "Real Estate", + "data": [ + "security/ir.model.access.csv", + "views/estate_property_type_views.xml", + "views/estate_property_tag_views.xml", + "views/estate_property_views.xml", + "views/estate_menu.xml", + ], + "demo": [ + "data/estate_property_demo.xml", + ], +} diff --git a/estate/data/estate_property_demo.xml b/estate/data/estate_property_demo.xml new file mode 100644 index 00000000000..13e36beffb1 --- /dev/null +++ b/estate/data/estate_property_demo.xml @@ -0,0 +1,195 @@ + + + + + + Cozy Suburban Cottage + A lovely 2-bedroom house with a spacious backyard. + 90210 + 2026-09-01 + 250000 + 0 + 2 + 120 + 2 + True + True + 50 + south + new + + + + + + Modern Downtown Apartment + Luxury high-rise unit in the heart of the city. + 10001 + 2026-10-15 + + 450000 + 0 + 1 + 75 + 1 + False + False + offer_received + + + + + + Spacious Family Villa + Large villa featuring 5 bedrooms, pool, and huge garden. + 33101 + 2026-08-20 + + 850000 + 830000 + 5 + 550 + 4 + True + True + 200 + west + sold + + + + + + Luxury Penthouse Suite + Top-floor penthouse with private rooftop terrace. + 90001 + 2027-01-15 + 1200000 + 0 + + 3 + 280 + 4 + True + True + 100 + west + new + + + + + + Suburban Ranch House + Single-story ranch home with a broad front porch. + 75002 + 2026-09-10 + + 290000 + 285000 + 3 + 160 + 2 + True + True + 80 + east + offer_accepted + + + + + + Minimalist Urban Loft + Open-concept loft with industrial design elements. + 60611 + 2026-10-01 + 380000 + 0 + False + 1 + 95 + 2 + False + False + cancelled + + + + + Beachfront Condo + Stunning ocean views with private balcony access. + 33139 + 2027-03-01 + 600000 + 0 + 2 + 110 + 2 + True + False + new + + + + + + Mountain View Retreat + Peaceful chalet nestled in the mountains. + 80202 + 2026-12-01 + + 510000 + 500000 + 3 + 180 + 3 + True + True + 150 + north + offer_received + + + + + + Historic Townhouse + Classic architecture with modern interior renovations. + 02108 + 2026-08-15 + 720000 + 0 + 3 + 210 + 2 + False + True + 40 + south + new + + + + + + Grand Estate Manor + Massive country estate with extensive living space. + 75001 + 2027-02-15 + 1900000 + 1850000 + 6 + 580 + 4 + True + True + 800 + south + sold + + + + + + 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..90d5f490af4 --- /dev/null +++ b/estate/models/estate_property.py @@ -0,0 +1,59 @@ +from datetime import datetime + +from dateutil.relativedelta import relativedelta +from odoo import fields, models + + +class EstateProperty(models.Model): + _name = "estate.property" + _description = "Real Estate Property" + + name = fields.Char("Title", required=True) + description = fields.Text("Description") + postcode = fields.Char("Postcode") + + def _default_Date(self): + return datetime.now() + relativedelta(months=3) + + property_type_id = fields.Many2one("estate.property.type", "Type") + date_availability = fields.Date("Available From", copy=False, default=_default_Date) + expected_price = fields.Float("Expected Price", required=True) + selling_price = fields.Float( + "Selling Price", + readonly=True, + copy=False, + ) + sales_man_id = fields.Many2one( + "res.users", string="Salesperson", default=lambda self: self.env.user + ) + buyer_id = fields.Many2one("res.partner", string="Buyer") + property_tag_ids = fields.Many2many("estate.property.tag", string="Tags") + property_offer_id = fields.One2many("estate.property.offer", "property_id", "Offer") + active = fields.Boolean(string="Active", default=True) + bedrooms = fields.Integer("Bedrooms", 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"), + ] + ) + state = fields.Selection( + [ + ("new", "New"), + ("offer_received", "Offer Received"), + ("offer_accepted", "Offer Accepted"), + ("sold", "Sold"), + ("cancelled", "Cancelled"), + ], + string="Status", + required=True, + copy=False, + default="new", + ) diff --git a/estate/models/estate_property_offer.py b/estate/models/estate_property_offer.py new file mode 100644 index 00000000000..0b691ec6c91 --- /dev/null +++ b/estate/models/estate_property_offer.py @@ -0,0 +1,13 @@ +from odoo import fields, models + + +class PropertyOffer(models.Model): + _name = "estate.property.offer" + _description = "Property Offer for Estate Property" + + price = fields.Float("Price", required=True) + 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) diff --git a/estate/models/estate_property_tag.py b/estate/models/estate_property_tag.py new file mode 100644 index 00000000000..ae6c547e650 --- /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 = "Different Tags for Property" + + name = fields.Char("Tag") diff --git a/estate/models/estate_property_type.py b/estate/models/estate_property_type.py new file mode 100644 index 00000000000..09550a5b76b --- /dev/null +++ b/estate/models/estate_property_type.py @@ -0,0 +1,8 @@ +from odoo import fields, models + + +class PropertyType(models.Model): + _name = "estate.property.type" + _description = "Properties Type" + + name = fields.Char("Type", required=True) diff --git a/estate/security/ir.model.access.csv b/estate/security/ir.model.access.csv new file mode 100644 index 00000000000..38c56685bde --- /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,model_estate_property,base.group_system,1,1,1,1 +estate.access_estate_porperty_type,access_estate_porperty_type,estate.model_estate_property_type,base.group_system,1,1,1,1 +estate.access_estate_porperty_tag,access_estate_porperty_tag,estate.model_estate_property_tag,base.group_system,1,1,1,1 +estate.access_estate_porperty_offer,access_estate_porperty_offer,estate.model_estate_property_offer,base.group_system,1,1,1,1 diff --git a/estate/static/description/icon.png b/estate/static/description/icon.png new file mode 100644 index 00000000000..82e77f8dcfe Binary files /dev/null and b/estate/static/description/icon.png differ diff --git a/estate/views/estate_menu.xml b/estate/views/estate_menu.xml new file mode 100644 index 00000000000..cc7377bbac1 --- /dev/null +++ b/estate/views/estate_menu.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/estate/views/estate_property_tag_views.xml b/estate/views/estate_property_tag_views.xml new file mode 100644 index 00000000000..7fe380fc9ef --- /dev/null +++ b/estate/views/estate_property_tag_views.xml @@ -0,0 +1,12 @@ + + + + + Properties Tag + estate.property.tag + list,form + + + + + diff --git a/estate/views/estate_property_type_views.xml b/estate/views/estate_property_type_views.xml new file mode 100644 index 00000000000..3976c21186f --- /dev/null +++ b/estate/views/estate_property_type_views.xml @@ -0,0 +1,23 @@ + + + + + + Properties Type + estate.property.type + list,form + + + + + diff --git a/estate/views/estate_property_views.xml b/estate/views/estate_property_views.xml new file mode 100644 index 00000000000..dfc5c1e042c --- /dev/null +++ b/estate/views/estate_property_views.xml @@ -0,0 +1,102 @@ + + + + + Properties + estate.property + list,form + + + + + + + estate.property.list + estate.property + + + + + + + + + + + + + + estate.property.form + estate.property + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + estate.property.search + estate.property + + + + + + + + + +