Skip to content

Commit 5223520

Browse files
author
Ana Zurabashvili [anzu]
committed
init commit
1 parent 4c650f3 commit 5223520

21 files changed

+448
-0
lines changed

.idea/.gitignore

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/inspectionProfiles/Project_Default.xml

+34
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/inspectionProfiles/profiles_settings.xml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/material_theme_project_new.xml

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/misc.xml

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/modules.xml

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/tutorials_annzzu.iml

+11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/vcs.xml

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

estate/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# -*- coding: utf-8 -*-
2+
from . import models

estate/__manifest__.py

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# -*- coding: utf-8 -*-
2+
{
3+
'name': "Real Estate",
4+
5+
'summary': """
6+
Real Estate
7+
""",
8+
'description': """
9+
Real Estate
10+
""",
11+
'author': "Odoo",
12+
'website': "https://www.odoo.com/",
13+
'category': 'Tutorials/Real Estate',
14+
'version': '0.1',
15+
'application': True,
16+
'installable': True,
17+
'depends': ['base'],
18+
'data': [
19+
"security/ir.model.access.csv",
20+
"views/estate_property_views.xml",
21+
"views/estate_property_type_views.xml",
22+
"views/estate_property_tag_views.xml",
23+
"views/estate_menus.xml",
24+
],
25+
'assets': {
26+
},
27+
'license': 'AGPL-3'
28+
}

estate/models/__init__.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# -*- coding: utf-8 -*-
2+
from . import estate_property
3+
from . import estate_property_tag
4+
from . import estate_property_type
5+
from . import estate_property_offer

estate/models/estate_property.py

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
from odoo import api, fields, models
2+
from dateutil.relativedelta import relativedelta
3+
from odoo.exceptions import UserError
4+
5+
class EstateProperty(models.Model):
6+
_name = "estate.property"
7+
_description = "Estate Property"
8+
9+
name = fields.Char(string="Property Name", required=True)
10+
description = fields.Text(string="Property Description")
11+
postcode = fields.Char(string="Property Postcode")
12+
date_availability = fields.Date(string="Property Date Availability", copy=False,
13+
default=lambda
14+
self: fields.Date.today() + relativedelta(
15+
months=3))
16+
expected_price = fields.Float(string="Property Expected Price", required=True)
17+
selling_price = fields.Float(string="Selling Price", readonly=True, copy=False)
18+
bedrooms = fields.Integer(string="Property Bedrooms", default=2)
19+
living_area = fields.Integer(string="Living Area")
20+
facades = fields.Integer(string="facades")
21+
garage = fields.Boolean(string="Garage")
22+
garden = fields.Boolean(string="Garden")
23+
garden_area = fields.Integer(string="Garden Area (sqm)")
24+
garden_orientation = fields.Selection(
25+
string="Garden Orientation",
26+
selection=[
27+
('north', "North"),
28+
('south', "South"),
29+
('east', "East"),
30+
('west', "West"),
31+
],
32+
)
33+
state = fields.Selection(
34+
string="State",
35+
selection=[
36+
('new', "New"),
37+
('received', "Offer Received"),
38+
('accepted', "Offer Accepted"),
39+
('sold', "Sold"),
40+
('cancelled', "Cancelled"),
41+
], required=True, copy=False, default='new',
42+
)
43+
sale_man_id = fields.Many2one('res.users', string="Sales Man")
44+
buyer_id = fields.Many2one('res.users', string="Buyer")
45+
46+
property_type_id = fields.Many2one('estate.property.type', string="Type")
47+
tag_ids = fields.Many2many('estate.property.tag', string="Tags")
48+
offer_ids = fields.One2many('estate.property.offer', 'property_id', string="Offers")
49+
50+
total_area = fields.Float(string="Total Area", compute="_compute_total_area",
51+
store=True)
52+
53+
@api.depends('garden_area', 'living_area')
54+
def _compute_total_area(self):
55+
for val in self:
56+
val.total_area = val.garden_area + val.living_area
57+
58+
best_offer_id = fields.Many2one("estate.property.offer", string="Best Offer",
59+
compute='_compute_best_offer', store=True)
60+
best_price = fields.Float(string="Best price",
61+
compute='_compute_best_offer', store=True)
62+
63+
@api.depends('offer_ids.price')
64+
def _compute_best_offer(self):
65+
for val in self:
66+
if val.offer_ids:
67+
val.best_offer_id = max(val.offer_ids, key=lambda x: x.price)
68+
val.best_price = max(val.offer_ids.mapped('price')) or 0.0
69+
else:
70+
val.best_offer_id, val.best_price = 0, 0
71+
72+
@api.onchange('garden')
73+
def _onchange_garden(self):
74+
if self.garden:
75+
self.garden_area = 10
76+
self.garden_orientation = 'north'
77+
else:
78+
self.garden_area = None
79+
self.garden_orientation = None
80+
81+
def action_sold(self):
82+
if self.state == 'cancelled':
83+
raise UserError('Cancelled property cannot be sold.')
84+
self.state = 'sold'
85+
86+
def action_cancel(self):
87+
for val in self:
88+
if val.state == 'sold':
89+
raise UserError('Sold property cannot be cancelled.')
90+
val.state = 'cancelled'
+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from dateutil.relativedelta import relativedelta
2+
from datetime import datetime
3+
from odoo import api, fields, models
4+
5+
6+
class EstatePropertyOffer(models.Model):
7+
_name = "estate.property.offer"
8+
_description = "Estate Property Offer"
9+
10+
price = fields.Float(string="Price")
11+
status = fields.Selection(
12+
selection=[("accepted", "Accepted"), ("refused", "Refused")],
13+
string="Status", copy=False,
14+
)
15+
partner_id = fields.Many2one("res.partner", string="Partner",
16+
required=True)
17+
property_id = fields.Many2one('estate.property', string="Property",
18+
readonly=True)
19+
20+
date_deadline = fields.Date(string="Deadline Date",
21+
compute="_compute_date_deadline", store=True)
22+
validity = fields.Integer(string="Validity Days", default=7)
23+
24+
@api.depends("validity")
25+
def _compute_date_deadline(self):
26+
for val in self:
27+
val.date_deadline = datetime.now() + relativedelta(days=val.validity)
28+
29+
def accept_offer(self):
30+
self.write({"status": "refused", "partner_id": None})
31+
for val in self:
32+
val.status = 'accepted'
33+
val.property_id.write({
34+
'buyer_id': val.partner_id.id,
35+
'selling_price': val.price,
36+
})
37+
38+
def refuse_offer(self):
39+
for val in self:
40+
val.status = 'refused'

