Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
19 changes: 19 additions & 0 deletions estate/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "Estate",
"depends": ["base"],
"application": True,
"data": [
"security/ir.model.access.csv",
"views/estate_property_views.xml",
"views/maintenance_property_views.xml",
"views/estate_property_type_views.xml",
"views/estate_property_tag_views.xml",
"views/estate_property_offer_views.xml",
"data/estate_property_type.xml",
"data/estate_property_tag.xml",
"data/estate_property_demo.xml",
"views/estate_menus.xml",
],
"author": "dheer",
"license": "LGPL-3",
}
51 changes: 51 additions & 0 deletions estate/data/estate_property_demo.xml

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

indentation issue.

Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="estate_property_1" model="estate.property">
<field name="name">apartment-1</field>
<field name="postcode">12345</field>
<field name="bedrooms">2</field>
<field name="living_area">230</field>
<field name="expected_price">10000</field>
<field name="expected_price">30000</field>
<field name="tag_ids"
eval="[ Command.set([ ref('estate.estate_property_tag_1'), ref('estate.estate_property_tag_3') ])]" />
</record>
<record id="estate_property_2" model="estate.property">
<field name="name">apartment-2</field>
<field name="postcode">1245</field>
<field name="bedrooms">2</field>
<field name="living_area">230</field>
<field name="expected_price">10000</field>
<field name="expected_price">30000</field>
<field name="tag_ids"
eval="[ Command.set([ ref('estate.estate_property_tag_3'), ref('estate.estate_property_tag_2') ])]" />

</record>
<record id="estate_property_3" model="estate.property">
<field name="name">apartment-3</field>
<field name="postcode">12345</field>
<field name="bedrooms">2</field>
<field name="living_area">230</field>
<field name="expected_price">10000</field>
<field name="expected_price">30000</field>

</record>
<record id="estate_property_4" model="estate.property">
<field name="name">apartment-4</field>
<field name="postcode">12345</field>
<field name="bedrooms">2</field>
<field name="living_area">230</field>
<field name="expected_price">10000</field>
<field name="expected_price">30000</field>

</record>
<record id="estate_property_5" model="estate.property">
<field name="name">apartment-5</field>
<field name="postcode">127745</field>
<field name="bedrooms">82</field>
<field name="living_area">230</field>
<field name="expected_price">10000</field>
<field name="expected_price">399000</field>

</record>
</odoo>
13 changes: 13 additions & 0 deletions estate/data/estate_property_tag.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<odoo noupdate="1">
<record id="estate_property_tag_1" model="estate.property.tag">
<field name="name">filter</field>
</record>

<record id="estate_property_tag_2" model="estate.property.tag">
<field name="name">reno</field>
</record>

<record id="estate_property_tag_3" model="estate.property.tag">
<field name="name">remodeled</field>
</record>
</odoo>
12 changes: 12 additions & 0 deletions estate/data/estate_property_type.xml

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

indentation issue.

Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<record id="estate_property_type_1" model="estate.property.type">
<field name="name">villa</field>
</record>
<record id="estate_property_type_2" model="estate.property.type">
<field name="name">apartment</field>
</record>
<record id="estate_property_type_3" model="estate.property.type">
<field name="name">balcony</field>
</record>
</odoo>
29 changes: 29 additions & 0 deletions estate/estate_property_offer_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="estate_property_offer_list" 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="offers" editable="top">
<field name="price" string="Price"/>
<field name="partner_id" string="Partner"/>
<field name="status" string="Status"/>
</list>
</field>
</record>
<record id="estate_property_offer_form" 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 string="offer">
<sheet>
<group>
<field name="price" string="Price"/>
<field name="partner_id" string="Partner"/>
<field name="status" string="Status"/>
</group>
</sheet>
</form>
</field>
</record>
</odoo>
7 changes: 7 additions & 0 deletions estate/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from . import (
estate_property,
estate_property_offer,
estate_property_tag,
estate_property_type,
maintenance_property,
)
120 changes: 120 additions & 0 deletions estate/models/estate_property.py

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
from dateutil.relativedelta import relativedelta

from odoo import api, fields, models
from odoo.exceptions import UserError


class EstateProperty(models.Model):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should be 2 empty lines before it.

_name = "estate.property"
_description = "real state property"

