Unify and refactor exception handling in framework and addons.
The generic `except_osv` is now deprecated, and replaced by more specialized exception subtypes:
- `UserError` (renamed from Warning, as it conflicts with the built-in `Warning`) raised when a non-technical error occurs during a business operation. It could be a missing information in the data provided by the user, or a misconfiguration.
- `AccessError`: raised when any operation is denied because the user conducting it does not have the required access rights.
- `AccessDenied`: raised when an operation that requires authenticated access is attempted via an unauthenticated request.
- `MissingError`: raised when an operation is attempted on a record that does not exist.
- `ValidationError`: raised when an operation violates a SQL or Python constraint.
- All other exceptions are internal errors due to a system problem or bug, and raised untouched to the client-side, which should display a traceback.
All exceptions take a single message argument.
The `test_exceptions` module has been updated to showcase both new and old (deprecated) exceptions.
A great many old `except_osv` had a useless title with "Error!" or "Warning", those have been removed, as this is handled by the client-side widget that displays the messages.
This commit introduces a more consistent policy for logging errors and warnings:
- All messages that do not require administrator attention should be logged at INFO level or lower. This includes all errors that are notified to the user in a friendly manner, even for access right problems or validation errors during business operations.
- All messages that indicate a likely misconfiguration or malicious use by the users should be logged at WARNING level, as they typically require administrator attention.
- All other unhandled internal errors cannot typically be handled by the user and should be logged at ERROR or higher level, as they require immediate administrator attention.
* Only trigger a menu reflow when needed (show/hide planner)
* Do not include webclient and menu; use webclient reference
(Courtesy of sle-odoo)
Also, change the way to switch planner page. Switching keep now the URL fragment of the webclient, and don't use collapse bootstrap class. Fix url builder server side.
and prevent the last breadcrumb to be clickable (revert of 61dec05).
The last breadcrumb clickable to refresh the view is no longer necessary
with the form view icon available.
The weird code on the click handler for switching views is due to the
fact that most views refresh with a do_search but the form view is
refreshed with a do_show. A more generic way to update the view
seems necessary to prevent such artifacts.
courtesy of mva. This adds the weekday function to date objects in
pyeval. This will be useful for adding better filters (such as this
week) in the searchview.
done in list view, this is a button used for boolean fields
used to switch between pending-grey-false and done-green-true.
hr_holidays: use this newly-introduced button on form view.
I am sure HR people will love R&D now.
Courtesy of RD India: Mitesh Savani (msa@odoo.com)
Reviewed by Use Merge: Thibault Delavallée (tde@odoo.com)
form view icon should always be displayed in the view manager. This
is useful in some situations:
* switch to form view from editable list view
* refresh a form view
1. The merge of the "email_template" module into the "mail" module.
2. The send action of the mass mailing has been moved from the frontend to a cron, because it was too slow to send over 10,000 mails (the user's browser was blocked for 15 - 20 minutes). Mass mailings have now their own process in the kanban view.
3. Mails sent from the mail form are sent immediatly instead of from the mail queue (for instance, when you go to sales > customers > list view > select 2 -3 customers > More > Partner Mass Mailing).
4. Users have now the choice from which mailing list they want to unsubscribe when they click on the unsubscribe link at the bottom of the mail.
5. Mass mailings inherit from their campaign UTMs and mass mailing campaigns are linked to an UTM campaign.
6. Many little improvements
- Add a new SystrayMenu widget to improve and facilitate the way
of adding widgets in .oe_systray
- Rendering of the modules menu now waits for the systray and
user menus to be rendered
- A few refactoring of the UserMenu and Menu widgets
Apply a z-index of 1051 (bootstrap'smodals are 1050). This fixes
an issue with the many2one hidden in a modal. Also, removed a
reference to a removed file.
- Old behavior: each page with such a modifier was first set
invisible at creation of the InvisibiliyChanger attached to
it, and then, after domain evaluation, the page was reset
to visible if needed.
- New behavior: wait for the domain evaluation to decide to set
a page invisible. It also fixes a bug when 2 pages where
active simultaneously. Moreover, we only switch to a newly
displayed page if we are in edit mode (use case: we edited
a field making the page's domain true, so we want the user
to pay attention to this page).
linting views.js revealed some problems. Most of them minor, but
some of them more serious: redeclared variables in if clauses can
shadow the outer variable, or not. It is fragile, and will cause bugs
if the code is refactored.
If the date format language was changed to invert month & day values (so, changed to the classic european format instead of the american format)
Then, when entering manually a datetime without the time (so just '01/02/2014' instead of '01/02/2014 00:00:00', the day and month were inverted (the datetime was set to 02/01/2014 instead of 01/02/2014) because the datetime entered did not exactly match the date + time pattern.
We therefore added a fallback case, to test to parse the value with the date pattern alone (without the time)
Introduction of a specialized InvisibilityChanger for the notebook. It
allows to handle more elegantly the issues of the notebook during
page execution: modifiers hiding the active tab that must now
active its sibling.
Process_notebook only handle the processing of the page while
NotebookInvisibilityChanger only handle the behavior of the notebook
during the page execution.
- readable code (more readable, at least)
- correct handle of autofocus
- rendering of the whole notebook in one call to qweb's render
- one invisibility changer bound by header/content
- no custom css, only legacy bootstrap
jquery's `replaceWith` function behaves differently between 1.8 and 1.9.
This function is used by `renderElement` of the Odoo widget API and, when
called on a template with multiple root nodes, will fail to replace the
whole original nodeset by the new but instead will replace every node
by the new nodeset.
Sample:
1) Suppose a DOM containing
<div>1</div>
<div>2</div>
and a jquery nodeset [<div>1</div>, <div>2</div>] referring to the
previous DOM part in a var named $oldel.;
2) suppose another jquery nodeset [<div>3</div>, <div>4</div>] in $el;
$oldel.replaceWith($el) will result in
"3434" in jquery 1.9.1
"34" in jquery 1.8.3
This issue particulary concerns us when the dom of a widget is not wrapped
into single tag and when re-calling renderElement (triggering replaceElement).
The fix is to wrap the element to be replaced ($oldel in the example) behind
a div before calling replaceWith.
This line was previously used to allow attribute selectors to match the
`selected` property, by changing the attribute each time the property
was changed. Now it doesn't make sense since rev c611846 introduced
property selectors + it seems to mess with phantomjs, as the test does
not pass in phantomjs environment but passes ok in a "real" webkit browser.
Since jquery 1.9, attr selector only matches attributes (the behavior was not
consistent before, sometimes it returned the properties [0]) and tour.js was
relying on those inconsistencies. This commit introduce common properties
selector to allow matching properties during a tour.
[0] http://jquery.com/upgrade-guide/1.9/#attr-versus-prop-
This commit is a split of the former graphview into a pivot view (the
tabular view) and graph view (the various charts). The code was fully
rewritten.
* pivot view should be faster (better underlying data structure and
better algorithm)
* better integration with the web client (use of sidebar, of menu buttons,
bettor style)
* new feature: pivot view can be sorted
* new feature: pivot view cells can be clicked to open a list view with
the corresponding domain
* web_graph addon was removed, and the graph view code has been moved
to the addon web.
* the interaction with the searchbar was changed (no more column facet)
* better and simpler code for graph view
* mary corner cases in graph charts have been corrected (for ex, pie
chart with positive and negative numbers)
* graph/pivot correctly save their state when added to dashboard/saved
(state such as current measure, chart mode, column groupbys, ...)