Add a new RT::Date->IsSet method

This lets you never try to remember if it was ISO or Unix that was best,
and what about timezones?  Just have a simple boolean check.
Use the new ->IsSet method, rather than checking vs ->Unix
Some bulletproofing on bad input to Unix as a setter

Since you can technically say
    $date->Unix(-5);
and
    $date->IsSet
would return 1
    but $date->ISO
would return 1970-01-01 00:00:00
we should bulletproof for insane inputs.

This lets IsSet just assume that unix time starts at 0 as intended, and
avoids all the code shenanigans removed in the previous commit which
checked for $date->Unix <= 0  or $date->Unix < 1
I#29595: Undef foolproof for PrimaryGroupBy on upgrade

In 4.0, when we process the submitted form for save chart operation
without changing any option in the dropdowns (either ChartStyle or
PrimaryGroupBy), then there isn't any value in the %ARGS which causes
these options to be saved as undef in DB. Additionally, that is the
same behavior for 4.2. Thus, we need to undef foolproof when handling
PrimaryGroupBy to avoid the warnings.
Correct check for explicit undef argument

The int(shift||0) is backcompat with the old behavior that
Unix("") Unix(0) or Unix(undef) all ended up setting to 1970-01-01.
Copy and tweak existing Unix setting tests that worked using Set() to
have them test Unix() also so backwards incompatibility failures are
caught in the future.
I#28787: Add Scrips menu

Add Scrips menu with 'Select' and 'Create' options. The 'Select' opt
defaults to Admin/Scrips path unless the user comes from Global or
Queue's Scrips listing page. The 'Create' one points to the same place
for all cases, except it addes query params when from global or queue
listing pages.
Reorder sequence/table drop-if-exists order

Without this, Postgres won't drop the sequence because the table still
refers to it.  Simple fix is to drop the table if it exists and *then*
try dropping the sequence.  Our other DROP IF EXISTS code touches serial
tables, which handle the sequence dropping for us.
auto discover available stylesheets

they are actually directory names in static/css/
see also #14667
use CKEDITOR_BASEPATH instead to specify ckeditor's basePath

ckeditor figures basePath from the location of ckeditor.js specified in
<script>'s src, but if we are in production mode ($DevelMode is false), since
ckeditor.js is also appended into /NoAuth/js/squished-...js, ckeditor fails to
find the correct basePath.

we can get around it by using CKEDITOR_BASEPATH global variable instead.

see also #29780 and #29987
Revert "explicitly set contentsCss in ckeditor config"

This reverts commit 0a3badea2d49615f47d971e9d94ab9b11a87afe0.

since we explicitly set ckeditor's basePath by global var CKEDITOR_BASEPATH,
this commit is not necessary any more
Merge branch '4.2/ckeditor-base-path' into 4.2-trunk
Merge branch '4.2/add-scrips-menu' into 4.2-trunk
Merge branch '4.2/charts-upgrade-content' into 4.2-trunk
Merge branch '4.2/date-isset' into 4.2-trunk
Merge branch '4.2/pg-drop-if-exists' into 4.2-trunk
Merge branch '4.2/auto-discover-stylesheets' into 4.2-trunk