Skip to content

Commit e17ac62

Browse files
author
raibr
committed
[ADD] estate: Implement property offers with computed fields and onchange
- Add estate.property.offer model with price, validity, and deadline fields - Implement bidirectional compute/inverse for validity and date_deadline - Add total_area computed field (living_area + garden_area) to estate.property - Add best_price computed field to show highest offer price - Add offers tab in property form view with inline list display - Implement onchange for garden field to auto-set area (10) and orientation (North) - Create estate_property_offer_views.xml with list and form views - Add security access rules for estate.property.offer model - Fix One2many/Many2one relationship between property and offers
1 parent c02245d commit e17ac62

File tree

6 files changed

+62
-9
lines changed

6 files changed

+62
-9
lines changed

.DS_Store

0 Bytes
Binary file not shown.

estate/.DS_Store

0 Bytes
Binary file not shown.

estate/models/estate_property.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# -*- coding: utf-8 -*-
22
# Part of Odoo. See LICENSE file for full copyright and licensing details.
33

4-
from odoo import fields, models
4+
from odoo import api, fields, models
55

66

77
class EstateProperty(models.Model):
@@ -31,3 +31,27 @@ class EstateProperty(models.Model):
3131
property_type_id = fields.Many2one("estate.property.type", string="Property Type")
3232
tag_ids = fields.Many2many("estate.property.tag", string="Tags")
3333
offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers")
34+
total_area = fields.Integer(compute="_compute_total_area")
35+
best_price = fields.Float(compute="_compute_best_price", string="Best Offer Price")
36+
37+
@api.depends('living_area', 'garden_area')
38+
def _compute_total_area(self):
39+
for record in self:
40+
record.total_area = record.living_area + record.garden_area
41+
42+
@api.depends('offer_ids.price')
43+
def _compute_best_price(self):
44+
for record in self:
45+
if record.offer_ids:
46+
record.best_price = max(record.offer_ids.mapped('price'))
47+
else:
48+
record.best_price = 0.0
49+
50+
@api.onchange('garden')
51+
def _onchange_garden(self):
52+
if self.garden:
53+
self.garden_area = 10
54+
self.garden_orientation = 'north'
55+
else:
56+
self.garden_area = 0
57+
self.garden_orientation = False
Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,33 @@
11
# -*- coding: utf-8 -*-
22
# Part of Odoo. See LICENSE file for full copyright and licensing details.
33

4-
from odoo import fields, models
4+
from datetime import timedelta
5+
from odoo import api, fields, models
56

67

78
class EstatePropertyOffer(models.Model):
89
_name = "estate.property.offer"
910
_description = "Real Estate Property Offer"
10-
_order = "name"
11+
_order = "price desc"
1112

12-
name = fields.Char(required=True)
13+
price = fields.Float(required=True)
1314
property_id = fields.Many2one("estate.property", string="Property", required=True)
15+
validity = fields.Integer(default=7, string="Validity (days)")
16+
date_deadline = fields.Date(
17+
compute="_compute_date_deadline",
18+
inverse="_inverse_date_deadline",
19+
store=True,
20+
string="Deadline",
21+
)
22+
23+
@api.depends("validity")
24+
def _compute_date_deadline(self):
25+
for record in self:
26+
record.date_deadline = fields.Date.today() + timedelta(days=record.validity)
27+
print("Computed deadlines2")
28+
29+
def _inverse_date_deadline(self):
30+
for record in self:
31+
if record.date_deadline:
32+
record.validity = (record.date_deadline - fields.Date.today()).days
33+
print("Inversed deadlines")

estate/views/estate_property_offer_views.xml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
<field name="name">estate.property.offer.view.tree</field>
66
<field name="model">estate.property.offer</field>
77
<field name="arch" type="xml">
8-
<tree>
9-
<field name="name"/>
8+
<list>
9+
<field name="price"/>
1010
<field name="property_id"/>
11-
</tree>
11+
<field name="validity"/>
12+
<field name="date_deadline"/>
13+
</list>
1214
</field>
1315
</record>
1416

@@ -20,8 +22,10 @@
2022
<form>
2123
<sheet>
2224
<group>
23-
<field name="name"/>
25+
<field name="price"/>
2426
<field name="property_id"/>
27+
<field name="validity"/>
28+
<field name="date_deadline"/>
2529
</group>
2630
</sheet>
2731
</form>
@@ -32,6 +36,6 @@
3236
<record id="estate_property_offer_action" model="ir.actions.act_window">
3337
<field name="name">Property Offers</field>
3438
<field name="res_model">estate.property.offer</field>
35-
<field name="view_mode">tree,form</field>
39+
<field name="view_mode">list,form</field>
3640
</record>
3741
</odoo>

estate/views/estate_property_views.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
</group>
3939
<group>
4040
<field name="expected_price"/>
41+
<field name="best_price"/>
4142
<field name="selling_price"/>
4243
</group>
4344
</group>
@@ -52,8 +53,12 @@
5253
<field name="garden"/>
5354
<field name="garden_area"/>
5455
<field name="garden_orientation"/>
56+
<field name="total_area"/>
5557
</group>
5658
</page>
59+
<page string="Offers">
60+
<field name="offer_ids"/>
61+
</page>
5762
</notebook>
5863
</sheet>
5964
</form>

0 commit comments

Comments
 (0)