Skip to content

Datanar 2.6.6 (базовые модели, updated_at, фиксы редиректов, переход на psycopg3) - #74

Open
brandonzorn wants to merge 63 commits into
devfrom
vladimir
Open

brandonzorn wants to merge 63 commits into
devfrom
vladimir

Conversation

@brandonzorn

@brandonzorn brandonzorn commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator

Important

TODO:

  • ПРОВЕРИТЬ ЧТО ВСЁ РАБОТАЕТ
  • Исправить: ошибка 400 при редиректе на длинную ссылку ftp:// или ftps://

Caution

  • Исправить: statistic: выгрузка без проверки прав.
    У DownloadStatistic нет LoginRequiredMixin и проверки владельца. Любой человек, зная короткую ссылку, может скачать статистику по её кликам (страна, город, ОС, браузер).

Warning

  • Исправить: Короткие коды почти не уникальны
    В generate_short_link берётся sqids.encode(цифры sha256)[:5]. Первые 5 символов зависят только от первых нескольких цифр числа.
    При тесте из 20000 разных URL всего 5 336 уникальных коротких ссылок.
    Уже при нескольких тысячах ссылок попытки подбора растут. После 200 попыток будет RuntimeError.

Tip

Раньше код ссылки получался как sqids(цифры sha256)[:5], и реально различных кодов выходило всего несколько тысяч: 44,424 дубликатов на 50 000 ссылок и отказы (RuntimeError) примерно с ссылки №5 500.

Одна попытка занимала ~0,5 мс.

Теперь код случайный из [A-Za-z0-9] (secrets), длина 5. Если код занят, делается новая попытка, а после каждых 20 неудач длина растёт на 1 (максимум 200 попыток).
Занятость проверяется через .filter().exists() вместо get_by_short_link, у которого были побочные записи.

=== N = 50,000 ссылок, длина кода L = 5 ===

метод дубли ожидание повторы макс.поп. отказы заметка
sha256+sqids[:L] 44,424 - 26,882 200 10 текущий метод
random base62 + growing L 1 1.4 0 1 0 новый метод

метод мкс/вызов вызовов/с быстрее в
sha256+sqids[:L] 1108.83 902 1.0x
random base62 + growing L 3.77 265,502 294.4x

Warning

  • dashboard: нет валидации regex, один битый паттерн даёт 500 на каждое сокращение ссылки.
  • Префикс ||| превращается в (.*.)+. Это вложенный квантификатор, который на несовпадающем URL работает экспоненциально. Замер на шаблоне |||replit^ и URL https://a.a.a...com/: 20 меток дают 0.05 с, 25 меток уже 1.7 с, то есть время растёт примерно вдвое на каждую метку при большом кол-ве меток проверка занимает более 5 минут.
  • BlockedDomain.str одинаковый для всех записей.

  • ОБНОВИТЬ ФАЙЛЫ ПЕРЕВОДОВ

Новые возможности

  • Добавлены базовые модели в core. Redirect теперь наследуется от UserLinkModel, остальные модели от TimeStampedModel.
  • В админке из списка редиректов убран столбец long_link и добавлен updated_at.
  • Представления списков редиректов возвращают QuerySet вместо list[str].
  • В RedirectSerializer добавлено поле updated_at.
  • Из URL API убрана версия.
  • Кнопка удаления редиректа скрыта для неавторизованных пользователей.
  • В profile.js переписана и улучшена обработка ошибок.

Исправления

  • StatisticConfig.verbose_name: убран lazy(...capitalize())
  • Выгрузка статистики в Excel: убрана колонка «#» с нумерацией, имя файла стало statistic-{link}-{period}.xlsx, добавлен .iterator().
  • Невалидный period в URL теперь даёт 404: появились Period (StrEnum) и PeriodConverter. Методы ClickManager переименованы (for_link*, by_period, count_for_link), get_clicks_by_mode удалена.
  • Исправлена бесконечная рекурсия в FormMethodExtender если _method = "POST".
  • Проверка прав владельца перед удалением редиректа (любой пользователь, даже неавторизованный, мог удалить любую ссылку подменив short_link в форме).
  • Исправлены исключения при пустом пароле. Перед перенаправлением теперь проверяется, что ссылка активна.
  • RedirectManager.get_by_short_link теперь обновляет только необходимые поля.
  • Если HTTP_X_REAL_IP пустой, используется REMOTE_ADDR. Все данные редиректа передаются одним запросом.
  • ValueError при передаче некорректного URL в is_link_shortener теперь игнорируется.
  • Корректное преобразование QuerySet[Redirect] в QuerySet[str] для ссылок.
  • В фикстуры dashboard.blockeddomain добавлены недостающие поля.
  • Исправлен тип движка PostgreSQL в настройках Django.

Рефакторинг

  • Строковые имена полей заменены на атрибуты классов.
  • JS-файлы в статике переформатированы.

Зависимости, сборка и CI

  • Минимальная версия Python теперь 3.11. Тесты для 3.10 убраны, добавлены 3.14 и поддержка 3.15.
  • Обновлены зависимости, psycopg2 заменён на psycopg3, chart.js обновлён с 4.5.0 до 4.5.1.
  • Обновлён образ Python.
  • Из линтера flake8 убран несовместимый плагин flake8-dunder-all.
  • Убран sqids из зависимостей т.к. он больше нигде не используется.

Gray-Advantage and others added 24 commits March 9, 2025 09:25
- Исправлен значок смены темы по умолчанию
- Исправлена проблема с сохранением фокуса на кнопке после смены темы
- Обновлен файл **colorToggler.js**
Ключ деплоя на сервере привязан к forced command: выполняется только
/usr/local/bin/deploy-datanar (git reset на origin/main, compose up --build,
проверка живости). Старые шаги compose down / system prune --volumes убраны:
down ронял сеть datanar_default, в которой живёт прихожая edge-nginx.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…d version

Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
…min panel

Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
@brandonzorn brandonzorn self-assigned this Nov 2, 2026
@brandonzorn brandonzorn added bug Something isn't working enhancement New feature or request labels Nov 2, 2026
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
@brandonzorn brandonzorn changed the title 2.6.6 Draft Datanar 2.6.6 (базовые модели, updated_at, фиксы редиректов, переход на psycopg3) Nov 4, 2026
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
@brandonzorn
brandonzorn marked this pull request as ready for review November 5, 2026 13:14
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
…and remove sqids

Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Signed-off-by: bzorn <v.klimenko.2137@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants