Deleting a circle is highly destructive. It removes the group chat
alongside history, as well as the user list. It should definitely be
protected by a confirmation dialogue, I have no clue why it wasn't.
Fixes#153.
Prosody changed its role scheme to only support a single primary role
for each user. In addition, the names of the built-in roles have been
changed. We thus follow those changes to be compatible with the most
recent trunk.
One open question is whether we should switch admin -> operator here,
too (operator being a server-wide admin), but so far there's no need
to.
The documentation only talks about SNIKKET_SITE_NAME,
and users thus do not know that they must
set SNIKKET_WEB_SITE_NAME to make
their site name appear on the portal.
The quart pin is required to fix an attribute error which otherwise
occurs during startup. Hence, this should be a good qualifier to know
when it's safe to upgrade.
Note that this is not a problem in Quart, but in flask-WTForms. But
downgrading flask-wtforms does not help [1], so we don't revert that
uprade.
```
AttributeError: module 'quart.json' has no attribute 'JSONEncoder'
```
[1]: https://github.com/pallets/quart/issues/163
At the same time, we can also drop the CSS used for that makeshift tab
box. I always felt a bit uneasy about it, a11y-wise, so it's good
riddance.
Fixes#99.
I am a *bit* sorry for this commit, because ideally this would've been
folded into 6d50b1c2c7 and whatever the
source of the other "conflict" was.
However, as the things have been merged in a batch, I can't do much more
than this.
This is needed because jinja2 had an update which caused the portal to
not work at all:
```
ImportError: cannot import name 'escape' from 'jinja2'
```
Quart needed updating for that.
This update required a lot of typefixes. Apparently, the "canned"
responses (like redirect) are now plain werkzeug responses, while
quart.Response does not inherit from werkzeug.Response (otherwise, we
could've changed the type annotations to werkzeug.Response everywhere,
but that doesn't work because a quart.Response is not a
werkzeug.Response).
P.S.: This time, I *did* check that avatar uploads don't break (see
b007afc).
It is more likely that a user for whose language no translation exists
can read english than danish.
The fallback to english was apparently introduced in c58ce845, though it
is possible that `best_match` did that internally before.
Fixes#131.
`nc` (from netcat) is required for the healthcheck. In
c1cf6ab1e5, the installation was
erroneously moved to the builder image, instead of the final image, so
it was missing since then from the actual application image, causing it
to always show as unhealthy.
Fixes#126.