Главная Документация Руководство разработчика модулей Процесс установки модуля: подробное описание

Поиск

Релиз

Содержание

Нужна помощь?

Не нашли ответ на свой вопрос? Свяжитесь с нашей службой поддержки.

Обратиться в поддержку

Процесс установки модуля: подробное описание

Обновлено: 07 Декабрь 2025 Версия: 2.2

При установке модуля в системе происходит следующий процесс:

1. Загрузка и валидация ZIP архива

  1. Загрузка ZIP файла - модуль загружается через админ-панель или API
  2. Распаковка во временную директорию - ZIP архив распаковывается во временную папку (/tmp/...)
  3. Валидация **module.json**:
  4. Проверка наличия обязательных полей (name, code, version, settings)
  5. Проверка структуры конфигурации
  6. Проверка версии системы (если указана min_system_version)
  7. Проверка зависимостей от других модулей
  8. Валидация структуры меню (до 3 уровней вложенности)
  9. Валидация структуры URL

2. Копирование файлов модуля и обновление apps.py

Путь установки:

{BASE_DIR}/modules/installed/{app_name}/

Где:

  • BASE_DIR - корневая директория проекта Django
  • app_name - имя Django приложения из module.json -> settings.app_name

Процесс копирования:

  1. Создается директория modules/installed/ (если не существует)
  2. Если в ZIP архиве есть папка с именем модуля, используется она, иначе - корень архива
  3. Если модуль уже установлен, старая версия удаляется
  4. Все файлы модуля копируются в целевую директорию:
  5. models.py, views.py, urls.py, admin.py
  6. migrations/ - папка с миграциями
  7. templates/ - шаблоны
  8. static/ - статические файлы
  9. apps.py - конфигурация приложения
  10. Все остальные файлы модуля

Автоматическое обновление apps.py: После копирования файлов система автоматически обновляет файл apps.py модуля:

  • Поле name в классе AppConfig обновляется на полный путь: modules.installed.{app_name}
  • Это необходимо для корректной работы Django, так как приложение добавляется в INSTALLED_APPS с полным путем
  • Например, если app_name = 'task_reminder_module', то name будет изменено на 'modules.installed.task_reminder_module'
  • Важно: Поле label остается без изменений и должно быть указано в исходном файле

Пример обновления apps.py:

# До установки:
class TaskReminderConfig(AppConfig):
    name = 'task_reminder_module'
    label = 'task_reminder_module'  # Остается без изменений

# После установки (автоматически):
class TaskReminderConfig(AppConfig):
    name = 'modules.installed.task_reminder_module'  # Обновляется автоматически
    label = 'task_reminder_module'  # Остается без изменений

Пример структуры после установки:

/home/kvasnikov/askdev/ask/
├── modules/
│   └── installed/
│       └── example_module/
│           ├── __init__.py
│           ├── models.py
│           ├── views.py
│           ├── urls.py
│           ├── admin.py
│           ├── apps.py
│           ├── migrations/
│           │   └── 0001_initial.py
│           ├── templates/
│           │   └── example_module/
│           └── static/
│               └── example_module/

3. Добавление в INSTALLED_APPS

Автоматическое добавление:

  • Модули автоматически добавляются в INSTALLED_APPS при старте приложения
  • Это происходит через modules/apps.py -> ModulesConfig.ready()
  • Метод загружает все установленные и активные модули из базы данных
  • Каждый модуль добавляется как modules.installed.{app_name}

Процесс:

  1. При старте Django загружается ModulesConfig
  2. Вызывается метод ready()
  3. Загружаются все записи ModuleInstallation со статусом 'installed' и is_active=True
  4. Каждое приложение добавляется в settings.INSTALLED_APPS
  5. Django автоматически загружает приложения из INSTALLED_APPS

Перезапуск приложения:

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

4. Добавление в INSTALLED_APPS и перезагрузка конфигурации

Процесс:

  1. Приложение добавляется в settings.INSTALLED_APPS с полным путем: modules.installed.{app_name}
  2. Конфигурация приложений Django перезагружается через apps.app_configs.clear() и apps.set_installed_apps()
  3. Это необходимо, чтобы Django узнал о новом приложении перед выполнением миграций

Важно: Перезагрузка конфигурации приложений происходит автоматически во время установки модуля.

5. Выполнение миграций базы данных

Автоматическое выполнение:

python manage.py makemigrations {app_label}
python manage.py migrate {app_label}

