Web Development
Controllers
In Odoo, web controllers are a class that can be used to connect the front end with the backend models. If we need to render some data from the backend model to the website, we can use the Controllers in such scenarios
For creating a web controller, initially, we need to create a directory called “Controllers” with __init__.py and a python file inside our custom module.
For Instance, let’s create a controller that fetches data from res. partner model and pass to a web page.
from odoo import http, _
from odoo.http import request
class ResPartnerController(http.Controller):
@http.route('/contacts', type='http', auth='public', website=True)
def contact_details(self, **kwargs):
partner_data = request.env['res.partner'].sudo().search([])
values = {
'partners': partner_data,
}
return request.render("library_management.contact_details_template", values)
The Controllers in Odoo are actually inherited from the “Controller” class, as you can see from the above code. The ‘ ‘@http.route()’ defined in the controller specifies some details like the url of the page that need to be redirected, the type of the request (can be http or json), auth for specifying who can access the url, website parameter for specifying the controller is linked with a page (it will take either True or False values).
Lastly, in the controller function definition, using request.render(), we can specify the template that needs to be rendered when redirecting to the specified URL.
Then, we can create the XML file for creating the template specified in the controller.
<odoo>
<record id="contact_menu" model="website.menu">
<field name="name">Contacts</field> <!-- Name of the menu-->
<field name="url">/contacts</field>
<field name="parent_id" ref="website.main_menu"/>
</record>
<template id="contact_details_template" name="Contact Details">
<t t-call="website.layout">
<div class="oe_structure">
<div class="container">
<br/>
<center>
<h3>Contact Details</h3>
</center>
<br/>
<table class="table-striped table">
<thead style="font-size: 23px;">
<tr>
<h6>
<b>
<th>Name</th>
<th>Mobile</th>
<th>Email</th>
<th>Job Position</th>
</b>
</h6>
</tr>
</thead>
<tbody>
<t t-foreach="partners" t-as="partner">
<tr>
<td>
<span t-esc="partner.name"/>
</td>
<td>
<span t-esc="partner.mobile"/>
</td>
<td>
<span t-esc="partner.email"/>
</td>
<td>
<span t-esc="partner.function"/>
</td>
</tr>
</t>
</tbody>
</table>
</div>
</div>
</t>
</template>
</odoo>
This is how we can create a new controller in Odoo 16.
In Odoo, it's also possible to inherit an already existing controller.
For Instance, if we need to override the controller “CustomerPortal” defined by the “portal” module,
First need to import the controller class like below,
from odoo.addons.portal.controllers.portal import CustomerPortal
Here the “portal” is the controller file where the “CustomerPortal” Controller class is defined. After importing the controller, we can override the function like below,
class CustomerPortalPasswordPolicy(CustomerPortal):
def _prepare_portal_layout_values(self):
d = super()._prepare_portal_layout_values()
d['password_minimum_length'] = request.env['ir.config_parameter'].sudo().get_param('auth_password_policy.minlength')
return d
This is how we can create and override a controller in Odoo 16