-
Notifications
You must be signed in to change notification settings - Fork 2.1k
estate module: Write importable modules tutorial #806
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: 18.0
Are you sure you want to change the base?
Changes from all commits
1596540
48bb916
d964a55
8e6c77d
02d23a7
a9677cd
55bd0a7
501d9a3
cb822ee
f2eae1e
768ceb9
9b448da
0b70fba
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,41 @@ | ||
{ | ||
'name': 'estate', | ||
'depends': [ | ||
'website', | ||
], | ||
'data': [ | ||
'models/estate_models.xml', | ||
|
||
'models/fields/estate_property_type.xml', | ||
'models/fields/estate_property_tag.xml', | ||
'models/fields/estate_property_offer.xml', | ||
'models/fields/estate_property.xml', | ||
|
||
'models/estate_server_actions.xml', | ||
|
||
'views/estate_property_type_views.xml', | ||
'views/estate_property_tag_views.xml', | ||
'views/estate_property_offer_views.xml', | ||
'views/estate_property_views.xml', | ||
|
||
'views/estate_menus.xml', | ||
'security/ir.model.access.csv', | ||
'security/estate.security.xml', | ||
|
||
'data/estate_tour.xml', | ||
|
||
], | ||
|
||
'demo': [ | ||
'demo/x_estate.property.type.csv', | ||
'demo/x_estate.property.tag.csv', | ||
'demo/x_estate.property.xml', | ||
], | ||
|
||
"assets": { | ||
"web.assets_backend": [ | ||
"estate/static/src/js/tour.js", | ||
], | ||
}, | ||
'license': 'LGPL-3', | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<odoo> | ||
<record id="estate_tour" model="web_tour.tour"> | ||
<field name="name">estate_tour</field> | ||
<field name="sequence">2</field> | ||
<field name="rainbow_man_message">Welcome! Happy exploring.</field> | ||
</record> | ||
</odoo> | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
"id","x_name" | ||
"tag_1","Luxury" | ||
"tag_2","Modern" | ||
"tag_3","Eco-Friendly" | ||
"tag_4","Cozy" | ||
"tag_5","Spacious" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
"id","x_name" | ||
"type_1","Residential" | ||
"type_2","Commercial" | ||
"type_3","Industrial" | ||
"type_4","Land" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<odoo noupdate="1"> | ||
<record id="big_villa" model="x_estate.property"> | ||
<field name="x_name">Big Villa</field> | ||
<field name="x_description">A nice and big villa</field> | ||
<field name="x_postcode">12345</field> | ||
<field name="x_date_availability" eval="(datetime.today() + timedelta(days=5)).strftime('%Y-%m-%d')"/> | ||
<field name="x_expected_price">1600000</field> | ||
<field name="x_bedrooms">6</field> | ||
<field name="x_living_area">100</field> | ||
<field name="x_facades">4</field> | ||
<field name="x_garage">True</field> | ||
<field name="x_garden">True</field> | ||
<field name="x_garden_area">100000</field> | ||
<field name="x_garden_orientation">south</field> | ||
<field name="x_property_type_id" ref="type_1"/> | ||
<field name="x_api_published">True</field> | ||
</record> | ||
|
||
<record id="trailer_home" model="x_estate.property"> | ||
<field name="x_name">Trailer home</field> | ||
<field name="x_description">Home in a trailer park</field> | ||
<field name="x_postcode">54321</field> | ||
<field name="x_date_availability" eval="(datetime.today() + timedelta(days=10)).strftime('%Y-%m-%d')"/> | ||
<field name="x_expected_price">100000</field> | ||
<field name="x_bedrooms">1</field> | ||
<field name="x_living_area">10</field> | ||
<field name="x_facades">4</field> | ||
<field name="x_garage">False</field> | ||
<field name="x_property_type_id" ref="type_2"/> | ||
</record> | ||
|
||
</odoo> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<odoo> | ||
<record id="model_real_estate_property" model="ir.model"> | ||
<field name="name">Real Estate Property</field> | ||
<field name="model">x_estate.property</field> | ||
</record> | ||
|
||
<record id="model_real_estate_property_type" model="ir.model"> | ||
<field name="name">Property Type</field> | ||
<field name="model">x_estate.property.type</field> | ||
</record> | ||
|
||
<record id="model_real_estate_property_tag" model="ir.model"> | ||
<field name="name">Property Tag</field> | ||
<field name="model">x_estate.property.tag</field> | ||
</record> | ||
|
||
|
||
<record id="model_real_estate_property_offer" model="ir.model"> | ||
<field name="name">Property Offer</field> | ||
<field name="model">x_estate.property.offer</field> | ||
</record> | ||
|
||
</odoo> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
<?xml version='1.0' encoding='UTF-8'?> | ||
<odoo> | ||
<record id="action_x_estate_property_offer_accept" model="ir.actions.server"> | ||
<field name="name">Accept Offer</field> | ||
<field name="model_id" ref="estate.model_real_estate_property_offer"/> | ||
<field name="state">code</field> | ||
<field name="code"><![CDATA[ | ||
for offer in records: | ||
offer.write({'x_status': 'accepted'}) | ||
offer.x_property_id.write({'x_selling_price': offer.x_price, 'x_partner_id': offer.x_partner_id}) | ||
for other_offer in offer.x_property_id.x_offer_ids: | ||
if other_offer != offer: | ||
other_offer.write({'x_status': 'refused'}) | ||
Comment on lines
+8
to
+13
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. Ok, but what if you accept two offers for the same property? It seems like only one will be accepted, but it is kind of magic, no? Shouldn't we take more care (and maybe raise in such cases)? |
||
]]></field> | ||
</record> | ||
|
||
<record id="server_action_estate_list" model="ir.actions.server"> | ||
<field name="name">Estate List</field> | ||
<field name="model_id" ref="estate.model_real_estate_property" /> | ||
<field name="website_published">True</field> | ||
<field name="website_path">estate</field> | ||
<field name="state">code</field> | ||
<field name="code"><![CDATA[ | ||
html = '<html><body><h1>Properties</h1><ul>' | ||
for property in request.env['x_estate.property'].search([]): | ||
html += f'<li>{property.x_name}</li>' | ||
html += '</ul></body></html>' | ||
response = request.make_response(html) | ||
]]></field> | ||
</record> | ||
</odoo> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,204 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<odoo> | ||
<record id="field_real_estate_property_name" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property" /> | ||
<field name="name">x_name</field> | ||
<field name="field_description">Name</field> | ||
<field name="ttype">char</field> | ||
<field name="required">True</field> | ||
</record> | ||
|
||
<record id="field_real_estate_property_selling_price" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property" /> | ||
<field name="name">x_selling_price</field> | ||
<field name="field_description">Selling Price</field> | ||
<field name="ttype">float</field> | ||
<field name="readonly" eval="True"/> | ||
</record> | ||
|
||
<record id="field_real_estate_property_description" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property" /> | ||
<field name="name">x_description</field> | ||
<field name="field_description">Description</field> | ||
<field name="ttype">html</field> | ||
</record> | ||
|
||
<record id="field_real_estate_property_postcode" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property" /> | ||
<field name="name">x_postcode</field> | ||
<field name="field_description">Postcode</field> | ||
<field name="ttype">char</field> | ||
</record> | ||
|
||
<!-- Fields From Exercise --> | ||
<record id="field_real_estate_date_availability" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property"/> | ||
<field name="name">x_date_availability</field> | ||
<field name="field_description">Date Availability</field> | ||
<field name="ttype">date</field> | ||
</record> | ||
|
||
<record id="field_real_estate_expected_price" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property"/> | ||
<field name="name">x_expected_price</field> | ||
<field name="field_description">Expected Price</field> | ||
<field name="ttype">float</field> | ||
<field name="required">True</field> | ||
</record> | ||
|
||
<record id="field_real_estate_bedrooms" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property"/> | ||
<field name="name">x_bedrooms</field> | ||
<field name="field_description">Bedrooms</field> | ||
<field name="ttype">integer</field> | ||
</record> | ||
|
||
<record id="field_real_estate_living_area" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property"/> | ||
<field name="name">x_living_area</field> | ||
<field name="field_description">Living Area</field> | ||
<field name="ttype">integer</field> | ||
</record> | ||
|
||
<record id="field_real_estate_facades" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property"/> | ||
<field name="name">x_facades</field> | ||
<field name="field_description">Facades</field> | ||
<field name="ttype">integer</field> | ||
</record> | ||
|
||
<record id="field_real_estate_garage" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property"/> | ||
<field name="name">x_garage</field> | ||
<field name="field_description">Garage</field> | ||
<field name="ttype">boolean</field> | ||
</record> | ||
|
||
<record id="field_real_estate_garden" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property"/> | ||
<field name="name">x_garden</field> | ||
<field name="field_description">Garden</field> | ||
<field name="ttype">boolean</field> | ||
</record> | ||
|
||
<record id="field_real_estate_garden_area" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property"/> | ||
<field name="name">x_garden_area</field> | ||
<field name="field_description">Garden Area</field> | ||
<field name="ttype">integer</field> | ||
<field name="depends">x_garden</field> | ||
<field name="compute"><![CDATA[for property in self: | ||
property['x_garden_area'] = 0 if not property.x_garden else 1000 | ||
Comment on lines
+90
to
+91
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. back to this: this is not correct. It is in an onchange, to set back to a default value when editing the boolean in the form. But here you would totally erase the value entered by the user. |
||
]]> | ||
</field> | ||
</record> | ||
|
||
<record id="field_real_estate_property_total_area" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property" /> | ||
<field name="name">x_total_area</field> | ||
<field name="field_description">Total Area</field> | ||
<field name="ttype">integer</field> | ||
<field name="depends">x_living_area,x_garden_area</field> | ||
<field name="compute"><![CDATA[for property in self: | ||
property['x_total_area'] = property.x_living_area + property.x_garden_area | ||
]]> | ||
</field> | ||
<field name="readonly" eval="True"/> | ||
<field name="store">False</field> | ||
</record> | ||
|
||
<!-- Selection Field: Garden Orientation --> | ||
<record id="field_real_estate_garden_orientation" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property"/> | ||
<field name="name">x_garden_orientation</field> | ||
<field name="field_description">Garden Orientation</field> | ||
<field name="ttype">selection</field> | ||
</record> | ||
|
||
<!-- Selection Values for x_garden_orientation --> | ||
<record id="garden_orientation_north" model="ir.model.fields.selection"> | ||
<field name="field_id" ref="field_real_estate_garden_orientation"/> | ||
<field name="value">north</field> | ||
<field name="name">North</field> | ||
<field name="sequence">1</field> | ||
</record> | ||
|
||
<record id="garden_orientation_south" model="ir.model.fields.selection"> | ||
<field name="field_id" ref="field_real_estate_garden_orientation"/> | ||
<field name="value">south</field> | ||
<field name="name">South</field> | ||
<field name="sequence">2</field> | ||
</record> | ||
|
||
<record id="garden_orientation_east" model="ir.model.fields.selection"> | ||
<field name="field_id" ref="field_real_estate_garden_orientation"/> | ||
<field name="value">east</field> | ||
<field name="name">East</field> | ||
<field name="sequence">3</field> | ||
</record> | ||
|
||
<record id="garden_orientation_west" model="ir.model.fields.selection"> | ||
<field name="field_id" ref="field_real_estate_garden_orientation"/> | ||
<field name="value">west</field> | ||
<field name="name">West</field> | ||
<field name="sequence">4</field> | ||
</record> | ||
|
||
<!-- Relational Fields --> | ||
<record id="field_real_estate_property_partner_id" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property" /> | ||
<field name="name">x_partner_id</field> | ||
<field name="field_description">Buyer</field> | ||
<field name="ttype">many2one</field> | ||
<field name="relation">res.partner</field> | ||
</record> | ||
|
||
<record id="field_real_estate_property_type_id" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property" /> | ||
<field name="name">x_property_type_id</field> | ||
<field name="field_description">Type</field> | ||
<field name="ttype">many2one</field> | ||
<field name="relation">x_estate.property.type</field> | ||
<field name="required">True</field> | ||
<field name="on_delete">restrict</field> | ||
</record> | ||
|
||
<record id="field_real_estate_property_user_id" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property" /> | ||
<field name="name">x_user_id</field> | ||
<field name="field_description">Salesperson</field> | ||
<field name="ttype">many2one</field> | ||
<field name="relation">res.users</field> | ||
</record> | ||
|
||
<record id="field_real_estate_property_tag_ids" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property" /> | ||
<field name="name">x_property_tag_ids</field> | ||
<field name="field_description">Tags</field> | ||
<field name="ttype">many2many</field> | ||
<field name="relation">x_estate.property.tag</field> | ||
</record> | ||
|
||
<record id="field_real_estate_property_offer_ids" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property" /> | ||
<field name="name">x_offer_ids</field> | ||
<field name="field_description">Offers</field> | ||
<field name="ttype">one2many</field> | ||
<field name="relation">x_estate.property.offer</field> | ||
<field name="relation_field">x_property_id</field> | ||
</record> | ||
|
||
|
||
<!-- API Published Field --> | ||
<record id="field_real_estate_property_api_published" model="ir.model.fields"> | ||
<field name="model_id" ref="estate.model_real_estate_property" /> | ||
<field name="name">x_api_published</field> | ||
<field name="field_description">API Published</field> | ||
<field name="ttype">boolean</field> | ||
</record> | ||
<record id="default_real_estate_property_api_published" model="ir.default"> | ||
<field name="field_id" ref="estate.field_real_estate_property_api_published" /> | ||
<field name="json_value">false</field> | ||
</record> | ||
|
||
</odoo> |
Uh oh!
There was an error while loading. Please reload this page.