Skip to content
1 change: 1 addition & 0 deletions estate/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
25 changes: 25 additions & 0 deletions estate/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
'name': 'Real Estate',
'summary': 'Manage real estate properties and offers',
'description': "This module allows managing property advertisements,including property details, offers, and related data.",
'author': 'Sudarshan Maity (sumai)',
'website': '',
'category': 'Real Estate',
'version': '1.0',
'license': 'LGPL-3',
'depends': [
'base',
],

'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',
],

'installable': True,
'application': True,
}
4 changes: 4 additions & 0 deletions estate/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from . import estate_property
from . import estate_property_type
from . import estate_property_tag
from . import estate_property_offer
60 changes: 60 additions & 0 deletions estate/models/estate_property.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from datetime import timedelta

from odoo import models, fields, api


class EstateProperty(models.Model):
_name = 'estate.property'
_description = 'Real Estate Property'

name = fields.Char(string="Title", required=True)
description = fields.Text()
postcode = fields.Char()
date_availability = fields.Date(string="Available From", copy=False, default=lambda self: fields.Date.today() + timedelta(days=90))
expected_price = fields.Float(string="Expected Price", required=True)
selling_price = fields.Float(string="Selling Price", readonly=True, copy=False)
bedrooms = fields.Integer(string="Bedrooms", default=2)
living_area = fields.Integer(string="Living Area (sqm)", copy=False)
garden_area = fields.Integer(string="Garden Area (sqm)")
total_area = fields.Integer(string="Total Area (sqm)", compute="_compute_total_area", store=True)
facades = fields.Integer()
garage = fields.Boolean()
garden = fields.Boolean()
garden_orientation = fields.Selection(
[
('north', "North"),
('south', "South"),
('east', "East"),
('west', "West"),
],
string="Garden Orientation"
)
active = fields.Boolean(string="is Active", default=True)
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')
swimming_pool = fields.Boolean(string="Swimming Pool")
property_age = fields.Integer(string="Property Age")
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="Salesperson", default=lambda self: self.env.user)
tags_ids = fields.Many2many("estate.property.tag", string="Property Tags")
offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers")
best_price = fields.Float(string="Best Offer", compute="_compute_best_price")

@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.price")
def _compute_best_price(self):
for record in self:
prices = record.offer_ids.mapped("price")
record.best_price = max(prices) if prices else 0.0
16 changes: 16 additions & 0 deletions estate/models/estate_property_offer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from odoo import models, fields


class EstatePropertyOffer(models.Model):
_name = "estate.property.offer"
_description = "Property Offer"

price = fields.Float()
status = fields.Selection(
[
('accepted', "Accepted"),
('refused', "Refused"),
],
string="Current Status", copy=False)
partner_id = fields.Many2one("res.partner", string="Partner", required=True)
property_id = fields.Many2one("estate.property", string="Property", required=True)
8 changes: 8 additions & 0 deletions estate/models/estate_property_tag.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from odoo import models, fields


class EstatePropertyTag(models.Model):
_name = 'estate.property.tag'
_description = 'Estate Property Tag'

name = fields.Char(string="Tags Name", required=True)
8 changes: 8 additions & 0 deletions estate/models/estate_property_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from odoo import models, fields


class EstatePropertyType(models.Model):
_name = 'estate.property.type'
_description = 'Real Estate Property Types'

name = fields.Char(string="Type Name", required=True)
5 changes: 5 additions & 0 deletions estate/security/ir.model.access.csv
Original file line number Diff line number Diff line change
@@ -0,0 +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
51 changes: 51 additions & 0 deletions estate/views/estate_menus.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<odoo>

<!-- Root Menu -->
<menuitem
id="menu_real_estate_root"
name="Real Estate"
sequence="1"/>

<!-- First Level Menu Advertisement -->
<menuitem
id="menu_real_estate_advertisements"
name="Advertisements"
parent="menu_real_estate_root"
sequence="1"/>

<!-- Second Level Menu -->
<menuitem
id="menu_real_estate_properties"
name="Properties"
parent="menu_real_estate_advertisements"
action="action_estate_property"
sequence="1"/>

<!-- First Level Menu Settings -->
<menuitem
id="menu_real_estate_settings"
name="Settings"
parent="menu_real_estate_root"
sequence="2"/>

<menuitem
id="menu_real_estate_property_types"
name="Property Types"
parent="menu_real_estate_settings"
action="action_estate_property_type"
sequence="1"/>

<menuitem
id="menu_real_estate_property_tags"
name="property Tags"
parent="menu_real_estate_settings"
action="action_estate_property_tag"
sequence="2"/>

<!-- <menuitem
id="menu_real_estate_property_offer"
name="Property Offfer"
parent="menu_real_estate_settings"
action="action_estate_property_offer"/> -->

</odoo>
39 changes: 39 additions & 0 deletions estate/views/estate_property_offer_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<odoo>

<!-- <record id="action_estate_property_offer" model="ir.actions.act_window">
<field name="name">Property Offer</field>
<field name="res_model">estate.property.offer</field>
<field name="view_mode">list,form</field>
</record> -->

<record id="list_estate_property_offer" model="ir.ui.view">
<field name="name">estate.property.offer.list</field>
<field name="model">estate.property.offer</field>
<field name="arch" type="xml">
<list string="Property Offer">
<field name="price"/>
<field name="status"/>
<field name="partner_id"/>
<field name="property_id"/>
</list>
</field>
</record>

<record id="form_estate_propety_offer" model="ir.ui.view">
<field name="name">estate.property.offer.form</field>
<field name="model">estate.property.offer</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="price"/>
<field name="partner_id"/>
<field name="status"/>
<field name="property_id"/>
</group>
</sheet>
</form>
</field>
</record>

</odoo>
33 changes: 33 additions & 0 deletions estate/views/estate_property_tag_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<odoo>

<record id="action_estate_property_tag" model="ir.actions.act_window">
<field name="name">Property Tags</field>
<field name="res_model">estate.property.tag</field>
<field name="view_mode">list,form</field>
</record>

<record id="list_estate_property_tag" model="ir.ui.view">
<field name="name">estate.property.tag.list</field>
<field name="model">estate.property.tag</field>
<field name="arch" type="xml">
<list string="Property Tags">
<field name="name"/>
</list>
</field>
</record>

<record id="form_estate_property_tag" model="ir.ui.view">
<field name="name">estate.property.tag.form</field>
<field name="model">estate.property.tag</field>
<field name="arch" type="xml">
<form string="Property Tags">
<sheet>
<group>
<field name="name"/>
</group>
</sheet>
</form>
</field>
</record>

</odoo>
34 changes: 34 additions & 0 deletions estate/views/estate_property_type_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<odoo>

<record id="action_estate_property_type" model="ir.actions.act_window">
<field name="name">Porperty Types</field>
<field name="res_model">estate.property.type</field>
<field name='view_mode'>list,form</field>
</record>

<record id="view_estate_property_type_list" model="ir.ui.view">
<field name="name">estate.property.type.list</field>
<field name="model">estate.property.type</field>
<field name="arch" type="xml">
<list string="Property types" editable="bottom">

<field name="name" />
</list>
</field>
</record>

<record id="view_estate_property_types_form" model="ir.ui.view">
<field name="name">estate.property.type.form</field>
<field name="model">estate.property.type</field>
<field name="arch" type="xml">
<form string="Property Types">
<sheet>
<group>
<field name="name"/>
</group>
</sheet>
</form>
</field>
</record>

</odoo>
Loading