Процесс:

  1. Если в module.json -> settings.migrations = true (по умолчанию), выполняются миграции
  2. Сначала выполняется makemigrations для создания новых миграций (если они есть)
  3. Затем выполняется migrate с использованием метки приложения (app_label)
  4. Метка приложения соответствует app_name из module.json -> settings.app_name
  5. Все миграции из папки migrations/ применяются к базе данных
  6. Создаются необходимые таблицы, индексы и связи

В случае ошибки:

  • Если миграции не удались, модуль не устанавливается
  • Файлы модуля остаются на диске, но запись об установке не создается
  • Необходимо исправить ошибки в миграциях и повторить установку

6. Регистрация URL маршрутов

Автоматическая регистрация:

  • URL автоматически регистрируются при старте приложения
  • Это происходит через modules/url_loader.py -> get_module_urlpatterns()
  • Функция вызывается в config/urls.py и добавляет URL всех установленных модулей

Процесс:

  1. При загрузке config/urls.py вызывается get_module_urlpatterns()
  2. Загружаются все установленные и активные модули из базы данных
  3. Для каждого модуля читается конфигурация URL из config_data.urls
  4. URL добавляются в основной urlpatterns через path() и include()
  5. Поддерживаются как относительные, так и абсолютные пути импорта
  6. Поддерживаются namespace для URL

7. Регистрация шаблонов

Автоматическая регистрация:

  • Пути к шаблонам модулей автоматически добавляются в TEMPLATES['DIRS'] при старте приложения
  • Это происходит через modules/apps.py -> ModulesConfig.ready()
  • Система находит все установленные модули и добавляет путь modules/installed/{app_name}/templates/ в список директорий шаблонов

Процесс:

  1. При старте Django загружается ModulesConfig
  2. Вызывается метод ready()
  3. Для каждого установленного модуля проверяется наличие папки templates/
  4. Если папка существует, её путь добавляется в TEMPLATES['DIRS']
  5. Django автоматически находит шаблоны в этих директориях

Важно: Шаблоны должны находиться в папке с именем модуля: templates/{module_name}/template.html

Формат конфигурации URL:

{
  "urls": [
    {
      "path": "example/",
      "include": "example_module.urls",
      "namespace": "example"
    }
  ]
}

Перезапуск приложения:

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

7. Регистрация меню

Регистрация в реестре:

  • Конфигурация меню из module.json -> menu сохраняется в ModuleRegistry
  • Меню отображается динамически через template tag {% module_menu_items %}

Отображение:

  • Меню отображается в боковой панели через modules/templatetags/module_tags.py
  • Проверяются права доступа для каждого пункта меню
  • Поддерживается до 3 уровней вложенности

Перезагрузка не требуется - меню отображается динамически при каждом запросе

8. Загрузка шаблонов уведомлений

Автоматическая загрузка:

  • Шаблоны уведомлений из module.json -> notification_templates загружаются в базу данных
  • Email шаблоны создаются в модели EmailTemplate
  • Messenger шаблоны создаются в модели MessengerTemplate

Процесс:

  1. При установке модуля читается секция notification_templates из конфигурации
  2. Для каждого шаблона формируется уникальное имя: {module_code}_{template_name}
  3. Шаблоны создаются или обновляются в базе данных
  4. Шаблоны помечаются как системные (system=True)
  5. Раздел (section) устанавливается в название модуля, если не указан явно

Использование:

  • После установки шаблоны доступны для использования через send_notify()
  • Используйте полное имя шаблона: {module_code}_{template_name}
  • Шаблоны отображаются в разделе настроек уведомлений (/settings/notify/)

При обновлении модуля:

  • Существующие шаблоны обновляются новыми значениями
  • Имя шаблона остается прежним (для совместимости)

При удалении модуля:

  • Все шаблоны модуля удаляются из базы данных

9. Создание записи в базе данных

Создается запись **ModuleInstallation**:

  • module - ссылка на модуль
  • installed_version - установленная версия
  • status = 'installed'
  • is_active = True
  • app_name - имя Django приложения
  • install_path - путь к установленным файлам
  • config_data - полная конфигурация из module.json
  • installed_by - пользователь, установивший модуль
  • installed_at - дата и время установки

Обновляется запись **Module**:

  • is_installed = True

10. Очистка временных файлов

  • Временная директория с распакованным ZIP архивом удаляется
  • Остаются только файлы в modules/installed/{app_name}/