docs: анализ замены кастомных модулей на библиотеки

- Добавлен django-service-objects==0.7.1 в requirements.txt
- Создан отчёт LIBRARY_REPLACEMENT_ANALYSIS.md с рекомендациями:
  * django-cacheops → замена common/cache_decorators.py
  * django-post-office → замена common/emails.py
  * easy-thumbnails → замена common/image_utils.py
  * django-rules → улучшение permissions
  * requests-cache → кэширование внешних API

План внедрения по фазам с метриками и приоритетами.
Impact: снижение кастомного кода с ~360 до ~50 строк.

Refs: #tech-debt #modernization
This commit is contained in:
igor_nadein 2026-02-27 23:51:02 +03:00
parent 8e66ac9b65
commit 8b5aa07b9f
2 changed files with 272 additions and 0 deletions

View File

@ -40,6 +40,7 @@ django-filter==25.1
django-phonenumber-field==8.1.0
django-registration==5.2.1
django-scheduler==0.12.0
django-service-objects==0.7.1
django-simple-history==3.10.1
django-timezone-field==7.2.1
django-watson==1.6.3

View File

@ -0,0 +1,271 @@
# Анализ замены кастомных модулей на готовые библиотеки
**Дата:** 27 февраля 2026
**Статус:** Рекомендации к внедрению
---
## 🎯 Цель
Снизить объём технического долга через замену кастомных решений на battle-tested библиотеки с активным развитием и поддержкой сообщества.
---
## 📊 Приоритетные замены
### 1. ⭐ **Кэширование (common/cache_decorators.py)** → `django-cacheback` или `django-cacheops`
**Текущая реализация:**
- Кастомные декораторы `@cache_page_per_user`, `@cache_api_response`
- Ручная инвалидация через `invalidate_cache_pattern()`
- Redis-специфичная логика (~130 строк кода)
**Рекомендуемая замена:**
```bash
pip install django-cacheops==7.0.2
```
**Преимущества:**
- ✅ Автоматическая инвалидация при изменении моделей
- ✅ Поддержка queryset кэширования
- ✅ Декораторы per-user/per-args из коробки
- ✅ Интеграция с Django ORM
- ✅ Redis + Django ORM invalidation
**Миграция:**
```python
# Было:
@cache_page_per_user(timeout=300, cache_prefix="feed")
def my_view(request):
...
# Станет:
from cacheops import cached_view
@cached_view(timeout=300)
def my_view(request):
...
```
**Сложность:** 🟢 Низкая (2-4 часа)
**Impact:** 🔥 Высокий - используется в feed, api, realtime
---
### 2. ⭐ **Email-рассылки (common/emails.py)** → `django-post_office`
**Текущая реализация:**
- Функция `send_templated_mail()` (~80 строк)
- Синхронная отправка через `EmailMultiAlternatives`
- Ручная обработка HTML/TXT шаблонов
- Нет очереди, приоритизации, статистики
**Рекомендуемая замена:**
```bash
pip install django-post-office==3.8.0
```
**Преимущества:**
- ✅ Очередь отправки с celery/rq/database
- ✅ Планирование (scheduled emails)
- ✅ Админка с логированием и статистикой
- ✅ Шаблоны в БД с переменными
- ✅ Приоритизация писем
- ✅ Batch отправка
- ✅ HTML + Text из коробки
**Миграция:**
```python
# Было:
send_templated_mail(
subject="Welcome",
to=["user@example.com"],
template_base="emails/welcome",
context={"name": "John"}
)
# Станет:
from post_office import mail
mail.send(
recipients=["user@example.com"],
template="welcome",
context={"name": "John"},
priority='now' # или 'high', 'medium', 'low'
)
```
**Сложность:** 🟡 Средняя (4-8 часов)
**Impact:** 🔥 Высокий - используется в employees, communications, notifications
---
### 3. ⭐ **Обработка изображений (common/image_utils.py)** → `easy-thumbnails` или `sorl-thumbnail`
**Текущая реализация:**
- Функция `compress_image()` (~150 строк)
- Ручное сжатие через Pillow
- EXIF rotation
- Resize с пропорциями
**Рекомендуемая замена:**
```bash
pip install easy-thumbnails==2.10.0
```
**Преимущества:**
- ✅ Автоматическая генерация thumbnails on-demand
- ✅ Async processing через celery
- ✅ Кэширование результатов
- ✅ Водяные знаки, фильтры
- ✅ EXIF rotation из коробки
- ✅ CDN integration
**Миграция:**
```python
# Было:
compressed_data = compress_image(
data,
max_width=512,
max_height=512,
quality=85
)
# Станет (в модели):
from easy_thumbnails.fields import ThumbnailerImageField
class Employee(models.Model):
avatar = ThumbnailerImageField(
upload_to='avatars/',
resize_source=dict(size=(512, 512), quality=85)
)
```
**Сложность:** 🟡 Средняя (6-10 часов)
**Impact:** 🟠 Средний - используется в employees, hikcentral
---
### 4. 🟢 **Права доступа** → Улучшение с `django-rules` или `django-guardian`
**Текущая реализация:**
- Кастомные permissions в api/v1/schedule/permissions.py
- Ручная проверка прав через `has_permission()`
**Рекомендуемая замена:**
```bash
pip install django-rules==4.1.0
```
**Преимущества:**
- ✅ Декларативные правила в одном месте
- ✅ Computed permissions (динамические)
- ✅ Интеграция с Django admin
- ✅ Тестируемость правил
- ✅ Поддержка @permission_required декоратора
**Сложность:** 🟢 Низкая (2-4 часа)
**Impact:** 🟠 Средний - новая фича, не ломает существующее
---
### 5. 🟢 **API Client (api/client.py)** → `httpx` (async) или улучшение через `requests-cache`
**Текущая:**
```python
# api/client.py - синхронный requests
response = requests.get(url, headers=headers)
```
**Рекомендация:**
```bash
pip install requests-cache==1.2.1
```
**Преимущества:**
- ✅ Transparent HTTP caching
- ✅ SQLite/Redis/MongoDB backends
- ✅ ETags, Cache-Control support
- ✅ Экономия внешних API запросов
**Сложность:** 🟢 Минимальная (1-2 часа)
**Impact:** 🟠 Средний - используется в bots, hikcentral, external_sync
---
## 📈 Уже используемые библиотеки (хорошо)
✅ **django-service-objects** - Service Layer Pattern (добавлен)
✅ **django-scheduler** - Календарь и события
✅ **django-watson** - Full-text search
✅ **django-filter** - API фильтрация
✅ **django-simple-history** - Версионирование моделей
✅ **celery** + **redis** - Асинхронные задачи
✅ **django-celery-beat** - Планировщик задач
✅ **django-push-notifications** - Push уведомления
✅ **django-channels** - WebSocket
✅ **djangorestframework** - REST API
---
## ⚠️ Модули, которые НЕ стоит заменять
### `common/external_sync_mixin.py`
**Причина:** Специфичная бизнес-логика синхронизации с внешними системами (HikCentral и др.). Слишком кастомная, нет универсальной библиотеки.
### `ldap_sync/`
**Причина:** Уже используется `ldap3==2.9.1` - отличная библиотека. Наш код - обертка с бизнес-логикой.
### `search/`
**Причина:** Уже используется `django-watson==1.6.3` для full-text search. Допилить существующее.
---
## 🎯 План внедрения (рекомендуемый порядок)
### Фаза 1: Quick Wins (1-2 недели)
1. ✅ **django-service-objects** - УЖЕ ВНЕДРЕНО (employees/services/)
2. 🔲 **requests-cache** - минимальные изменения, моментальный эффект
3. 🔲 **django-rules** - новая фича, не ломает старое
### Фаза 2: Core Improvements (2-3 недели)
4. 🔲 **django-cacheops** - заменяет common/cache_decorators.py
5. 🔲 **django-post-office** - заменяет common/emails.py
### Фаза 3: Media Optimization (1-2 недели)
6. 🔲 **easy-thumbnails** - заменяет common/image_utils.py
---
## 📊 Метрики улучшения
| Метрика | До | После (прогноз) |
|---------|-----|------------------|
| **Кастомный код** | ~360 строк | ~50 строк |
| **Тесты** | 11 (6 passing) | ~30 (библиотечные + наши) |
| **Maintenance** | Высокий | Низкий (community-driven) |
| **Багов** | Средне | Низко |
| **Документация** | Минимальная | Полная (от библиотек) |
---
## 🔗 Ссылки на библиотеки
- [django-cacheops](https://github.com/Suor/django-cacheops) - 2.4k ⭐
- [django-post-office](https://github.com/ui/django-post_office) - 1.1k ⭐
- [easy-thumbnails](https://github.com/SmileyChris/easy-thumbnails) - 1.4k ⭐
- [django-rules](https://github.com/dfunckt/django-rules) - 2.1k ⭐
- [requests-cache](https://github.com/requests-cache/requests-cache) - 2.2k ⭐
---
## ✅ След шаги
1. **Утверждение плана** - выбрать приоритетные библиотеки
2. **PoC** - proof of concept на dev окружении для каждой библиотеки
3. **Миграция** - поэтапно по фазам с тестированием
4. **Cleanup** - удаление старого кода, обновление документации
---
**Подготовил:** AI Assistant
**Дата:** 27.02.2026
**Версия:** 1.0