Skip to content

Commit 044f5d9

Browse files
[IMP] estate: Server101 WIP Chapter 11
[CLN] estate: code cleanup to match Ruff [CLN] estate: Server101 Cleanup [CLN] estate: Server101 Cleanup final
1 parent 5275915 commit 044f5d9

File tree

9 files changed

+93
-68
lines changed

9 files changed

+93
-68
lines changed

estate/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
from . import models
1+
from . import models

estate/__manifest__.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
1-
# -*- coding: utf-8 -*-
21
{
3-
'name':"estate",
4-
'description':"test",
2+
'name': "estate",
3+
'description': "test",
54
'depends': [
65
'base_setup'
76
],
87
'category': "Tutorials",
98
'installable': True,
109
'application': True,
11-
'data':[
10+
'data': [
1211
'views/estate_property_views.xml',
1312
'views/estate_property_type_views.xml',
1413
'views/estate_property_tag_views.xml',
1514
'views/estate_property_offer_views.xml',
1615
'views/estate_menu_views.xml',
1716
'security/ir.model.access.csv']
1817

19-
}
18+
}

estate/models/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
from . import estate_property
22
from . import estate_property_type
33
from . import estate_property_tag
4-
from . import estate_property_offer
4+
from . import estate_property_offer

estate/models/estate_property.py

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,70 @@
11
from dateutil.relativedelta import relativedelta
2-
from odoo import fields, models,api,exceptions
3-
from odoo.tools.float_utils import float_compare, float_is_zero;
4-
from odoo.exceptions import ValidationError;
2+
from odoo import fields, models, api, exceptions
3+
from odoo.tools.float_utils import float_compare, float_is_zero
4+
from odoo.exceptions import ValidationError
55

66

77
class EstateProperty(models.Model):
88
_name = "estate.property"
99
_description = "Property"
10-
_positif_expected_price = models.Constraint("CHECK (expected_price > 0)","A price can't be negatif");
11-
_positif_selling_price = models.Constraint("CHECK (selling_price > 0)","A price can't be negatif");
10+
_order = "id desc"
1211

13-
state = fields.Selection(selection = [("New","New"), ("Offer_Received","Offer Received") ,("Offer_Accepted","Offer Accepted"), ("Sold","Sold"), ("Cancelled","Cancelled")])
14-
active = fields.Boolean('Active',default=True)
15-
name = fields.Char(required=True,default="Unkown")
12+
_positif_expected_price = models.Constraint("CHECK (expected_price > 0)", "A price can't be negatif")
13+
_positif_selling_price = models.Constraint("CHECK (selling_price > 0)", "A price can't be negatif")
14+
15+
state = fields.Selection(selection=[("New", "New"), ("Offer_Received", "Offer Received"), ("Offer_Accepted", "Offer Accepted"), ("Sold", "Sold"), ("Cancelled", "Cancelled")])
16+
active = fields.Boolean('Active', default=True)
17+
name = fields.Char(required=True, default="Unkown")
1618
description = fields.Text()
1719
postcode = fields.Char()
18-
date_availability = fields.Date("Available From",copy=False,default= fields.Datetime.today() + relativedelta(months=3))
19-
last_seen= fields.Date("Last Seen", default=fields.Datetime.now)
20+
date_availability = fields.Date("Available From", copy=False, default=fields.Datetime.today() + relativedelta(months=3))
21+
last_seen = fields.Date("Last Seen", default=fields.Datetime.now)
2022
expected_price = fields.Float(required=True)
21-
selling_price = fields.Float(readonly=True,copy=False)
22-
best_price = fields.Float(string="Best Price",compute="_get_best_price")
23+
selling_price = fields.Float(readonly=True, copy=False)
24+
best_price = fields.Float(string="Best Price", compute="_get_best_price")
2325
bedrooms = fields.Integer(default=2)
2426
living_area = fields.Integer()
2527
facades = fields.Integer()
2628
garage = fields.Boolean()
2729
garden = fields.Boolean()
2830
garden_area = fields.Integer()
29-
garden_orientation = fields.Selection(selection=[('North','North'),('South','South'),('East','East'),('West','West')])
30-
total_area = fields.Float(compute="_get_total_area",string="Total Area");
31-
property_type_id = fields.Many2one("estate.property.type",string="Type")
32-
buyer_id = fields.Many2one("res.partner",string="Buyer")
33-
seller_id = fields.Many2one("res.users",default=lambda self : self.env.user,string="Seller")
34-
tag_ids = fields.Many2many("estate.property.tag",string="Tags")
35-
offer_ids = fields.One2many("estate.property.offer","property_id",string="Offers")
31+
garden_orientation = fields.Selection(selection=[('North', 'North'), ('South', 'South'), ('East', 'East'), ('West', 'West')])
32+
total_area = fields.Float(compute="_get_total_area", string="Total Area")
33+
property_type_id = fields.Many2one("estate.property.type", string="Type")
34+
buyer_id = fields.Many2one("res.partner", string="Buyer")
35+
seller_id = fields.Many2one("res.users", default=lambda self: self.env.user, string="Seller")
36+
tag_ids = fields.Many2many("estate.property.tag", string="Tags")
37+
offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers")
3638

