Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
dc64d10
Chapter 2
srapyx Sep 15, 2026
2fb7c3f
modified: estate/__init__.py
srapyx Sep 16, 2026
9b34aef
chapter 3
srapyx Sep 16, 2026
933a256
modified: estate/models/estate_property.py
srapyx Sep 16, 2026
96115d5
modified: estate/models/estate_property.py
srapyx Sep 16, 2026
4507a29
Chapter 4
srapyx Sep 16, 2026
8e9e61e
modified: estate/security/ir.model.access.csv
srapyx Sep 16, 2026
d481893
modified: estate/__manifest__.py
srapyx Sep 16, 2026
d507cbc
Chapter 5
srapyx Sep 16, 2026
1e08dec
Chapter 5
srapyx Sep 16, 2026
9b2f068
Update estate/models/estate_property.py
srapyx Sep 16, 2026
9c44b0a
Update estate/models/estate_property.py
srapyx Sep 16, 2026
fe38730
--Fix PR feedback--
srapyx Sep 16, 2026
f7fc4d7
--Feedback fix linter
srapyx Sep 16, 2026
00f45ad
chapter5; form and list view should be okay
srapyx Sep 16, 2026
349283c
Chapter 5 - base form and list ok
srapyx Sep 16, 2026
01bc01d
Chapter 5 (end)
srapyx Sep 17, 2026
55b4abd
Style fix
srapyx Sep 17, 2026
b6c75bb
Merge branch '19.0-tuto-surap' of github.com:odoo-dev/tutorials into …
srapyx Sep 17, 2026
adf9e21
Chapter 6 list view ok
srapyx Sep 17, 2026
77a4b8d
modified: estate/models/estate_property.py
srapyx Sep 17, 2026
1bbd311
modified: estate/models/estate_property.py
srapyx Sep 17, 2026
939e3e3
modified: estate/views/estate_property_views.xml
srapyx Sep 17, 2026
302637d
modified: estate/views/estate_property_views.xml
srapyx Sep 17, 2026
08bddf2
Chapter 6-end
srapyx Sep 17, 2026
e43ee06
Chapter 7 - property type base setup
srapyx Sep 17, 2026
185bcbc
7 propert type in properti model + fix weird name in view
srapyx Sep 17, 2026
a14c1bb
7-adding many2many field
srapyx Sep 17, 2026
bd61877
7-tags creating view model +integration
srapyx Sep 17, 2026
fd7edc7
Chapter 7 - end (one2many)wq
srapyx Sep 17, 2026
70ceb5c
Chapter 8 - start
srapyx Sep 17, 2026
50d8700
8.2 (best price)
srapyx Sep 17, 2026
8c744db
Inverse 8.3
srapyx Sep 17, 2026
2a60c14
8.4 - onchange
srapyx Sep 17, 2026
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
16 changes: 16 additions & 0 deletions estate/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
'name': 'estate',
'depends': [
'base',
],
'application': True,
'installable': True,
'data': [
'security/ir.model.access.csv',
'views/estate_property_views.xml',
'views/estate_property_offer_views.xml',
'views/estate_property_type_views.xml',
'views/estate_property_tag_views.xml',
'views/estate_menus.xml',
],
}
6 changes: 6 additions & 0 deletions estate/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from . import (
estate_property,
estate_property_offer,
estate_property_tag,
estate_property_type,
)
55 changes: 55 additions & 0 deletions estate/models/estate_property.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from odoo import api, fields, models
from odoo.tools import date_utils


class EstateProperty(models.Model):
_name: str = "estate.property"
_active = True
_description: str | None = None

