Сессия 29 марта 2026 — Журнал изменений

Сервер: testbill.smit34.ru  |  Версия: v1.0.0 (build 37)

1. Исправления из Telegram-чата (25 задач)

Полный отчёт: chat_tasks_29mart.html

КатегорияКол-воСтатус
Ранее решено (25-26.03)10Сделано
Исправлено 29.0315Исправлено

Ключевые исправления: сохранение IP/NAS на карточке Users (блокер RADIUS), шейпер, СОРМ 13 отчётов + CSV, поиск по адресам, операции (зависание), блокировка, комментарии, юр.лицо, пароли, тёмная тема.

2. Формы — Select2 vs Popup-select

Проведён аудит всех FK-полей во всех формах биллинга. Для каждого поля выбран оптимальный виджет.

Критерии

Записей в таблицеВиджет
< 100Select2 (обычный <select> с поиском по буквам)
100-500Select2 или Popup-select (зависит от контекста)
> 500Popup-select (лупа, всплывающее окно)
> 1000Popup + HEAVY_FK_FIELDS (ограничение queryset)

Изменения по моделям

Users (/admin/Users/<id>/)

ПолеБылоСталоЗаписей
pull, host_pull, snat_pullPopup (лупа)Select226
phonePopupSelect20
homeОбычный selectAJAX Select2 (поиск по адресу)4270
nasSelect (без S2)Select213
auth_typeSelect (без S2)Select29

Abonents (/admin/Abonents/<id>/)

ПолеБылоСталоЗаписей
operatorОбычный selectPopup5578
tarifSelect2Select2144

Tarif (/admin/tarifs/Tarif/<id>/)

ПолеБылоСталоЗаписей
promo_next, inactive_tarifPopupSelect2144
operatorPopupPopup5578

NAS (/admin/equipment/Nas/<id>/)

ПолеБылоСталоЗаписей
homeОбычный selectPopup + AJAX Select24270
pull, nat_pull, white_pull и др.SelectSelect226

Usluga (/admin/tarifs/Usluga/<id>/)

ПолеБылоСталоЗаписей
operator, voip_operatorSelectPopup5578

FinanceOperations (добавление)

Время загрузки формы: бесконечность → 1.1 секунды

Причина: FK-поля (abonent, users, owner) грузили все 5000+ записей в <select>.

Решение: HEAVY_FK_FIELDS + _limit_edit_fk_querysets()

HEAVY_FK_FIELDS (form.py)

Список полей, для которых 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

3. Цены — MoneyField

Поля с ценами отображали сырые значения из БД (×1010): 12990000000000 вместо 1299.00.

МодельПоляБылоСтало
UslugapriceFloatFieldMoneyField
Uslugavoip_overpay, voip_callpayDecimalFieldMoneyField
Tariflimit, users_limit, users_limit_warning, allow_limitDecimalFieldMoneyField
Tarifchange_cost, promise_maxpay, own_disabled_costDecimalFieldMoneyField
Файлы: billing/models/usluga.py, billing/models/tariff.py

4. Смена пароля — модальное окно

Вкладка «Смена пароля» на карточке Users заменена на модальное окно Bootstrap 5.

Файлы: billing/templates/auth_edit_one.html, billing/views/auth.py

5. Вкладки Users — 500 ошибки

Проблема

Вкладки «История», «Подсети пользователей», «Компактные события» давали ошибку 500. Причина: 19 таблиц из миграции 0049 (managed=False, fake-applied) не были созданы в БД.

Решение

  1. Созданы 19 таблиц через Django schema_editor.create_model(): AccountStackType, AuditEvents, ContractNumberPrefixes, CrmTaskType, IptvType, News, VoipType, AdminUsersProfile, AccountStack, CategoryDirections, Discounts, EventsStackCompact, SensorsCounters, SensorsLog, TarifPlanset, TarifUsersUslugaAllow, UserSubnets, UslugaParent, UslugaRangeUsluga
  2. Защита от 500: try/except в _limit_edit_fk_querysets()
  3. Убраны ненужные вкладки: EventsStackCompact, UserSubnets добавлены в _EXCLUDE_FORMS['Users']
  4. Переименована группа «Неопределено» → «Прочее»

Результат: 3 вкладки (было 11, из них 3 с 500 и 7 пустых)

Файлы: billing/model/procs.py, billing/views/form.py

6. Popup-select окно — стилизация

Файлы: billing/static/css/style_select.css, billing/static/js/script.js, billing/views/form.py

7. NAS Развёртывание — OSS утилиты

Установлены утилиты из Carbon 4

КомпонентПутьОписание
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, rsyncapt packagesНеобходимы для cfg_init и cfg_save

Инициализация NAS

Все 12 NAS инициализированы со схемой mikrotik_simple_v1:

NASoss_pathnameINI файлыШаблоны
Червленое/var/oss/chervlenoe45
NAS GAP/var/oss/nas_gap45
TOY/var/oss/toy45
NAS RAM/var/oss/nas_ram45
NAS NEO/var/oss/nas_neo45
Malder/var/oss/malder45
CCR/var/oss/ccr45
PLOD/var/oss/plod45
Test/var/oss/test45
FAG/var/oss/fag45
JOY/var/oss/joy45
NAS_SUN/var/oss/nas_sun45

INI файлы: main.ini, firewall.ini, netflow.ini, pppoe.ini
Шаблоны (.tmplt): firewall_address_list.cfg, firewall_filter.cfg, firewall_nat.cfg, netflow.cfg, pppoe.cfg

Docker конфигурация

Исправления JS

Файлы: 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

8. Клиент в header карточки Users

На странице /admin/Users/<id>/ в верхней панели отображается кнопка-ссылка на клиента: «ООО «Волга-Лайт» (#5211)» → кликабельна, ведёт на карточку клиента.

Файл: billing/templates/top_panel.html

9. Порядок полей Users

Исправлен порядок полей на карточке Users:

Было: ... SWITCH → Номер квартиры → Дом
Стало: ... Дом → Номер квартиры → SWITCH → Switch порт

Изменено через SQL: FIELD_ORDER в таблице FRAMEWORK_FORM_GROUP_FIELDS.

Планы работ

Файлы планов (в репозитории):