Skip to main content
iVentureTeam

timesheet_uom_no_toggle

The quieter sibling of timesheet_uom: same per-company unit handling, minus the clickable toggle. timesheet_uom_no_toggle exists for the screens where that button would edit data it should not.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 12, 2026Updated August 12, 20266 min read
Odoo 19 project task view showing timesheet duration fields rendered by the timesheet_uom_no_toggle widget as plain formatted numbers without the toggle button.
Technical nametimesheet_uom_no_toggle
Field typesfloat
Viewsform, list
Modulehr_timesheet (Timesheets app)
Used in core12 occurrences across 1 module: hr_timesheet, chiefly the project task sharing views
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0
No-code setupNo. It is applied in XML; the related no-code lever is the company's timesheet encoding unit setting.
Alternativestimesheet_uom, float_time, float_toggle, float_factor

What the no-toggle timesheet field does

Odoo timesheets store hours, but companies encode effort in different units, hours or days, set per company as the timesheet encoding unit. The timesheet_uom family exists to honor that setting automatically: a widget asks the timesheet_uom service which renderer fits the company, and the service answers float_time for hour encoding, float_toggle for day encoding.

This widget is that dispatcher with one opinion added: it never serves the toggle. Its single override checks whether the service resolved to float_toggle and swaps in float_factor instead, the same factored number rendering without the clickable button. The source even removes the toggle component from the inherited component registry, one deleted key, so the class carries only what it can render. Everything else, the service lookup, the props pass through, the registration pattern, is inherited from timesheet_uom unchanged.

What this means for your team

The toggle in float_toggle is an input device: clicking cycles the value through preset steps, handy for an employee logging half days. That stops being handy the moment the number is informational, a total, a shared task's logged effort, a figure shown to a customer, because a stray click edits data. The no toggle variant is Odoo's answer, and core applies it across the task sharing views, where outside collaborators see effort figures that must stay read only in spirit even when the field is technically editable.

The takeaway for implementations is a simple pairing rule: entry screens for day encoding companies get timesheet_uom and its toggle, display screens get timesheet_uom_no_toggle. Teams that standardize on that pairing stop seeing the "someone changed my logged days by accident" tickets, and the reports built on timesheet data stay trustworthy without extra locking.

Working examples

Effort total on a shared task, no toggle

<field name="effective_hours" widget="timesheet_uom_no_toggle"/>

Entry line where the toggle is welcome, for contrast

<field name="unit_amount" widget="timesheet_uom"/>

The model side is always plain hours

effective_hours = fields.Float("Hours Spent", compute="_compute_effective_hours")

Whatever the widget displays, the stored value is hours; day encoding is a display factor applied by the renderer, not a stored conversion.

The dispatch chain, hours to days and back

The full dispatch chain, as read in the source: the component asks the timesheet_uom service for the timesheet component matching the current company. The service resolves the company's encoding unit to a widget name, float_time for hours, float_toggle for days, and hands back the matching component and props. This widget's single getter intercepts exactly one case: a float_toggle answer is remapped to float_factor, the renderer that multiplies the stored hours by the unit factor and prints the number plain.

Two implications are worth pinning down. First, in hour encoding companies the two timesheet widgets are indistinguishable, both serve float_time, so a missing toggle only ever signals anything in day encoding companies. Second, because resolution happens per company at render time, a multi company database can legitimately show the same field as clock format hours for one company's users and factored days for another's, which is correct behavior, not a bug report.

The class also deletes FloatToggleField from its inherited static components, so the unused renderer is not even carried as dead weight. It is a tidy example of Odoo's composition pattern: fork by one getter, not by copy paste.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. File is byte identical to 19.0 on the development branch. Details below.
Odoo 19.0VerifiedVerified against the shipped source.
Odoo 18.0VerifiedFunctionally identical file; only a module pragma line differs.

Upgrade note for 18 to 19. Nothing to do. The 18.0 file differs only by a removed module pragma line; the override, the component deletion and the registration are identical, and the surrounding service contract is unchanged for this widget's purposes.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026, and as always for unreleased versions, the statements here are read from the public development branch and re-verified once the release ships.

This file is byte identical on master. Both timesheet_uom_no_toggle.js and its parent timesheet_uom.js show no diff at all against 19.0 at the time of writing, not even formatting churn. The dispatch service, the substitution and the registration carry into 20 as they are.