name: fields.Char = fields.Char()
description: fields.Text = fields.Text()
postcode: fields.Char = fields.Char()
date_availability: fields.Date = fields.Date('Availability Date', copy=False, default=date_utils.add(fields.Date.today(), months=3))
expected_price: fields.Float = fields.Float()
selling_price: fields.Float = fields.Float(readonly=True, copy=False)
bedroom: fields.Integer = fields.Integer(default=2)
living_area: fields.Integer = fields.Integer()
facades: fields.Integer = fields.Integer()
garden: fields.Boolean = fields.Boolean()
garden_area: fields.Integer = fields.Integer()
garage: fields.Boolean = fields.Boolean()
garden_orientation: fields.Selection = fields.Selection(
selection=[("north", "North"), ("south", "South"), ("east", "East"), ("west", "West")],
string='Type',
help="Type is used to separate Leads and Opportunities")
state = fields.Selection(
[(word.lower(), word) for word in ["New", "Offer Received", "Offer Accepted", "Sold", "Cancelled"]],
copy=False,
default="new")
property_type_id = fields.Many2one("estate.property.type")
salesperson_id = fields.Many2one("res.users", default=lambda self: self.env.uid)
buyer_id = fields.Many2one("res.partner", copy=False)
tag_ids = fields.Many2many("estate.property.tag", string="Tags")
offer_ids = fields.One2many("estate.property.offer", "property_id")
total_area = fields.Integer(compute='_compute_total_area')
best_price = fields.Float(compute='_compute_best_price')

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

