-
Notifications
You must be signed in to change notification settings - Fork 3.2k
risri - Technical Training #1326
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: 19.0
Are you sure you want to change the base?
Changes from all commits
d8e656e
5562495
b09ba24
77f6693
2b2fe10
55c355b
9440c91
2d7d1d3
8f4806a
9d071e5
7ea10bd
b94b24f
2306fe7
4c15657
4a471f6
7c50ad8
0f8cd5d
f2b988c
924a839
b87c883
635c2b2
566586c
1f4df3a
b9eed3e
ae99223
cf605ff
0abb528
7b5d36e
7e644b8
fea1155
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| { | ||
| "python.languageServer": "None" | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| from . import models |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| { | ||
| 'name': 'Real Estate', | ||
| 'author': 'Odoo S.A', | ||
| 'license': 'LGPL-3', | ||
| 'depends': ['base'], | ||
| 'application': True, | ||
| 'data': [ | ||
| 'security/ir.model.access.csv', | ||
| 'views/estate_property_views.xml', | ||
| 'views/estate_propoerty_new_view.xml', | ||
| 'views/estate_property_type_views.xml', | ||
| 'views/estate_property_tags_views.xml', | ||
| 'views/estate_property_offer_views.xml', | ||
| 'views/estate_menus.xml', | ||
| ], | ||
| 'demo': [ | ||
| 'demo/estate_property_type_demo.xml', | ||
| 'demo/estate_property_tag_demo.xml', | ||
| 'demo/estate_property_demo.xml', | ||
| ] | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,69 @@ | ||
| <?xml version="1.0" encoding="utf-8"?> | ||
| <odoo> | ||
| <!--Properties--> | ||
|
|
||
| <record id="estate_property_1" model="estate.property"> | ||
| <field name="name">Rohtas Plumeria</field> | ||
| <field name="description">3bhk appts</field> | ||
| <field name="postcode">226010</field> | ||
| <field name="date_availability" eval="(datetime.today() + relativedelta(months=3)).strftime('%Y-%m-%d')"/> | ||
| <field name="expected_price">7500000</field> | ||
| <field name="selling_price">0</field> | ||
| <field name="bedrooms">3</field> | ||
| <field name="living_area">1800</field> | ||
| <field name="facades">3</field> | ||
| <field name="garage" eval="False"/> | ||
| <field name="garden" eval="False"/> | ||
| <field name="property_type_id" ref="property_type_appartment"/> | ||
| <field name="tag_ids" eval="[(4,ref('property_tags_cozy'))]"/> | ||
| </record> | ||
|
|
||
| <record id="estate_property_2" model="estate.property"> | ||
| <field name="name">Gkb Grace</field> | ||
| <field name="description">3bhk appts</field> | ||
| <field name="postcode">336010</field> | ||
| <field name="date_availability" eval="(datetime.today() + relativedelta(months=3)).strftime('%Y-%m-%d')"/> | ||
| <field name="expected_price">5000000</field> | ||
| <field name="selling_price">0</field> | ||
| <field name="bedrooms">3</field> | ||
| <field name="living_area">1600</field> | ||
| <field name="facades">3</field> | ||
| <field name="garage" eval="False"/> | ||
| <field name="garden" eval="False"/> | ||
| <field name="property_type_id" ref="property_type_penthouse"/> | ||
| <field name="tag_ids" eval="[(4,ref('property_tags_renovated'))]"/> | ||
| </record> | ||
|
|
||
| <record id="estate_property_3" model="estate.property"> | ||
| <field name="name">omaxe heights</field> | ||
| <field name="description">5bhk appts</field> | ||
| <field name="postcode">226010</field> | ||
| <field name="date_availability" eval="(datetime.today() + relativedelta(months=3)).strftime('%Y-%m-%d')"/> | ||
| <field name="expected_price">8500000</field> | ||
| <field name="selling_price">0</field> | ||
| <field name="bedrooms">5</field> | ||
| <field name="living_area">2400</field> | ||
| <field name="facades">4</field> | ||
| <field name="garage" eval="False"/> | ||
| <field name="garden" eval="False"/> | ||
| <field name="property_type_id" ref="property_type_villa"/> | ||
| <field name="tag_ids" eval="[(4,ref('property_tags_furnished'))]"/> | ||
| </record> | ||
|
|
||
| <record id="estate_property_4" model="estate.property"> | ||
| <field name="name">parsvanath planet</field> | ||
| <field name="description">2bhk appts</field> | ||
| <field name="postcode">226016</field> | ||
| <field name="date_availability" eval="(datetime.today() + relativedelta(months=3)).strftime('%Y-%m-%d')"/> | ||
| <field name="expected_price">4500000</field> | ||
| <field name="selling_price">0</field> | ||
| <field name="bedrooms">2</field> | ||
| <field name="living_area">1400</field> | ||
| <field name="facades">4</field> | ||
| <field name="garage" eval="False"/> | ||
| <field name="garden" eval="False"/> | ||
| <field name="property_type_id" ref="property_type_villa"/> | ||
| <field name="tag_ids" eval="[(4,ref('property_tags_new'))]"/> | ||
| </record> | ||
| </odoo> | ||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| <?xml version="1.0" encoding="utf-8"?> | ||
| <odoo> | ||
| <record id="property_tags_cozy" model="estate.property.tag"> | ||
| <field name="name">cozy</field> | ||
| </record> | ||
| <record id="property_tags_furnished" model="estate.property.tag"> | ||
| <field name="name">furnished</field> | ||
| </record> | ||
| <record id="property_tags_unfurnished" model="estate.property.tag"> | ||
| <field name="name">unfurnished</field> | ||
| </record> | ||
| <record id="property_tags_renovated" model="estate.property.tag"> | ||
| <field name="name">renovated</field> | ||
| </record> | ||
| <record id="property_tags_new" model="estate.property.tag"> | ||
| <field name="name">new</field> | ||
| </record> | ||
| <record id="property_tags_old_property" model="estate.property.tag"> | ||
| <field name="name">old property</field> | ||
| </record> | ||
| </odoo> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| <?xml version="1.0" encoding="utf-8"?> | ||
| <odoo> | ||
| <record id="property_type_house" model="estate.property.type"> | ||
| <field name="name">house</field> | ||
| </record> | ||
| <record id="property_type_appartment" model="estate.property.type"> | ||
| <field name="name">appartment</field> | ||
| </record> | ||
| <record id="property_type_penthouse" model="estate.property.type"> | ||
| <field name="name">penthouse</field> | ||
| </record> | ||
| <record id="property_type_villa" model="estate.property.type"> | ||
| <field name="name">villa</field> | ||
| </record> | ||
| <record id="property_type_duplex" model="estate.property.type"> | ||
| <field name="name">duplex</field> | ||
| </record> | ||
| <record id="property_type_studio" model="estate.property.type"> | ||
| <field name="name">studio</field> | ||
| </record> | ||
| </odoo> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| from . import estate_property | ||
| from . import estate_property_type | ||
| from . import estate_property_tag | ||
| from . import estate_property_offer |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,81 @@ | ||
| from odoo import api, fields, models | ||
| from dateutil.relativedelta import relativedelta | ||
|
|
||
|
|
||
| class EstateProperty(models.Model): | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why have you used here |
||
| _name = "estate.property" | ||
| _description = "Real Estate Property" | ||
|
|
||
| name = fields.Char(string="Name", required=True) | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If the string is similar to the field name, then you can skip adding the string as it will automatically take the name from the field directly. You can apply it everywhere |
||
| description = fields.Text(string="Description") | ||
| postcode = fields.Char(string="Postcode") | ||
| date_availability = fields.Date(copy=False, default=lambda self: fields.Date.today() + relativedelta(months=3), string="Availability Date") | ||
| expected_price = fields.Float(string="Expected Price", required=True) | ||
| selling_price = fields.Float(readonly=True, copy=False, string="Selling Price") | ||
| bedrooms = fields.Integer(default=2, string="Bedrooms") | ||
| living_area = fields.Integer(string="Living Area") | ||
| facades = fields.Integer(string="Facades") | ||
| garage = fields.Boolean(string="Garage") | ||
| garage_area = fields.Integer(string="Garage Area") | ||
| garden = fields.Boolean(string="Garden") | ||
| garden_area = fields.Integer(string="Garden Area") | ||
| active = fields.Boolean(default=True, string="Active") | ||
| total_area = fields.Integer(string="Total Area", compute="_compute_total_area") | ||
|
|
||
| state = fields.Selection( | ||
| selection=[ | ||
| ('new', "New"), | ||
| ('offer_received', "Offer Received"), | ||
| ('offer_accepted', "Offer Accepted"), | ||
| ('sold', "Sold"), | ||
| ('cancelled', "Cancelled"), | ||
| ], | ||
| required=True, | ||
| copy=False, | ||
| default='new', | ||
| string="State" | ||
| ) | ||
| garden_orientation = fields.Selection( | ||
| selection=[ | ||
| ('north', 'North'), | ||
| ('south', 'South'), | ||
| ('east', 'East'), | ||
| ('west', 'West'), | ||
| ], | ||
| string="Garden Orientation" | ||
| ) | ||
|
|
||
| property_type_id = fields.Many2one("estate.property.type", string="Property Type") | ||
| buyer_id = fields.Many2one("res.partner", string="Buyer", copy=False) | ||
| salesperson_id = fields.Many2one("res.users", default=lambda self: self.env.user, string="Salesperson") | ||
| tag_ids = fields.Many2many("estate.property.tag", string="Tags") | ||
| offer_ids = fields.One2many("estate.property.offer", "property_id", string="Offers") | ||
| best_price = fields.Integer(string="Best price", compute="_compute_best_price", store="True") | ||
|
|
||
| @api.depends('offer_ids.price') | ||
| def _compute_best_price(self): | ||
| for record in self: | ||
| price = record.offer_ids.mapped('price') | ||
| record.best_price = max(price) if price else 0.0 | ||
|
|
||
| @api.onchange('garden') | ||
| def _on_change_garden(self): | ||
| if self.garden: | ||
| self.garden_area = 10 | ||
| self.garden_orientation = 'north' | ||
| else: | ||
| self.garden_area = 0 | ||
| self.garden_orientation = False | ||
|
|
||
| @api.onchange('garage') | ||
| def _on_change_garage(self): | ||
| if self.garage: | ||
| self.garage_area = 10 | ||
| else: | ||
| self.garage_area = 0 | ||
|
|
||
| @api.depends('living_area', 'garden_area', 'garage_area') | ||
| def _compute_total_area(self): | ||
| # breakpoint() | ||
| for record in self: | ||
| record.total_area = record.living_area + record.garden_area + record.garage_area | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,33 @@ | ||
| from odoo import fields, models, api | ||
| from datetime import timedelta | ||
|
|
||
|
|
||
| class EstatePropertyOffer(models.Model): | ||
|
|
||
| _name = "estate.property.offer" | ||
| _description = "Estate Property Offer" | ||
|
|
||
| price = fields.Float(string="Price") | ||
| status = fields.Selection( | ||
| selection=[ | ||
| ('Accepted', "Accepted"), | ||
| ('Refused', "Refused"), | ||
| ], | ||
| string="Status", | ||
| copy=False, | ||
| ) | ||
| partner_id = fields.Many2one('res.partner', required=True) | ||
| property_id = fields.Many2one('estate.property', required=True) | ||
| validity = fields.Integer(string="Validity date", default=7) | ||
| date_deadline = fields.Date(string="Deadline date", compute="_compute_date_deadline") | ||
|
|
||
| @api.depends('create_date', 'validity') | ||
| def _compute_date_deadline(self): | ||
| for record in self: | ||
| # breakpoint() | ||
| base = record.create_date.date() if record.create_date else fields.Date.today() | ||
| record.date_deadline = base + timedelta(record.validity) | ||
|
|
||
| def _inverse_date_deadline(self): | ||
| for record in self: | ||
| record.validity = record.base + timedelta(record.date_deadline) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| from odoo import fields, models | ||
|
|
||
|
|
||
| class EstatePropertyTag(models.Model): | ||
| _name = "estate.property.tag" | ||
| _description = "Real Estate Property Tag" | ||
|
|
||
| name = fields.Char(string="Tag", required=True) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| from odoo import fields, models | ||
|
|
||
|
|
||
| class EstatePropertyType(models.Model): | ||
| _name = "estate.property.type" | ||
| _description = "Real Estate Property Types" | ||
|
|
||
| name = fields.Char(string="Name", required=True) |
| 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,access_estate_property,model_estate_property,base.group_user,1,1,1,1 | ||
| access_estate_property_type,access_estate_property_type,model_estate_property_type,base.group_user,1,1,1,1 | ||
| access_estate_property_tag,access_estate_property_tag,model_estate_property_tag,base.group_user,1,1,1,1 | ||
| access_estate_property_offer,access_estate_property_offer,model_estate_property_offer,base.group_user,1,1,1,1 |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,46 @@ | ||||||||||||||||||||
| <?xml version="1.0" encoding="utf-8"?> | ||||||||||||||||||||
| <odoo> | ||||||||||||||||||||
| <menuitem | ||||||||||||||||||||
| id="estate_menu_root" name="Real Estate" | ||||||||||||||||||||
| web_icon="estate,static/description/icon.png"> | ||||||||||||||||||||
| </menuitem> | ||||||||||||||||||||
|
Comment on lines
+3
to
+6
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||
| <menuitem id="estate_first_level_menu" | ||||||||||||||||||||
| name="Advertisements" | ||||||||||||||||||||
| parent="estate.estate_menu_root" | ||||||||||||||||||||
| /> | ||||||||||||||||||||
| <menuitem | ||||||||||||||||||||
| id="estate_settings_menu" | ||||||||||||||||||||
| name="Settings" | ||||||||||||||||||||
| parent="estate.estate_menu_root" | ||||||||||||||||||||
| /> | ||||||||||||||||||||
| <menuitem | ||||||||||||||||||||
| id="estate_property_menu_action" | ||||||||||||||||||||
| name="Properties" | ||||||||||||||||||||
| parent="estate.estate_first_level_menu" | ||||||||||||||||||||
| action="estate_property_action" | ||||||||||||||||||||
| /> | ||||||||||||||||||||
| <menuitem | ||||||||||||||||||||
| id="estate_property_type_menu" | ||||||||||||||||||||
| name="Property Types" | ||||||||||||||||||||
| parent="estate_settings_menu" | ||||||||||||||||||||
| action="estate_property_type_action" | ||||||||||||||||||||
| /> | ||||||||||||||||||||
| <menuitem | ||||||||||||||||||||
| id="estate_property_tag_menu" | ||||||||||||||||||||
| name="Property Tags" | ||||||||||||||||||||
| parent="estate_settings_menu" | ||||||||||||||||||||
| action="estate_property_tag_action" | ||||||||||||||||||||
| /> | ||||||||||||||||||||
| <menuitem | ||||||||||||||||||||
| id="estate_property_offer_menu" | ||||||||||||||||||||
| name="Property Offer" | ||||||||||||||||||||
| parent="estate_settings_menu" | ||||||||||||||||||||
| action="estate_property_offer_action" | ||||||||||||||||||||
| /> | ||||||||||||||||||||
| <menuitem | ||||||||||||||||||||
| id="estate_proeprty_new_menu" | ||||||||||||||||||||
| name="Create Property" | ||||||||||||||||||||
| parent="estate_first_level_menu" | ||||||||||||||||||||
| action="estate_property_new_action"/> | ||||||||||||||||||||
|
|
||||||||||||||||||||
| </odoo> | ||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the purpose of depends?