Files
octopus/myproject/products/views
Andrey Smakotin ffc3b0c42d feat: implement role-based permissions for product views
- Add view mixins (RoleRequiredMixin, OwnerRequiredMixin, ManagerOwnerRequiredMixin) to user_roles/mixins.py
- Replace PermissionRequiredMixin with ManagerOwnerRequiredMixin in all product views
- Remove permission_required attributes from view classes
- Owner and Manager roles now grant access without Django model permissions

This allows owners to access all product functionality through their custom role,
without needing to be superusers or have explicit Django permissions.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 22:44:36 +03:00
..

Структура модуля views

Файл products/views.py был разбит на несколько специализированных модулей для улучшения читаемости и поддерживаемости кода.

Статистика оптимизации

До рефакторинга:

  • Файлов: 1 (views.py)
  • Строк кода: 1202
  • Дублированный код: ~400 строк (12 функций управления фото + 3 функции обработки фото)

После рефакторинга:

  • Файлов: 7 модулей
  • Строк кода: 1284 (включая документацию)
  • Дублированный код: УСТРАНЁН
  • Экономия: ~400 строк дублированного кода заменены на универсальные функции

Структура модулей

1. __init__.py (112 строк)

Экспортирует все представления для обратной совместимости с urls.py. Позволяет использовать импорты вида: from products.views import ProductListView

2. utils.py (73 строки)

Утилиты для работы с фотографиями:

  • validate_photo() - валидация загружаемого фото
  • handle_photos() - УНИВЕРСАЛЬНАЯ функция обработки фото (заменяет 3 дублирующиеся функции)

3. photo_management.py (310 строк)

Универсальные функции управления фотографиями:

  • 4 базовые функции: generic_photo_delete(), generic_photo_set_main(), generic_photo_move_up(), generic_photo_move_down()
  • 12 оберток для Product, ProductKit и Category (заменяют 12 дублирующихся функций из оригинала)

Устранённое дублирование:

  • Было: 12 отдельных функций (по 4 для каждой модели)
  • Стало: 4 универсальные функции + 12 простых оберток

4. product_views.py (182 строки)

CRUD представления для товаров (Product):

  • ProductListView - список товаров с фильтрацией и поиском
  • ProductCreateView - создание товара
  • ProductDetailView - просмотр товара
  • ProductUpdateView - редактирование товара
  • ProductDeleteView - удаление товара

5. productkit_views.py (249 строк)

CRUD представления для комплектов (ProductKit):

  • ProductKitListView - список комплектов
  • ProductKitCreateView - создание комплекта с компонентами
  • ProductKitDetailView - просмотр комплекта
  • ProductKitUpdateView - редактирование комплекта
  • ProductKitDeleteView - удаление комплекта

6. category_views.py (280 строк)

CRUD представления для категорий (ProductCategory):

  • TreeItem - класс для элемента дерева категорий
  • ProductCategoryListView - иерархическое дерево категорий с товарами и комплектами
  • ProductCategoryCreateView - создание категории
  • ProductCategoryDetailView - просмотр категории
  • ProductCategoryUpdateView - редактирование категории
  • ProductCategoryDeleteView - удаление категории

7. api_views.py (78 строк)

API представления:

  • search_products_and_variants() - поиск товаров и групп вариантов для автокомплита

Преимущества новой структуры

Устранено дублирование

  • 12 функций управления фото → 4 универсальные + 12 простых оберток
  • 3 функции обработки фото → 1 универсальная функция

Улучшена организация

  • Логическое разделение по функциональным областям
  • Каждый модуль отвечает за свою сущность (Product, ProductKit, Category)
  • Легко найти нужный код

Упрощена поддержка

  • Изменения в одном типе представлений не затрагивают другие
  • Проще тестировать отдельные компоненты
  • Легче добавлять новый функционал

Обратная совместимость

  • Все импорты в urls.py работают без изменений
  • Благодаря __init__.py внешний API не изменился

Следование принципам

  • SRP (Single Responsibility Principle) - каждый модуль отвечает за одну область
  • DRY (Don't Repeat Yourself) - устранено дублирование кода
  • Separation of Concerns - разделение по ответственности

Примеры использования

Импорт представлений (работает как раньше):

from products.views import ProductListView, ProductCreateView
from products.views import productkit_photo_delete
from products.views import search_products_and_variants

Импорт из конкретного модуля (новая возможность):

from products.views.product_views import ProductListView
from products.views.photo_management import generic_photo_delete
from products.views.utils import validate_photo

Изменения в коде

Удалено:

  • Неиспользуемый импорт import json
  • Комментарий-мусор "Временный файл для добавления в views.py"

Добавлено:

  • Docstrings для всех модулей
  • Комментарии к универсальным функциям
  • Документация параметров функций

Тестирование

После рефакторинга рекомендуется:

  1. Запустить Django сервер: python manage.py runserver
  2. Проверить все CRUD операции для Product, ProductKit и Category
  3. Проверить управление фотографиями (upload, delete, set main, move up/down)
  4. Проверить API endpoint для поиска товаров

Потенциальные улучшения

В будущем можно:

  1. Добавить базовый класс BasePhotoView для дальнейшего упрощения
  2. Вынести общую логику ListView в миксины
  3. Добавить unit-тесты для каждого модуля
  4. Создать отдельный модуль для миксинов и базовых классов