The Gantt chart passes a bunch of options that come from the macro
invocation or the chart configuration in Trac.ini. A lighter weight
client -- like the ticket change listener -- may not have all those
options and just wants default behaviors. Some missing values weren't
handled as defaults before.

This defaults to disabled (0) and can be controlled by useActuals option in
the TracPM section of trac.ini (1=use actual dates, 0=schedule). The
useActuals parameter to the Gantt chart macro overrides the TracPM value.

TracPM.start(), .finish() now return calculated date, then stored date, then None depending on what is available.

postQuery() now reads schedule from private table rather than having it queried from custom fields

When the rescheduler is done calculating a schedule it uses INSERT or UPDATE to write only changed tickets back to the private schedule table.

Changes to the schedule are stored in the schedle_history table.

This handles inserting initial schedule into DB and updating only changed tickets when rescheduling.

With the changes to TracPM.start(), .finish(), a caller (e.g., the Gantt chart) can:

Query tickets

Optionally schedule them

Iterate over them getting the start and/or finish dates

If the scheduling step is skipped, the dates from the database are used.

There's a potentially inefficiency in how potentially inactive tickets
are found. We might get this set by first getting all the affected
tickets then following the predecessor links from the goal but there
isn't a function for that yet and preQuery() is fairly efficient. I
don't want to optimize prematurely.

For this to work, I have to splice the in-memory ticket graph based on
ticket changes.

This has some gross code that is specific to plugins we use and makes
TracPM less portable but I want to prove this works before trying to
make it generic.

This should fix broken display of extra-long user lists, and it makes
selections from user list useful for the clean-up page as requested.

Dumped access to anonymous session attributes for the current solution,
so these are no longer available for clean-up in the admin web-UI, but
I'll re-implement this later on, if it will be missed too much.

With the publication of this code the requests for feedback are almost
obsoleted, even more, because non of the pre-existing solutions provided the
coverage and extensibility, that is offered now within this plugin.

This especially reverts and reworks parts of [12589] and [12663].
The exploration after cboos's hint in ​t:#11088 made me turn round and use an
approach closely resembling what already had been done to translate docs for
Trac core WikiMacros, although I changed it to fit for Trac 0.12 as well.

Trac core functions are used by default, but the configuration is tweaked
intentionally to not create catalogs in the '*-js' and 'tracini' domain.
So everything is still collected in 'messages', even if three compiler runs
on the same set of catalogs and generating unneeded message javascripts look
a bit awkward.

Because compatibility code predominated in acct_mgr.util it was about time
to re-arrange and form a dedicated acct_mgr.compat module.