Mobile Access for Travel Management — Odoo 16 Enterprise Cloud
Dev paradigm: Python (Odoo OWL/QWeb), JavaScript (OWL framework), XML
Assess the Baseline First
Odoo 16’s native mobile app renders the web client in a WebView — nearly all standard views work on mobile, but the experience degrades for complex multi-step workflows. Before custom development, confirm whether your travel module is a third-party addon or in-house built, because that determines what you can configure vs. what you must code.
Check active modules:
Settings → Technical → Modules → Installed Modules
Filter: "travel"
Option 1: Responsive View Optimization (Lowest Effort)
If your travel module uses standard form/list/kanban views, add responsive attributes — no new module required, but isolate changes in a custom addon for rollback safety.
Rollback: Uninstall the custom addon via Settings → Modules; all XML overrides revert cleanly.
# __manifest__.py
{
'name': 'Travel Mobile Enhancements',
'version': '16.0.1.0.0',
'depends': ['your_travel_module'],
'data': ['views/travel_request_mobile.xml'],
}
<!-- views/travel_request_mobile.xml -->
<odoo>
<record id="travel_request_form_mobile" model="ir.ui.view">
<field name="name">travel.request.form.mobile</field>
<field name="model">travel.request</field>
<field name="inherit_id" ref="your_travel_module.travel_request_form"/>
<field name="arch" type="xml">
<!-- Collapse non-critical fields on small screens -->
<xpath expr="//field[@name='internal_notes']" position="attributes">
<attribute name="optional">hide</attribute>
<attribute name="column_invisible">True</attribute>
</xpath>
</field>
</record>
</odoo>
Option 2: Approval Workflow via Activity Inbox
Travel approval workflows are most accessible on mobile through chatter activities. Ensure your approval steps create mail.activity records — employees then approve directly from the Inbox, which renders well on mobile natively (verify in your version).
# In your approval method
def action_submit_travel(self):
self.activity_schedule(
'mail.mail_activity_data_todo',
user_id=self.approver_id.id,
note=f'Travel request #{self.name} pending approval',
)
self.state = 'pending'
Option 3: PWA/Portal Route (No Native App Required)
Expose a portal view for itinerary read-access. This works in any mobile browser without app installation.
# controllers/portal.py
from odoo import http
from odoo.http import request
from odoo.addons.portal.controllers.portal import CustomerPortal
class TravelPortal(CustomerPortal):
@http.route(['/my/travel', '/my/travel/<int:travel_id>'],
type='http', auth='user', website=True)
def portal_travel_list(self, travel_id=None, **kwargs):
travels = request.env['travel.request'].search(
[('employee_id.user_id', '=', request.uid)]
)
return request.render('travel_mobile.portal_travel_list',
{'travels': travels})
Debug Approach
- Use Chrome DevTools device emulation pointed at your cloud URL to catch layout breakdowns before deploying
- Enable
?debug=1 in URL to surface view inheritance conflicts
- Check
ir.ui.view records for conflicting xpath priorities if overrides don’t render
Custom Native App — When to Consider It
Only justified if you need offline access, push notifications for approval deadlines, or GPS/camera integration for expense receipts. That path requires the Odoo REST/JSON-RPC API (verify endpoint structure in your version) and a separate mobile dev project outside the Odoo addon framework.
This draft is based on general Odoo knowledge. It has not been verified against your specific version and environment. Practitioners: verify the steps and share your experience below.