estate/models/estate_property_tag.py

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from odoo import fields, models
2+
3+
4+
class EstatePropertyTag(models.Model):
5+
_name = "estate.property.tag"
6+
_description = "Estate Property Tag"
7+
8+
name = fields.Char(string="Property Tag", required=True)

estate/models/estate_property_type.py

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from odoo import fields, models
2+
3+
4+
class EstatePropertyType(models.Model):
5+
_name = "estate.property.type"
6+
_description = "Estate Property Type"
7+
8+
name = fields.Char(string="Property Type", required=True)

estate/security/ir.model.access.csv

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2+
estate.access_estate_property,access_estate_property,estate.model_estate_property,base.group_user,1,1,1,1
3+
estate.access_estate_property_tag,access_estate_property_tag,estate.model_estate_property_tag,base.group_user,1,1,1,1
4+
estate.access_estate_property_type,access_estate_property_type,estate.model_estate_property_type,base.group_user,1,1,1,1
5+
estate.access_estate_property_offer,access_estate_property_offer,estate.model_estate_property_offer,base.group_user,1,1,1,1

estate/static/description/icon.png

23.5 KB
Loading

estate/views/estate_menus.xml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0"?>
2+
<odoo>
3+
<menuitem id="main_menu_real_estate" name="Real Estate">
4+
<menuitem id="menu_advertisements" name="Advertisements">
5+
<menuitem id="menu_estate_property" action="estate_property_action" name="Estate Property"/>
6+
</menuitem>
7+
<menuitem id="menu_settings" name="Settings">
8+
<menuitem id="menu_property_type" action="estate_property_type_action" name="Property Types"/>
9+
<menuitem id="menu_property_tag" action="estate_property_tag_action" name="Property Tags"/>
10+
</menuitem>
11+
</menuitem>
12+
</odoo>
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<odoo>
2+
<data>
3+
<record id="estate_property_tag_list" model="ir.ui.view">
4+
<field name="name">estate.property.tag.list</field>
5+
<field name="model">estate.property.tag</field>
6+
<field name="arch" type="xml">
7+
<list string="Estate Property Tag" editable="bottom">
8+
<field name="name"/>
9+
</list>
10+
</field>
11+
</record>
12+
13+
<record id="estate_property_tag_action" model="ir.actions.act_window">
14+
<field name="name">Estate Property Tag</field>
15+
<field name="res_model">estate.property.tag</field>
16+
<field name="view_mode">list,form</field>
17+
</record>
18+
</data>
19+
</odoo>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<odoo>
2+
<data>
3+
<record id="estate_property_type_list" model="ir.ui.view">
4+
<field name="name">estate.property.list</field>
5+
<field name="model">estate.property</field>
6+
<field name="arch" type="xml">
7+
<list string="Estate Property" editable="bottom">
8+
<field name="name"/>
9+
</list>
10+
</field>
11+
</record>
12+
13+
<record id="estate_property_type_action" model="ir.actions.act_window">
14+
<field name="name">Estate Property Type</field>
15+
<field name="res_model">estate.property.type</field>
16+
<field name="view_mode">list,form</field>
17+
</record>
18+
</data>
19+
</odoo>

0 commit comments

Comments
 (0)