{% extends "base.html" %} {% block title %}System — Puntavia{% endblock %} {# Независимая админка владельца СЕРВИСА: регистрации и оплаты. Свой вход (/system/login) и своя сессия — кабинет сюда не пускает. Тексты намеренно не переводятся — страницу видит только staff, а staff читает по-русски (та же договорённость, что у вкладки «Сервис» в настройках). Инструменты рассчитаны на сотни компаний: поиск, фильтры-состояния, страницы по 50, журнал событий. Взгляд живёт в адресе (?q=&st=&page=) и переживает действия — формы несут его скрытыми полями. #} {% block head %} {% endblock %} {% block crumb %}/System{% endblock %} {% block content %}
{# div, не

: форма внутри абзаца — невалидная разметка, браузер рвёт её сам #}

вход: {{ sysu.email }}
{% if err == 'purge_name' %}
Название не совпало — компания не тронута.
{% endif %} {% macro viewargs() -%} {%- endmacro %} {% macro url(pg=None, st=None) -%} /system?q={{ q | urlencode }}&st={{ st_filter if st is none else st }}&page={{ pg or 1 }} {%- endmacro %}
{% for key, label in (('trial', 'демо'), ('expired', 'кончилось'), ('blocked', 'остановлено'), ('active', 'оплачено')) %} {% if st_filter == key %} {{ label }} · {{ counts[key] }} {% else %} {{ label }} · {{ counts[key] }} {% endif %} {% endfor %}
Компании — {{ total }}{% if q or st_filter %} найдено{% endif %}
{% if not rows %}
Ничего не нашлось.
{% endif %} {# Таблица, а не карточки: на сотнях компаний глазу нужна строка на компанию (владелец, 19.08: «с двумя уже можно запутаться — а если их 1000») #} {% if rows %}
{% for r in rows %} {% endfor %}
КомпанияВладелецСостояниеМашины
{{ r.org.name }}{% if r.org['kind'] == 'personal' %} личный{% endif %}
с {{ r.created }} · тариф {%- if r.org['plan'] in ('s','m','l') %} {{ r.org['plan'] | upper }} · {{ r.org['seats'] }} машин {%- else %} не выбран · {{ r.org['seats'] }} машин{% endif %}
{# Заметка — прямо под названием, а не в «Действиях»: она затем и нужна, чтобы «оплачено» без оплаты объяснялось с одного взгляда. #} {% if r.org['note'] %}
{{ r.org['note'] }}
{% endif %}
{% for o in r.owners %}
{{ o.email }}{% if not o.email_verified %} · почта не подтверждена{% endif %}
{% else %} не назначен {% endfor %}
{% if r.state == 'trial' %}демо · {{ r.days }} дн {% elif r.state == 'expired' %}кончилось · ещё {{ r.days }} дн {% elif r.state == 'blocked' %}остановлено {% else %}оплачено{% endif %} {% if r.n_dev %}{{ r.alive }}/{{ r.n_dev }} · {{ r.seen }}{% else %}нет{% endif %}
Действия
{{ viewargs() }}
{{ viewargs() }}
{{ viewargs() }}
{% if r.state != 'blocked' %}
{{ viewargs() }}
{% endif %} {# Настоящее удаление — за второй дверью и с вписыванием названия: сервер сверяет его дословно, без совпадения ничего не происходит #}
Удалить насовсем…
{{ viewargs() }}

Стираются база, скриншоты и настройки компании — восстановление только из бэкапа. Учётки людей остаются: они могут состоять в других компаниях.

{% endif %} {% if pages > 1 %}
{% if page > 1 %}← новее{% endif %} страница {{ page }} из {{ pages }} {% if page < pages %}старее →{% endif %}
{% endif %}
События{% if q %} — по «{{ q }}»{% endif %}
{% if not events %}
Пока тихо.
{% endif %}
Люди{% if q %} — по «{{ q }}»{% else %} — последние 50{% endif %}
{% if not people %}
Никого не нашлось.
{% endif %}
{% endblock %}