3739
def sell_property(self):
3840
for record in self:
39-
if(record.state == "Cancelled"):
41+
if (record.state == "Cancelled"):
4042
raise exceptions.UserError("Can't sell cancelled property.")
4143
record.state = "Sold"
4244
return True
43-
45+
4446
def cancel_property(self):
4547
for record in self:
46-
if(record.state == "Sold"):
48+
if (record.state == "Sold"):
4749
raise exceptions.UserError("Can't cancel sold property.")
4850
record.state = "Cancelled"
4951
return True
5052

51-
@api.depends('living_area','garden_area')
53+
@api.depends('living_area', 'garden_area')
5254
def _get_total_area(self):
5355
for record in self:
54-
record.total_area = record.garden_area + record.living_area;
55-
56+
record.total_area = record.garden_area + record.living_area
5657

5758
@api.depends('offer_ids')
5859
def _get_best_price(self):
5960
for record in self:
60-
max:int = 0
61-
62-
if(len(record.offer_ids)==0):
61+
max: int = 0
62+
if (len(record.offer_ids) == 0):
6363
record.best_price = 0
6464
continue
65-
65+
6666
for offer in record.offer_ids:
67-
if(offer.price >= max):
67+
if (offer.price >= max):
6868
max = offer.price
6969
record.best_price = max
7070

@@ -73,10 +73,10 @@ def _garden_pre_fill(self):
7373
self.garden_area = 10 if self.garden else 0
7474
self.garden_orientation = 'North' if self.garden else ''
7575

76-
@api.constrains('selling_price','expected_price')
76+
@api.constrains('selling_price', 'expected_price')
7777
def _check_prices(self):
78-
for record in self:
79-
if float_is_zero(record.selling_price,2):
80-
return;
81-
if(float_compare(record.selling_price,record.expected_price*.8,2) == -1):
82-
raise ValidationError(f"Selling price is too low {record.selling_price}");
78+
for record in self:
79+
if float_is_zero(record.selling_price, 2):
80+
continue
81+
if (float_compare(record.selling_price, record.expected_price * 0.8, 2) == -1):
82+
raise ValidationError(f"Selling price is too low {record.selling_price}")

estate/models/estate_property_offer.py

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,38 @@
66
class EstatePropertyOffer(models.Model):
77
_name = "estate.property.offer"
88
_description = "Property Offer"
9-
_postif_price = models.Constraint("CHECK (price > 0)", "A price can't be negatif");
9+
_order = "price desc"
10+
11+
_postif_price = models.Constraint("CHECK (price > 0)", "A price can't be negatif")
12+
1013
price = fields.Float(string="Price")
11-
status = fields.Selection(copy=False,selection = [("Accepted","Accepted"),("Refused","Refused")])
12-
partner_id = fields.Many2one('res.partner',required=True)
14+
status = fields.Selection(copy=False, selection=[("Accepted", "Accepted"), ("Refused", "Refused")])
15+
partner_id = fields.Many2one('res.partner', required=True)
1316
property_id = fields.Many2one('estate.property', required=True)
14-
validity = fields.Integer(string="Validity Duration",default=7)
15-
date_deadline = fields.Date(string="Deadline",compute="_get_date_deadline",inverse="_set_date_deadline")
17+
validity = fields.Integer(string="Validity Duration", default=7)
18+
date_deadline = fields.Date(string="Deadline", compute="_get_date_deadline", inverse="_set_date_deadline")
1619