property_type_id = fields.Many2one(
"estate.property.type",
string="Poperty Type",
)
buyer_id = fields.Many2one(
"res.partner",
string="buyer",
copy=False,
)
salesperson_id = fields.Many2one(
"res.users",
string="sales person",
default=lambda self: self.env.user,
)
tag_ids = fields.Many2many(
"estate.property.tag",
string="Tags",
)
offer_ids = fields.One2many(
"estate.property.offer",
"property_id",
string="Offer",
)
maintenance_ids = fields.One2many(
"maintenance.property",
"prop_id",
String="Maintenance"
)
name = fields.Char(required=True)
active = fields.Boolean(default=True)
description = fields.Text()
postcode = fields.Char()
date_availability = fields.Date(
copy=False,
default=fields.Date.today() + relativedelta(months=3),
)
expected_price = fields.Float(required=True)
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(
[
("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"),
],
required=True,
default="new",
group_expand="_read_group_stage_ids",
copy=False,
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unneccary empty line.

@api.model
def _read_group_stage_ids(self, *args, **kwargs):
return ["new", "offer_received", "offer_accepted", "sold", "cancelled"]

best_price = fields.Float(compute="_compute_price")
total_area = fields.Float(compute="_compute_total")

@api.depends("living_area", "garden_area")
def _compute_total(self):
for record in self:
record.total_area = record.living_area + record.garden_area

@api.depends("offer_ids.price")
def _compute_price(self):
for property in self:
if property.offer_ids:
property.best_price = max(property.offer_ids.mapped("price"))
else:
property.best_price = 0.0

@api.onchange("garden")
def _onchange_garden(self):
if self.garden:
self.garden_area = 10
self.garden_orientation = "north"
else:
self.garden_area = 0
self.garden_orientation = False

def action_cancel(self):
for property in self:
if property.state == "sold":
message = "A sold property cannot be cancelled."
raise UserError(message)
property.state = "cancelled"
return True

def action_sold(self):
for property in self:
if property.state == "cancelled":
message = "A cancelled property cannot be set as sold."
raise UserError(message)
property.state = "sold"
return True
44 changes: 44 additions & 0 deletions estate/models/estate_property_offer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from datetime import timedelta

from odoo import api, fields, models


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

price = fields.Float()
status = fields.Selection(
[
('accepted', 'Acccepted'),
('refused', 'Refused'),
]
)
validity = fields.Integer(default=7)
date_deadline = fields.Date(
compute="_compute_date_deadline", inverse="_inverse_date_deadline"
)
partner_id = fields.Many2one('res.partner', required=True)
property_id = fields.Many2one('estate.property', required=True)

@api.depends('validity', 'create_date')
def _compute_date_deadline(self):
for offer in self:
create_date = offer.create_date or fields.Date.today()
offer.date_deadline = create_date + timedelta(days=offer.validity)

def _inverse_date_deadline(self):
for offer in self:
create_date = offer.create_date.date() or fields.Date.today()
if offer.date_deadline and create_date:
offer.validity = (offer.date_deadline - create_date).days

def action_accept(self):
for record in self:
record.status = "accepted"
return True

def action_refuse(self):
for record in self:
record.status = "refused"
return True
10 changes: 10 additions & 0 deletions estate/models/estate_property_tag.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from odoo import fields, models


class EstatePropertyTag(models.Model):
_name = "estate.property.tag"
_description = "Phis model provides tags for estate property"

name = fields.Char(required=True)
# property_type_id = fields.Many2one("estate.property.type",string="Property Type")
# type_ids=fields.one2many('estate.property.type','',)
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 fields, models


class EstatePropertyType(models.Model):
_name = "estate.property.type"
_description = "model for estate property types"
name = fields.Char(required=True)
# tag_ids = fields.One2many("estate.property.tag","property_type_id",string="Tags")
47 changes: 47 additions & 0 deletions estate/models/maintenance_property.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@

from odoo import fields, models


class EstateProperty(models.Model):
_name = "maintenance.property"
_description = "maintenance property"

title = fields.Char()
prop_id = fields.Many2one('estate.property', required=True)
description = fields.Char()

priority = fields.Selection(
[
("low", "Low"),
("normal", "Normal"),
("high", "High"),
],
)
stage = fields.Selection(
[
("new", "New"),
("assigned", "Assigned"),
("progress", "In Progress"),
("complete", "Complete"),
],
string="Stage",
default="new"
)

assigned = fields.Many2one("res.users", string="Assigned To", default=lambda self: self.env.user)
estimated_cost = fields.Float(string="Estimated Cost")
actual_cost = fields.Float(string="Actual Cost")
date = fields.Date(default=fields.Date.today())
cost = fields.Float()

def mark_assigned(self):
for maintenance in self:
maintenance.stage = "assigned"

def mark_progress(self):
for maintenance in self:
maintenance.stage = "progress"

def mark_complete(self):
for maintenance in self:
maintenance.stage = "complete"
6 changes: 6 additions & 0 deletions estate/security/ir.model.access.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
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_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
access_maintenance_property,maintenance.property,model_maintenance_property,base.group_user,1,1,1,1
Binary file added estate/static/description/icon.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading