Skip to content

Commit cefa841

Browse files
committed
[IMP] estate: add sprinkles
add status bar in property set order in model add handle list view of property type add tag color
1 parent 12b8775 commit cefa841

File tree

7 files changed

+68
-52
lines changed

7 files changed

+68
-52
lines changed

estate/models/estate_property.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
from odoo import models, fields, api
21
from dateutil.relativedelta import relativedelta
2+
3+
from odoo import models, fields, api
34
from odoo.exceptions import UserError, ValidationError
45
from odoo.tools.float_utils import float_compare
56

67

78
class EstateProperty(models.Model):
89
_name = 'estate.property'
910
_description = "Real Estate Property"
11+
_order = "id desc"
1012

1113
name = fields.Char(required=True)
1214
description = fields.Text()
@@ -45,7 +47,7 @@ class EstateProperty(models.Model):
4547
offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers")
4648
total_area = fields.Float(compute="_compute_total_area")
4749
best_offer = fields.Float(compute="_compute_best_offer")
48-
50+
4951
@api.depends('living_area', 'garden_area')
5052
def _compute_total_area(self):
5153
for record in self:
@@ -58,7 +60,7 @@ def _compute_best_offer(self):
5860
record.best_offer = 0
5961
else:
6062
record.best_offer = max(record.mapped('offer_ids.price'))
61-
63+
6264
@api.onchange('garden')
6365
def _onchange_garden(self):
6466
if self.garden:
@@ -80,16 +82,21 @@ def sold_property(self):
8082
if record.state == 'cancelled':
8183
raise UserError("cancelled property cannot be sold.")
8284
else:
83-
record.state = 'sold'
85+
record.state = 'sold'
86+
87+
_check_expected_price = models.Constraint(
88+
'CHECK(expected_price >= 0)',
89+
'expected price must be positive'
90+
)
8491

85-
_sql_constraints = [
86-
('check_expected_price', 'CHECK(expected_price>=0)', 'expected price must be positive'),
87-
('check_selling_price', 'CHECK(selling_price>=0)', 'selling price must be positive')
88-
]
92+
_check_selling_price = models.Constraint(
93+
'CHECK(selling_price >= 0)',
94+
'selling price must be positive'
95+
)
8996

90-
@api.constrains('selling_price', 'expected_price', 'state')
97+
@api.constrains('selling_price', 'expected_price', 'state')
9198
def _check_selling_price(self):
9299
for record in self:
93-
if float_compare(record.selling_price, 0.9 * record.expected_price, precision_digits=2) < 0 and (record.state == 'sold' or record.state == 'offer_accepted'):
94-
raise ValidationError("the selling price is lower")
95-
100+
if record.state in ['sold', 'offer_accepted']:
101+
if float_compare(record.selling_price, 0.9 * record.expected_price, precision_digits=2) < 0:
102+
raise ValidationError("the selling price is lower")

estate/models/estate_property_offer.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
from odoo import models, fields, api
21
from dateutil.relativedelta import relativedelta
2+
3+
from odoo import models, fields, api
34
from odoo.exceptions import UserError, ValidationError
45

56

67
class EstatePropertyOffer(models.Model):
78
_name = 'estate.property.offer'
89
_description = "Estate Property Offer"
10+
_order = "price desc"
911

