{% extends "base.html" %} {% block title %}{{ t('accounts.title') }} — painfree{% endblock %} {% block body %}

{{ t('accounts.heading') }}

{{ t('accounts.lede') }}

{% if auth_mode != 'basic' %}

{{ t('accounts.other_mode') }}

{% endif %}

{{ t('accounts.list_heading') }}

{% if accounts %} {% for row in accounts %} {# The subject is the key every grant names. It is an identifier: never translated, never reformatted. #} {% endfor %}
{{ t('access.subject') }}{{ t('access.name') }} {{ t('api.role') }}{{ t('accounts.password_set') }} {{ t('accounts.status') }}
{{ row.subject }} {{ row.display_name or '—' }} {{ row.role.value }} {{ row.password_changed_at | moment }} {% if row.disabled %}{{ t('accounts.suspended') }}{% else %}{{ t('accounts.active') }}{% endif %}
{# The account the password belongs to, present and hidden. A password field with no username beside it is a field a password manager files under the wrong account, and Chrome says so in the console -- which is how this was found. The view ignores the field: the subject is in the path. #}

{{ t('accounts.delete_keeps_grants') }}

{% else %}

{{ t('accounts.none') }}

{% endif %}

{{ t('accounts.add_heading') }}

{{ t('accounts.lockouts_heading') }}

{{ t('accounts.lockouts_why') }}

{% if lockouts %} {% for row in lockouts %} {% endfor %}
{{ t('accounts.lockout_scope') }}{{ t('accounts.lockout_value') }} {{ t('accounts.failures') }}{{ t('accounts.locked_until') }}
{% if row.scope == 'subject' %}{{ t('accounts.scope_subject') }} {% else %}{{ t('accounts.scope_source') }}{% endif %} {{ row.value }} {{ row.failures }} {% if row.locked() %}{{ row.locked_until | moment }}{% else %}—{% endif %}
{% else %}

{{ t('accounts.no_lockouts') }}

{% endif %}
{% endblock %}