diff --git a/.editorconfig b/.editorconfig index 130ee99..adb5f2f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,9 +10,7 @@ trim_trailing_whitespace = true [*.html] max_line_length = 240 -trim_trailing_whitespace = true [*.md] max_line_length = off -trim_trailing_whitespace = true diff --git a/THIRDPATY.md b/THIRDPATY.md index db9d454..4942b6d 100644 --- a/THIRDPATY.md +++ b/THIRDPATY.md @@ -10,42 +10,42 @@ ## Таблица. Перечень сторонних библиотек и компонентов -| № п/п | Наименование компонента | Версия | Тип лицензии | Функциональное назначение компонента | -|---|---|---|---|---| -| 1 | Django | 6.0.7 | BSD-3-Clause | Основной веб-фреймворк архитектуры ПО | -| 2 | djangorestframework | 3.17.1 | BSD-3-Clause | Построение REST API интерфейсов | -| 3 | asgiref | 3.11.1 | BSD License | Поддержка асинхронных интерфейсов веб-сервера | -| 4 | boto3 | 1.43.44 | Apache-2.0 | Интеграция и управление облачным объектным хранилищем | -| 5 | botocore | 1.43.44 | Apache-2.0 | Ядро низкоуровневых запросов к облачной инфраструктуре | -| 6 | s3transfer | 0.19.0 | Apache-2.0 | Управление многопоточной загрузкой файлов в хранилище | -| 7 | django-storages | 1.14.6 | BSD License | Подключение внешних хранилищ данных к медиа-файлам | -| 8 | concurrent-log-handler | 0.9.29 | Apache-2.0 | Безопасное многопоточное логирование процессов | -| 9 | django-cors-headers | 4.9.0 | MIT | Регулирование правил кросс-доменных запросов (CORS) | -| 10 | django-environ | 0.14.0 | MIT | Безопасная конфигурация проекта через переменные окружения | -| 11 | django-split-settings | 1.3.2 | BSD License | Модульное разделение настроек проекта по окружениям | -| 12 | split-settings | 1.0.0 | BSD License | Вспомогательная утилита разделения конфигурационных файлов | -| 13 | gunicorn | 26.0.0 | MIT | WSGI-сервер для развертывания веб-приложения | -| 14 | jmespath | 1.1.0 | MIT | Декларативный синтаксис для фильтрации JSON-данных | -| 15 | packaging | 26.2 | BSD-2-Clause | Парсинг и валидация версий пакетов зависимостей | -| 16 | python-dateutil | 2.9.0.post0 | Apache-2.0 | Расширенная работа с форматами даты и часовыми поясами | -| 17 | pillow | 12.3.0 | MIT-CMU | Обработка, оптимизация и валидация графических файлов | -| 18 | portalocker | 3.2.0 | BSD-3-Clause | Кроссплатформенная блокировка файлов при записи | -| 19 | psycopg | 3.3.4 | LGPL-3.0-only | См. Особые примечания (Драйвер СУБД) | -| 20 | psycopg-binary | 3.3.4 | LGPL-3.0-only | См. Особые примечания (Драйвер СУБД) | -| 21 | pywin32 | 312 | PSF License | Обеспечение совместимости со средой разработки Windows | -| 22 | redis (Python-пакет) | 8.0.1 | MIT | Клиентская библиотека сетевого протокола RESP | -| 23 | KeyDB (Инфраструктура) | любая | BSD-3-Clause | База данных в ОЗУ для кэширования (вместо ПО Redis) | -| 24 | six | 1.17.0 | MIT | Утилита совместимости кодовой базы | -| 25 | sqlparse | 0.5.5 | BSD License | Форматирование и невалидирующий парсинг SQL-запросов | -| 26 | typing_extensions | 4.16.0 | PSF-2.0 | Поддержка продвинутой статической типизации кода | -| 27 | tzdata | 2026.2 | Apache-2.0 | Системный провайдер актуальной базы часовых поясов | -| 28 | urllib3 | 2.7.0 | MIT | Клиент HTTP-запросов к внешним сервисам | -| 29 | djangorestframework-camel-case | 1.4.2 | BSD License | Автоматическая конвертация стилей JSON-ключей в API | -| 30 | djangorestframework-dataclasses | 1.4.0 | BSD License | Интеграция структур данных Dataclasses в сериализаторы | -| 31 | drf-rack | 0.1.0 | MIT | Дополнительные инструменты профилирования REST API | -| 32 | django-stubs / ext | 6.0.6 | MIT | Аннотации типов для статического анализатора кода | -| 33 | djangorestframework-stubs | 317.0 | MIT | Аннотации типов для валидации API-слоя | -| 34 | types-PyYAML | 6.0.12 | Apache-2.0 | Аннотации типов конфигурационных файлов YAML | +| № п/п | Наименование компонента | Версия | Тип лицензии | Функциональное назначение компонента | +|------:|---------------------------------|-------------|---------------|------------------------------------------------------------| +| 1 | Django | 6.0.7 | BSD-3-Clause | Основной веб-фреймворк архитектуры ПО | +| 2 | djangorestframework | 3.17.1 | BSD-3-Clause | Построение REST API интерфейсов | +| 3 | asgiref | 3.11.1 | BSD License | Поддержка асинхронных интерфейсов веб-сервера | +| 4 | boto3 | 1.43.44 | Apache-2.0 | Интеграция и управление облачным объектным хранилищем | +| 5 | botocore | 1.43.44 | Apache-2.0 | Ядро низкоуровневых запросов к облачной инфраструктуре | +| 6 | s3transfer | 0.19.0 | Apache-2.0 | Управление многопоточной загрузкой файлов в хранилище | +| 7 | django-storages | 1.14.6 | BSD License | Подключение внешних хранилищ данных к медиа-файлам | +| 8 | concurrent-log-handler | 0.9.29 | Apache-2.0 | Безопасное многопоточное логирование процессов | +| 9 | django-cors-headers | 4.9.0 | MIT | Регулирование правил кросс-доменных запросов (CORS) | +| 10 | django-environ | 0.14.0 | MIT | Безопасная конфигурация проекта через переменные окружения | +| 11 | django-split-settings | 1.3.2 | BSD License | Модульное разделение настроек проекта по окружениям | +| 12 | split-settings | 1.0.0 | BSD License | Вспомогательная утилита разделения конфигурационных файлов | +| 13 | gunicorn | 26.0.0 | MIT | WSGI-сервер для развертывания веб-приложения | +| 14 | jmespath | 1.1.0 | MIT | Декларативный синтаксис для фильтрации JSON-данных | +| 15 | packaging | 26.2 | BSD-2-Clause | Парсинг и валидация версий пакетов зависимостей | +| 16 | python-dateutil | 2.9.0.post0 | Apache-2.0 | Расширенная работа с форматами даты и часовыми поясами | +| 17 | pillow | 12.3.0 | MIT-CMU | Обработка, оптимизация и валидация графических файлов | +| 18 | portalocker | 3.2.0 | BSD-3-Clause | Кроссплатформенная блокировка файлов при записи | +| 19 | psycopg | 3.3.4 | LGPL-3.0-only | См. Особые примечания (Драйвер СУБД) | +| 20 | psycopg-binary | 3.3.4 | LGPL-3.0-only | См. Особые примечания (Драйвер СУБД) | +| 21 | pywin32 | 312 | PSF License | Обеспечение совместимости со средой разработки Windows | +| 22 | redis (Python-пакет) | 8.0.1 | MIT | Клиентская библиотека сетевого протокола RESP | +| 23 | KeyDB (Инфраструктура) | любая | BSD-3-Clause | База данных в ОЗУ для кэширования (вместо ПО Redis) | +| 24 | six | 1.17.0 | MIT | Утилита совместимости кодовой базы | +| 25 | sqlparse | 0.5.5 | BSD License | Форматирование и невалидирующий парсинг SQL-запросов | +| 26 | typing_extensions | 4.16.0 | PSF-2.0 | Поддержка продвинутой статической типизации кода | +| 27 | tzdata | 2026.2 | Apache-2.0 | Системный провайдер актуальной базы часовых поясов | +| 28 | urllib3 | 2.7.0 | MIT | Клиент HTTP-запросов к внешним сервисам | +| 29 | djangorestframework-camel-case | 1.4.2 | BSD License | Автоматическая конвертация стилей JSON-ключей в API | +| 30 | djangorestframework-dataclasses | 1.4.0 | BSD License | Интеграция структур данных Dataclasses в сериализаторы | +| 31 | drf-rack | 0.1.0 | MIT | Дополнительные инструменты профилирования REST API | +| 32 | django-stubs / ext | 6.0.6 | MIT | Аннотации типов для статического анализатора кода | +| 33 | djangorestframework-stubs | 317.0 | MIT | Аннотации типов для валидации API-слоя | +| 34 | types-PyYAML | 6.0.12 | Apache-2.0 | Аннотации типов конфигурационных файлов YAML | ## Особые примечания по компонентам с лицензией LGPL (psycopg / psycopg-binary) @@ -55,7 +55,7 @@ (посредством штатных инструкций импорта). Исходный текст самих компонентов модификации не подвергается, в состав разрабатываемого ПО статически -не интегрируется и загружается изолированно из официального публичного репозитория.В соответствии с +не интегрируется и загружается изолированно из официального публичного репозитория. В соответствии с условиями Раздела 4 лицензии GNU Lesser General Public License (LGPLv3), данная схема динамического связывания является правомерной, не распространяет действие условий указанной лицензии на разработанное ПО, не накладывает обязательств по предоставлению исходного текста основного программного продукта и не diff --git a/net/xeaf/rack/serializers/__init__.py b/net/xeaf/rack/serializers/__init__.py new file mode 100644 index 0000000..b33d7f1 --- /dev/null +++ b/net/xeaf/rack/serializers/__init__.py @@ -0,0 +1,9 @@ +# DRF Rack +# Библиотека классов расширений для Django REST Framework +# +# Автор: Николай В. Анохин +# Все права защищены. Лицензия: MIT + +""" +Пакет описания классов сериализаторов +""" diff --git a/net/xeaf/rack/serializers/version_info_response.py b/net/xeaf/rack/serializers/version_info_response.py new file mode 100644 index 0000000..c21d35d --- /dev/null +++ b/net/xeaf/rack/serializers/version_info_response.py @@ -0,0 +1,26 @@ +# DRF Rack +# Библиотека классов расширений для Django REST Framework +# +# Автор: Николай В. Анохин +# Все права защищены. Лицензия: MIT + +""" +Описание класса VersionInfoResponse +""" + +from rest_framework import serializers + + +class VersionInfoResponse(serializers.Serializer): + """ + Формирует объект Информации о версии приложения + """ + + title = serializers.CharField() + """ Наименование """ + + version = serializers.CharField() + """ Номер версии API """ + + debug_mode = serializers.BooleanField() + """ Признак режима отладки """ diff --git a/net/xeaf/rack/urls.py b/net/xeaf/rack/urls.py new file mode 100644 index 0000000..5f61326 --- /dev/null +++ b/net/xeaf/rack/urls.py @@ -0,0 +1,23 @@ +# DRF Rack +# Библиотека классов расширений для Django REST Framework +# +# Автор: Николай В. Анохин +# Все права защищены. Лицензия: MIT + +""" +Модуль маршрутизации вызова представлений +""" + +from net.xeaf.rack.views import VersionViewSet + +p = VersionViewSet.get_paths() +# +# Маршруты +# +urlpatterns = [ + *p, + # *VersionViewSet.get_paths(), + + # Должен быть последним + # "*Error404ViewSet.get_path(), +] diff --git a/net/xeaf/rack/userstory/__init__.py b/net/xeaf/rack/userstory/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/net/xeaf/rack/views/__init__.py b/net/xeaf/rack/views/__init__.py index cbdc1ca..8dc9854 100644 --- a/net/xeaf/rack/views/__init__.py +++ b/net/xeaf/rack/views/__init__.py @@ -7,3 +7,5 @@ """ Пакет описания классов представлений """ + +from .version_view_set import VersionViewSet diff --git a/net/xeaf/rack/views/version_view_set.py b/net/xeaf/rack/views/version_view_set.py new file mode 100644 index 0000000..1a9285e --- /dev/null +++ b/net/xeaf/rack/views/version_view_set.py @@ -0,0 +1,60 @@ +# DRF Rack +# Библиотека классов расширений для Django REST Framework +# +# Автор: Николай В. Анохин +# Все права защищены. Лицензия: MIT + +""" +Описание класса VersionViewSet +""" + +from typing import Any +from uuid import UUID + +from rest_framework.permissions import AllowAny + +from net.xeaf.rack.core import CoreModel +from net.xeaf.rack.core.views import CoreViewSet +from net.xeaf.rack.core.views import ViewSetRetrieveMixin +from net.xeaf.rack.serializers.version_info_response import VersionInfoResponse + + +class VersionViewSet(ViewSetRetrieveMixin, CoreViewSet): + """ + Представление версии приложения + """ + + permission_classes = [AllowAny, ] + """ Классы проверки прав доступа """ + + item_detail_pattern = "" + """ Путь для работы с объектом """ + + response_serializer = VersionInfoResponse + """ Общий класс сериализатора для ответа """ + + def _process_retrieve(self, pk: UUID | None, params: dict[str, Any]) -> dict[str, Any] | CoreModel: + """ + Обработка запроса на получение версии приложения + """ + + version_info = { + "title": "DRF Rack", + "debug_mode": True, + "version": "0.1.0", + "build": "20230701", + } + + return version_info + + @classmethod + def _process_pk_param(cls, **kwargs: Any) -> UUID | None: + """ + Обработка параметра идентификатора объекта + + :param kwargs: Именованные параметры + + :return: Идентификатор объекта или None + """ + + return None diff --git a/wsgiapp/settings.py b/wsgiapp/settings.py index 0b402a9..412da2f 100644 --- a/wsgiapp/settings.py +++ b/wsgiapp/settings.py @@ -12,6 +12,8 @@ https://docs.djangoproject.com/en/6.0/ref/settings/ from pathlib import Path +import sys + # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent @@ -74,12 +76,21 @@ WSGI_APPLICATION = 'wsgiapp.wsgi.application' # Database # https://docs.djangoproject.com/en/6.0/ref/settings/#databases -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': ':memory:', +if 'test' in sys.argv: + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': ':memory:', + } + } +else: + # noinspection PyUnresolvedReferences + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': "/tmp/rack/rack.sqlite", + } } -} # Password validation diff --git a/wsgiapp/urls.py b/wsgiapp/urls.py index 13aad50..77611a1 100644 --- a/wsgiapp/urls.py +++ b/wsgiapp/urls.py @@ -1,22 +1,19 @@ -""" -URL configuration for wsgiapp project. +# DRF Rack +# Библиотека классов расширений для Django REST Framework +# +# Автор: Николай В. Анохин +# Все права защищены. Лицензия: MIT -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/6.0/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: path('', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.urls import include, path - 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ -from django.contrib import admin +Модуль маршрутизации +""" + +from django.urls import include from django.urls import path +# +# Маршруты +# urlpatterns = [ - path('admin/', admin.site.urls), + path('v1/', include('net.xeaf.rack.urls')), ]