fixup! SimulationTool: rewrite getAvailableTimeMovementList
ERP5/PresencePeriod: allow to customize the place to find calendar period exceptions
erp5_calendar: define permissions on the module
erp5_calendar: allow to customize the list of periods (exceptions included)
SFTPConnection.readBinaryFile now returns binary str, instead of StringIO object.

also readAsciiFile normilises CRLF/CR/LF.
Use default __hash__ method for ERP5 objects

If an object has no uid yet and has no acquisition context to the portal,
getUid() fails.

Default is derived from id(aq_base(ob)) which is even more efficient.

The method on XMLObject was also redundant because it inherited the same one
from Base.
Fix cache of Predicate.asPredicate
Redirect to absolute url of respective Web Section so if 'Renderer ID' is set (as usually when a web section is used for forum) the UI displays iforum UI which is not the case when default 'view' of Web Section is used if we redirect to using form_id.
As thread is show immediately correct message to not confuse users.
Add description on predicate view
CRM: store domains for communication plan in communication_plan_domain
ERP5Type.patches.Restricted: Allow importing "struct" standard module.
Add support for dynamic amount generator lines/cells
Remove deprecated Resource.getPricingVariable

Default getPriceCalculationOperandDict script calls getPricingVariable
type-based script directly if variable_additional_price is not 0.
Amount: for total price, acquire price on resource only if unset

When a user explicitely enters 0 on a Trade Model Line, total price must be 0
no matter what is set on the resource.
Amount Generator: typos
Do not generate amounts without any base_application

Before we dropped amounts with quantity=0 and we stopped doing that because
it broke expand. However, there's still one case when such amount can be
ignored, i.e. when there's no base_application set on the amount generator.
applicable supply lines should be sorted by explanation's effective model list's order.