Сервер: testbill.smit34.ru | Версия: v1.0.0 (build 37)
Полный отчёт: chat_tasks_29mart.html
| Категория | Кол-во | Статус |
|---|---|---|
| Ранее решено (25-26.03) | 10 | Сделано |
| Исправлено 29.03 | 15 | Исправлено |
Ключевые исправления: сохранение IP/NAS на карточке Users (блокер RADIUS), шейпер, СОРМ 13 отчётов + CSV, поиск по адресам, операции (зависание), блокировка, комментарии, юр.лицо, пароли, тёмная тема.
Проведён аудит всех FK-полей во всех формах биллинга. Для каждого поля выбран оптимальный виджет.
| Записей в таблице | Виджет |
|---|---|
| < 100 | Select2 (обычный <select> с поиском по буквам) |
| 100-500 | Select2 или Popup-select (зависит от контекста) |
| > 500 | Popup-select (лупа, всплывающее окно) |
| > 1000 | Popup + HEAVY_FK_FIELDS (ограничение queryset) |
| Поле | Было | Стало | Записей |
|---|---|---|---|
| pull, host_pull, snat_pull | Popup (лупа) | Select2 | 26 |
| phone | Popup | Select2 | 0 |
| home | Обычный select | AJAX Select2 (поиск по адресу) | 4270 |
| nas | Select (без S2) | Select2 | 13 |
| auth_type | Select (без S2) | Select2 | 9 |
| Поле | Было | Стало | Записей |
|---|---|---|---|
| operator | Обычный select | Popup | 5578 |
| tarif | Select2 | Select2 | 144 |
| Поле | Было | Стало | Записей |
|---|---|---|---|
| promo_next, inactive_tarif | Popup | Select2 | 144 |
| operator | Popup | Popup | 5578 |
| Поле | Было | Стало | Записей |
|---|---|---|---|
| home | Обычный select | Popup + AJAX Select2 | 4270 |
| pull, nat_pull, white_pull и др. | Select | Select2 | 26 |
| Поле | Было | Стало | Записей |
|---|---|---|---|
| operator, voip_operator | Select | Popup | 5578 |
Время загрузки формы: бесконечность → 1.1 секунды
Причина: FK-поля (abonent, users, owner) грузили все 5000+ записей в <select>.
Решение: HEAVY_FK_FIELDS + _limit_edit_fk_querysets()
Список полей, для которых queryset ограничивается (popup-select вместо полного <select>):
HEAVY_FK_FIELDS = ('master', 'operator', 'parent', 'home', 'account', 'abonent',
'tarif_next', 'manager', 'fin_op', 'related_operation',
'counters', 'child_operation', 'related_fin_operation',
'owner', 'users', 'caretaker', 'managment_company')
Убраны: loyalty (6 записей), usluga_range_type (6), atol_config (0), nas (13), tarif (144).
billing/views/form.py, billing/safe_globals.py, billing/static/css/style_select.css, billing/templates/ajax_fields/home_select2.htmlПоля с ценами отображали сырые значения из БД (×1010): 12990000000000 вместо 1299.00.
| Модель | Поля | Было | Стало |
|---|---|---|---|
| Usluga | price | FloatField | MoneyField |
| Usluga | voip_overpay, voip_callpay | DecimalField | MoneyField |
| Tarif | limit, users_limit, users_limit_warning, allow_limit | DecimalField | MoneyField |
| Tarif | change_cost, promise_maxpay, own_disabled_cost | DecimalField | MoneyField |
billing/models/usluga.py, billing/models/tariff.pyВкладка «Смена пароля» на карточке Users заменена на модальное окно Bootstrap 5.
billing/templates/auth_edit_one.html, billing/views/auth.pyВкладки «История», «Подсети пользователей», «Компактные события» давали ошибку 500. Причина: 19 таблиц из миграции 0049 (managed=False, fake-applied) не были созданы в БД.
schema_editor.create_model():
AccountStackType, AuditEvents, ContractNumberPrefixes, CrmTaskType, IptvType, News, VoipType, AdminUsersProfile, AccountStack, CategoryDirections, Discounts, EventsStackCompact, SensorsCounters, SensorsLog, TarifPlanset, TarifUsersUslugaAllow, UserSubnets, UslugaParent, UslugaRangeUslugatry/except в _limit_edit_fk_querysets()EventsStackCompact, UserSubnets добавлены в _EXCLUDE_FORMS['Users']Результат: 3 вкладки (было 11, из них 3 с 500 и 7 пустых)
billing/model/procs.py, billing/views/form.py/admin/select/Homes/ — исправлена (getattr(settings, 'search_number', None))billing/static/css/style_select.css, billing/static/js/script.js, billing/views/form.py| Компонент | Путь | Описание |
|---|---|---|
| rtsh | /usr/local/bin/rtsh | Главная утилита управления конфигурациями NAS |
| OSS команды (18 шт.) | /usr/local/bin/oss/ | cfg_init, cfg_fill, cfg_make, cfg_upload, cfg_download, cfg_save, cfg_diff, cfg_status, cfg_log, acl_fill и др. |
| OSS схемы (44 шт.) | /usr/local/share/oss/ | mikrotik_simple, cisco_isg, redback, asterisk, eltex и др. |
| git, rsync | apt packages | Необходимы для cfg_init и cfg_save |
Все 12 NAS инициализированы со схемой mikrotik_simple_v1:
| NAS | oss_pathname | INI файлы | Шаблоны |
|---|---|---|---|
| Червленое | /var/oss/chervlenoe | 4 | 5 |
| NAS GAP | /var/oss/nas_gap | 4 | 5 |
| TOY | /var/oss/toy | 4 | 5 |
| NAS RAM | /var/oss/nas_ram | 4 | 5 |
| NAS NEO | /var/oss/nas_neo | 4 | 5 |
| Malder | /var/oss/malder | 4 | 5 |
| CCR | /var/oss/ccr | 4 | 5 |
| PLOD | /var/oss/plod | 4 | 5 |
| Test | /var/oss/test | 4 | 5 |
| FAG | /var/oss/fag | 4 | 5 |
| JOY | /var/oss/joy | 4 | 5 |
| NAS_SUN | /var/oss/nas_sun | 4 | 5 |
INI файлы: main.ini, firewall.ini, netflow.ini, pppoe.ini
Шаблоны (.tmplt): firewall_address_list.cfg, firewall_filter.cfg, firewall_nat.cfg, netflow.cfg, pppoe.cfg
oss_data:/var/oss — данные сохраняются между перезапусками контейнераGUNICORN_WORKERS=1, GUNICORN_THREADS=8 (для корректной работы /run_script/ endpoint)<body> (было внутри flex-контейнера → маленькое)btn-success)btn-outline-danger)Dockerfile, docker-compose.prod.yml, billing/static/js/script.js, billing/templates/buttons_nas.html, billing/templates/shell-stdout.html, billing/templates/down_panel.htmlНа странице /admin/Users/<id>/ в верхней панели отображается кнопка-ссылка на клиента: «ООО «Волга-Лайт» (#5211)» → кликабельна, ведёт на карточку клиента.
billing/templates/top_panel.htmlИсправлен порядок полей на карточке Users:
Было: ... SWITCH → Номер квартиры → Дом
Стало: ... Дом → Номер квартиры → SWITCH → Switch порт
Изменено через SQL: FIELD_ORDER в таблице FRAMEWORK_FORM_GROUP_FIELDS.
Файлы планов (в репозитории):
chat_tasks/plan-verstka.md — отслеживание верстки всех страниц (светлая/тёмная тема, адаптивность)chat_tasks/plan-form-selects.md — аудит FK-полей: Select2 vs Popup-selectchat_tasks/plan-radius-nas.md — RADIUS/NAS: сканирование, тестирование, 10 этапов