1012
price = fields.Float()
1113
status = fields.Selection(
@@ -18,21 +20,17 @@ class EstatePropertyOffer(models.Model):
1820
property_id = fields.Many2one("estate.property", required=True)
1921
validity = fields.Integer(default=7)
2022
date_deadline = fields.Date(compute="_compute_deadline", inverse="_inverse_deadline")
21-
22-
@api.depends('validity')
23+
24+
@api.depends("validity")
2325
def _compute_deadline(self):
2426
for record in self:
25-
if record.create_date:
26-
record.date_deadline = fields.Date.to_date(record.create_date) + relativedelta(days=record.validity)
27-
else:
28-
record.date_deadline = 0
27+
default_creation_date = record.create_date or fields.Date.today()
28+
record.date_deadline = relativedelta(days=record.validity) + default_creation_date
2929

3030
def _inverse_deadline(self):
3131
for record in self:
32-
if record.create_date:
33-
record.validity = (record.date_deadline - fields.Date.to_date(record.create_date)).days
34-
else:
35-
record.validity = 0
32+
default_creation_date = record.create_date or fields.Date.today()
33+
record.validity = (record.date_deadline - fields.Date.to_date(default_creation_date)).days
3634

3735
def action_accept(self):
3836
for record in self:
@@ -48,5 +46,11 @@ def action_refuse(self):
4846
for record in self:
4947
if record.status == 'accepted':
5048
raise UserError("Property already accepted")
51-
else:
49+
else:
5250
record.status = 'refused'
51+
52+
_check_offer_price = models.Constraint(
53+
'CHECK(price>=0)',
54+
'offer price must be positive',
55+
)
56+
Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
from odoo import models,fields
1+
from odoo import models, fields
22

33

44
class EstatePropertyTag(models.Model):
55
_name = 'estate.property.tag'
66
_description = "Estate Property Tag"
7+
_order = "name"
78

89
name = fields.Char()
910
property_ids = fields.Many2many('estate.property')
10-
11-
_sql_constraints = [
12-
('unique_name', 'UNIQUE(name)', 'name already exists!')
13-
]
11+
color=fields.Integer()
12+
13+
_unique_name = models.Constraint(
14+
'UNIQUE(name)',
15+
'name already exists!',
16+
)

estate/models/estate_property_type.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22

33

44
class EstatePropertyType(models.Model):
5-
_name = 'estate.property.type'
5+
_name = 'estate.property.type'
66
_description = "Real Estate Property Type"
7+
_order = "sequence"
78

89
name = fields.Char(required=True)
910
property_ids = fields.One2many('estate.property', 'property_type_id')
11+
sequence = fields.Integer(string="Sequence", default=1)
1012

11-
_sql_constraints = [
12-
('unique_name', 'UNIQUE(name)', 'name already exists!'),
13-
]
13+
_unique_name = models.Constraint(
14+
'UNIQUE(name)',
15+
'name already exists!',
16+
)

estate/views/estate_property_tag_views.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0"?>
22
<odoo>
3-
<record id="estate_property_type_search" model="ir.ui.view">
3+
<record id="estate_property_tag_search" model="ir.ui.view">
44
<field name="model">estate.property.tag</field>
55
<field name="arch" type="xml">
66
<search string="Search Properties">
@@ -9,7 +9,7 @@
99
</field>
1010
</record>
1111

12-
<record id="estate_property_type_list" model="ir.ui.view">
12+
<record id="estate_property_tag_list" model="ir.ui.view">
1313
<field name="model">estate.property.tag</field>
1414
<field name="arch" type="xml">
1515
<list string="List">
@@ -18,7 +18,7 @@
1818
</field>
1919
</record>
2020

21-
<record id="estate_property_type_form" model="ir.ui.view">
21+
<record id="estate_property_tag_form" model="ir.ui.view">
2222
<field name="model">estate.property.tag</field>
2323
<field name="arch" type="xml">
2424
<form>

estate/views/estate_property_type_views.xml

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,18 @@
11
<?xml version="1.0"?>
22
<odoo>
3-
<record id="estate_property_type_search" model="ir.ui.view">
4-
<field name="model">estate.property.type</field>
5-
<field name="arch" type="xml">
6-
<search string="Search Properties">
7-
<field name="name"/>
8-
</search>
9-
</field>
10-
</record>
11-
123
<record id="estate_property_type_list" model="ir.ui.view">
134
<field name="model">estate.property.type</field>
145
<field name="arch" type="xml">
15-
<list string="List">
16-
<field name="name"/>
6+
<list>
7+
<field name="sequence" widget="handle"/>
8+
<field name="name"/>
9+
<field name="property_ids"/>
1710
</list>
1811
</field>
1912
</record>
2013

2114
<record id="estate_property_type_form" model="ir.ui.view">
22-
<field name="model">estate.property.type</field>
15+
<field name="model">estate.property.type</field>
2316
<field name="arch" type="xml">
2417
<form>
2518
<sheet>
@@ -29,6 +22,11 @@
2922
</group>
3023
</group>
3124
<notebook>
25+
<page name="Properties">
26+
<group>
27+
<field name="property_ids"/>
28+
</group>
29+
</page>
3230
</notebook>
3331
</sheet>
3432
</form>

estate/views/estate_property_views.xml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919
<record id="estate_property_list" model="ir.ui.view">
2020
<field name="model">estate.property</field>
2121
<field name="arch" type="xml">
22-
<list string="List">
22+
<list>
2323
<field name="name"/>
2424
<field name="postcode"/>
2525
<field name="bedrooms"/>
2626
<field name="total_area"/>
2727
<field name="selling_price"/>
2828
<field name="date_availability"/>
29-
<field name="property_type_id"/>
29+
<field name="property_type_id"/>
3030
</list>
3131
</field>
3232
</record>
@@ -38,11 +38,13 @@
3838
<header>
3939
<button name="cancel_property" type="object" string="Cancel"/>
4040
<button name="sold_property" type="object" string="Sold"/>
41+
<field name="state" widget="statusbar" statusbar_visible="new,offer_received,offer_accepted,sold,cancelled"/>
4142
</header>
4243
<sheet>
4344
<group>
4445
<group>
45-
<field name="tag_ids" widget="many2many_tags"/>
46+
<field name="tag_ids" widget="many2many_tags" options="{'color_field': 'color'}"/>
47+
<field name="property_type_id" options="{'no_create': true, 'no_open': true}" />
4648
<field name="name"/>
4749
<field name="state"/>
4850
<field name="date_availability"/>
@@ -59,7 +61,6 @@
5961
<group>
6062
<group>
6163
<field name="description"/>
62-
<field name="property_type_id"/>
6364
<field name="postcode"/>
6465
<field name="bedrooms"/>
6566
<field name="facades"/>

0 commit comments

Comments
 (0)