* Use the custom-styled checkbox
* Use PNG instead of icon font for channel kind logos
* Show channel's description the same way as in the channels list
(using a reusable template, templates/front/channel_description.html)
* MVP for notification groups.
* Addressed review comments.
* Push notification group to the front.
* Updated icons.
* Reduce code duplication.
* Show groups at the top.
* Add label to group forms.
* Add checkboxes for integration selection.
* CSS for checkboxes.
* Added tests for group notify.
In Project admin, when listing project members, for single-member
projects the owner's email address was being displayed
unescaped. This allowed unescaped amperstand and quote characters
to appear in HTML output.
Pagination, filtering, and result counting in Ping admin is tricky
as the pings table can contain millions of rows.
We previously used "select reltuples from pg_class" trick to
estimate the total number of rows. This only works on Postgres,
and does not handle WHERE filters.
This commit removes the search box, and changes the pagination
template to allow pagination between pages 1-9 and nothing more.
In hc.lib.date.format_approx_duration, we were calling
timedeltaobj.total_seconds() and basing all calculations off that.
This method returns float, so the final result was "2.0 hours" or
"3.0 days" and similar. We now convert it to int, to get "2 hours",
"3 days" etc.
"body" is an obsolete field and kept around for the sake
of very old pings. For all new pings body data goes either
into the "body_raw" binary field (for small bodies)
or in the object storage (for not so small bodies).
So it is not useful to show the body field in the Ping admin.
The test is checking if a Pushbullet channel shows up in the
channels list. It was looking for the string "Pushbullet".
The problem is this string shows up unconditionally on
the right side filters panel. The fix is to look for
"ic-pushbullet" (the pushbullet icon), which should only
appear inside the list view.