The dependency direction to watch is the underlying renderers: this widget's output is whatever float_time and float_factor do, so changes to those fields in 20 would surface here without this file changing. Our pages for the underlying widgets track that directly.

Common problems and fixes

SymptomCause and fix
Durations show as decimals instead of hh:mmThe company's timesheet encoding unit is days, so the factored renderer is in charge. Switch the company's encoding unit if clock format is wanted, or use float_time directly on that field.
A toggle button appears where you expected noneThe view uses timesheet_uom, not the no toggle variant. Change the widget attribute to timesheet_uom_no_toggle on that field.
The same field renders differently for two usersMulti company: each user's company resolves its own encoding unit at render time. Expected behavior. Align company settings if uniformity matters.
Displayed number looks multiplied compared to stored hoursDay encoding applies the unit factor in the factored renderer; storage stays in hours. Expected. Check the timesheet UoM factor if the ratio is wrong.
Widget unknown error on a databasehr_timesheet is not installed; the widget ships with the Timesheets app. Install Timesheets, or fall back to float_time.
Setting options on the field changes nothingThe widget is an optionless dispatcher. Configure the company encoding unit, or target the underlying renderer instead.

No-toggle timesheet field vs the alternatives

WidgetBest forKey difference
timesheet_uom_no_toggleTimesheet figures on display and shared viewsCompany aware rendering with the toggle permanently removed
timesheet_uomTimesheet entry linesSame dispatcher, serves the clickable toggle for day encoding
float_timeAlways clock format hh:mm, regardless of companyFixed renderer, skips the company dispatch
float_togglePreset step entry by clickingThe interactive renderer this widget exists to avoid
float_factorPlain factored numbersWhat this widget serves for day encoding companies

Choose by intent: entry with day encoding wants the toggle, display wants this widget, and fields that should always be clock format hours regardless of company settings should skip the dispatcher entirely and use float_time.

Frequently asked questions

What does timesheet_uom_no_toggle do in Odoo?+
It displays timesheet durations according to the company's encoding unit, hours or days, exactly like timesheet_uom, but when day encoding would produce the clickable float_toggle it renders a plain factored number instead. Same numbers, no accidental edits.
When should I use it instead of timesheet_uom?+
Whenever the figure is meant to be read rather than entered: task totals, shared and portal facing views, reporting style forms. Core follows the same rule, using the no toggle variant across the hr_timesheet task sharing views, which account for all 12 of its core usages.
Why do my durations show as decimals rather than hours and minutes?+
Because the company encodes timesheets in days, so the widget delegates to the factored renderer. Hour encoding companies get hh:mm through float_time. The stored value is hours either way; only the display changes.
Does the widget have any options?+
None. It is an optionless dispatcher, spreading the equally optionless timesheet_uom descriptor. The configuration lever is the company's timesheet encoding unit, and the display details belong to the underlying float_time and float_factor renderers.
How does it behave in a multi company database?+
Resolution happens per company at render time, so users in an hours company see clock format while users in a days company see factored numbers, on the same field. That split is by design and disappears when company settings are aligned.
Is it available outside the Timesheets app?+
It ships with hr_timesheet, so the module must be installed for the widget to exist. On databases without it, use float_time for clock format display.
Does timesheet_uom_no_toggle change in Odoo 18 or 20?+
Effectively no: the 18.0 file differs by one pragma line, and the development branch for Odoo 20 has the file byte identical to 19.0, parent included. Changes would only arrive indirectly through the underlying renderers, which we track on their own pages.

Timesheet data your invoices can lean on?

Billing disputes usually trace back to effort numbers nobody protected: toggles on shared views, encoding units set differently across companies, factors nobody audited. We implement Odoo Timesheets and project billing with the display, entry and validation layers thought through as one system.

Book a free consultation

How this page was produced

Verified by reading timesheet_uom_no_toggle.js and its parent timesheet_uom.js in the Odoo 19.0 hr_timesheet module, which together define the dispatch and the single substitution this page documents, then diffing both against 18.0, a pragma only difference, and against the public development branch, where both files are byte identical. Usage counts come from our inventory of the 19.0 core views. Found something off? Tell us and we will fix it.