@api.depends('offer_ids.price')
def _compute_best_price(self):
for record in self:
record.best_price = max([offer.price for offer in record.offer_ids] + [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 = None
25 changes: 25 additions & 0 deletions estate/models/estate_property_offer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import logging

from odoo import api, fields, models
from odoo.tools import date_utils


class EstatePropertyOffer(models.Model):
_name: str = "estate.property.offer"
_description: str | None = None

price: fields.Float = fields.Float()
status: fields.Selection = fields.Selection([(word.lower(), word) for word in ['Accepted', 'Refused']], copy=False)
partner_id = fields.Many2one("res.partner", required=True)
property_id = fields.Many2one("estate.property", required=True)
date_deadline: fields.Date = fields.Date(compute='_compute_date_deadline', inverse='_inverse_date_deadline')
validity = fields.Integer()

@api.depends('validity')
def _compute_date_deadline(self):
for offer in self:
offer.date_deadline = date_utils.add(fields.Date.today(), days=offer.validity)

def _inverse_date_deadline(self):
for offer in self:
offer.validity = (offer.date_deadline - fields.Date.today()).days
8 changes: 8 additions & 0 deletions estate/models/estate_property_tag.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from odoo import fields, models


class EstatePropertyTag(models.Model):
_name: str = "estate.property.tag"
_description: str | None = None

name: fields.Char = fields.Char()
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: str = "estate.property.type"
_description: str | None = None

name: fields.Char = fields.Char()
5 changes: 5 additions & 0 deletions estate/security/ir.model.access.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
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
12 changes: 12 additions & 0 deletions estate/views/estate_menus.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<menuitem id="estate_menu_root" name="Advertisments">
<menuitem id="estate_first_level_menu" name="Properties">
<menuitem id="estate_model_menu_action" action="estate_property_action"/>
</menuitem>
<menuitem id="estate_property_settings" name="Settings">
<menuitem id="estate_property_type_model_menu_action" action="estate_property_type_action"/>
<menuitem id="estate_property_tag_model_menu_action" action="estate_property_tag_action"/>
</menuitem>
</menuitem>
</odoo>
42 changes: 42 additions & 0 deletions estate/views/estate_property_offer_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="estate_property_offer_action" model="ir.actions.act_window">
<field name="name">Properties</field>
<field name="res_model">estate.property.offer</field>
<field name="view_mode">list,form</field>
</record>

<record id="estate_property_offer_view_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="Channel">
<field name="price"/>
<field name="status"/>
<field name="partner_id"/>
<field name="property_id"/>
</list>
</field>
</record>

<record id="estate_property_offer_view_form" model="ir.ui.view">
<field name="name">estate.property.form</field>
<field name="model">estate.property.offer</field>
<field name="arch" type="xml">
<form string="My New House">
<sheet>
<group>
<group>
<field name="price"/>
<field name="status"/>
<field name="partner_id"/>
<field name="property_id"/>
<field name="date_deadline"/>
<field name="validity"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
</odoo>
21 changes: 21 additions & 0 deletions estate/views/estate_property_tag_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="estate_property_tag_action" model="ir.actions.act_window">
<field name="name">Properties Tags</field>
<field name="res_model">estate.property.tag</field>
<field name="view_mode">list,form</field>
</record>
<record id="estate_property_tag_view_form" model="ir.ui.view">
<field name="name">estate.property.tag</field>
<field name="model">estate.property.tag</field>
<field name="arch" type="xml">
<form>
<sheet>
<h1 class="mb32">
<field name="name" class="mb16"/>
</h1>
</sheet>
</form>
</field>
</record>
</odoo>
21 changes: 21 additions & 0 deletions estate/views/estate_property_type_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="estate_property_type_action" model="ir.actions.act_window">
<field name="name">Properties types</field>
<field name="res_model">estate.property.type</field>
<field name="view_mode">list,form</field>
</record>
<record id="estate_property_tyoe_view_form" model="ir.ui.view">
<field name="name">estate.property.type.form</field>
<field name="model">estate.property.type</field>
<field name="arch" type="xml">
<form>
<sheet>
<h1 class="mb32">
<field name="name" class="mb16"/>
</h1>
</sheet>
</form>
</field>
</record>
</odoo>
97 changes: 97 additions & 0 deletions estate/views/estate_property_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="estate_property_action" model="ir.actions.act_window">
<field name="name">Properties</field>
<field name="res_model">estate.property</field>
<field name="view_mode">list,form</field>
</record>
<record id="estate_property_view_list" model="ir.ui.view">
<field name="name">estate.property.list</field>
<field name="model">estate.property</field>
<field name="arch" type="xml">
<list string="Channel">
<field name="name"/>
<field name="postcode"/>
<field name="date_availability"/>
<field name="expected_price"/>
<field name="selling_price"/>
<field name="bedroom"/>
<field name="living_area"/>
<field name="tag_ids"/>
</list>
</field>
</record>

<record id="estate_property_view_form" model="ir.ui.view">
<field name="name">estate.property.form</field>
<field name="model">estate.property</field>
<field name="arch" type="xml">
<form string="My New House">
<sheet>
<h1 class="mb32">
<field name="name" class="mb16"/>
</h1>
<group>
<group>
<field name="tag_ids" widget="many2many_tags"/>
<field name="postcode"> </field>
<field name="date_availability"> </field>
</group>
<group>
<field name="expected_price"> </field>
<field name="best_price"> </field>
<field name="selling_price"> </field>
</group>
</group>

<notebook>
<page string="Description">
<group>
<field name="description"> </field>
<field name="bedroom"> </field>
<field name="living_area"> </field>
<field name="facades"> </field>
<field name="garden"> </field>
<field name="garden_area"> </field>
<field name="garden_orientation"> </field>
<field name="property_type_id"> </field>
<field name="total_area"> </field>
</group>
</page>
<page string="Offers">
<group>
<field name="offer_ids"> </field>
</group>
</page>
<page string="Other Info">
<group>
<field name="salesperson_id"> </field>
<field name="buyer_id"> </field>
</group>
</page>
</notebook>
</sheet>
</form>
</field>
</record>

<record id="view_estate_property_search" model="ir.ui.view">
<field name="name">estate.property.search</field>
<field name="model">estate.property</field>
<field name="arch" type="xml">
<search string="Delivery Carrier">
<field name="name" string="Title"/>
<field name="postcode"/>
<field name="date_availability"/>
<field name="expected_price"/>
<field name="bedroom"/>
<field name="facades"/>
<field name="property_type_id"/>
<filter name="postcode" context="{'group_by':'postcode'}"/>
<filter name="Available" domain="['|', ('state', '=', 'new'), ('state', '=', 'offer received')]"/>
</search>
</field>
</record>


</odoo>