[FIX] purchase: cancel PO lines and set related procurements in exception on cancelation of a PO
[IMP] Changing product qty on product form should work with serial numbers like in 7.0, but we should explain it
Closes #3984
[FIX] account: open Monthly Turnover partner in graph mode

Tree view gives no information
Fixes #4195
[FIX] base: Malaysian currency

Default Currency for Malaysia is MYR (Malaysian ringgit), not MXN (Mexican peso)
Fixes #4193
[FIX] web: typo in Database Manager screen

closes #4205
[FIX] website: image_url fallback when no write_date
[FIX] mail: 1000 as limit for wall messages is a little bit too high.

Just a little bit.
[FIX] gamification: prevent creating goal manually

Fixes #4196
[FIX] http: use default language when lang not in context
[FIX] auth_oauth: ignore "debug" argument when converting fragment to query string
[IMP] base: apps integration
[FIX] sale_margin: margin handle included taxes for sale

Another fix should probably be build for purchase price, but it isn't that easy, we need to know the partner to which the product has been purchased, as taxes are partner/country dependent.

Besides, included taxes in purchase prices happen less often.
[MERGE] forward port of branch 7.0 up to f46fa1d
[MERGE] forward port of branch saas-3 up to 162eb84
[FIX] Report: don't shallow exceptions in report_download
[FIX] Report: html escape the error json string

session.get_file appends the json to the body of the generated iframe and
then tries to json.parse it by reading contentNode on the body.
Exceptions from `report_download` method may contain `<` and `>`, so when
json.parse tries to json.parse the contentNode, it reads only a part of
the original json string. htmlescaping the json string solves the issue
by preventing the content of the json string to be interpreted as html.
[IMP] calendar: Set default value for start* and stop* date/datetime. Else field.function start and stop are not setted by default while they are required.