1720
def accept_offer(self):
1821
for record in self:
19-
if(record.property_id.selling_price == 0):
20-
record.status = "Accepted";
21-
print(type(record.property_id.seller_id))
22-
print(type(record.partner_id))
23-
record.property_id.buyer_id = record.partner_id;
24-
record.property_id.selling_price = record.price;
25-
26-
return True;
27-
22+
if (record.property_id.selling_price == 0):
23+
record.status = "Accepted"
24+
record.property_id.buyer_id = record.partner_id
25+
record.property_id.selling_price = record.price
26+
return True
27+
2828
def refused_offer(self):
2929
for record in self:
30-
record.status = "Refused";
31-
return True;
32-
30+
record.status = "Refused"
31+
return True
3332

3433
@api.depends("validity")
3534
def _get_date_deadline(self):
3635
for record in self:
37-
if(isinstance(record.create_date,bool)):
36+
if (isinstance(record.create_date, bool)):
3837
record.date_deadline = fields.Datetime.now() + relativedelta(days=record.validity)
3938
return
4039
record.date_deadline = record.create_date + relativedelta(days=record.validity)
4140

4241
def _set_date_deadline(self):
4342
for record in self:
44-
record.validity = (datetime.combine(record.date_deadline,time()) - record.create_date).days
43+
record.validity = (datetime.combine(record.date_deadline, time()) - record.create_date).days

estate/models/estate_property_tag.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,8 @@
44
class EstatePropertyTag(models.Model):
55
_name = "estate.property.tag"
66
_description = "Property Tag"
7-
_unique_tag = models.UniqueIndex("(name)","Tag name must be unique in database")
8-
name = fields.Char(required=True, unique=True)
7+
_order = "name asc"
8+
9+
_unique_tag = models.UniqueIndex("(name)", "Tag name must be unique in database")
10+
11+
name = fields.Char(required=True)

estate/models/estate_property_type.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,10 @@
44
class EstatePropertyType(models.Model):
55
_name = "estate.property.type"
66
_description = "Property Type"
7+
_order = "sequence, name asc"
8+
9+
_unique_type = models.UniqueIndex("(name)", "Property type name must be unique in database")
10+
711
name = fields.Char(required=True)
8-
_unique_type = models.UniqueIndex("(name)","Property type name must be unique in database")
12+
property_ids = fields.One2many("estate.property", "property_type_id")
13+
sequence = fields.Integer('Sequence', default=1, help="use to order the list inside the type view")

estate/views/estate_property_type_views.xml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,34 @@
1111
<field name ="name">estate.property.type.form</field>
1212
<field name="model">estate.property.type</field>
1313
<field name="arch" type="xml">
14-
<form string="Property list">
14+
<form string="Property type Form">
1515
<sheet>
1616
<group>
1717
<h1 class="mb32">
1818
<field name="name"/>
1919
</h1>
2020
</group>
21+
<field name="property_ids">
22+
<list>
23+
<field name="name"/>
24+
<field name="expected_price"/>
25+
<field name="state"/>
26+
</list>
27+
</field>
2128
</sheet>
2229
</form>
2330
</field>
2431
</record>
2532

33+
<record id="estate_property_type_model_list" model="ir.ui.view">
34+
<field name ="name">estate.property.type.list</field>
35+
<field name="model">estate.property.type</field>
36+
<field name="arch" type="xml">
37+
<list string="Property type list">
38+
<field name="sequence" widget="handle"/>
39+
<field name="name"/>
40+
</list>
41+
</field>
42+
</record>
43+
2644
</odoo>

estate/views/estate_property_views.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
<header>
3030
<button name="sell_property" type="object" string="Sell"/>
3131
<button name="cancel_property" type="object" string="Cancel"/>
32+
<field name="state" widget="statusbar" statusbar_visible="New,Offer_Received,Offer_Accepted,Sold,Cancelled"/>
3233
</header>
3334
<sheet>
3435
<group>
@@ -38,11 +39,11 @@
3839
</group>
3940
<group>
4041
<field name="tag_ids" widget="many2many_tags"/>
41-
<field name="state"/>
42+
4243
</group>
4344
<group>
4445
<group>
45-
<field name="property_type_id"/>
46+
<field name="property_type_id" options="{'no_create_edit': true}"/>
4647
<field name="postcode"/>
4748
<field name="date_availability"/>
4849
</group>

0 commit comments

Comments
 (0)