Модуль core содержит общие сущности и инфраструктурные helper'ы, которые
переиспользуются другими доменными модулями Procollab.
В модуле находятся:
- generic-модели лайков, просмотров и ссылок;
- справочники навыков и специализаций;
- generic-связи навыков и специализаций с объектами;
- REST endpoints справочника навыков;
- общие serializers, permissions и pagination;
- helpers для Excel-выгрузок;
- cache-ключи онлайна пользователей;
- WebSocket JWT middleware;
- logging middleware.
core подключен в публичный API через /core/, но публичная API-поверхность
сейчас ограничена endpoints навыков.
Модуль является shared-слоем: изменения в нем могут затронуть users,
projects, news, feed, vacancy, partner_programs, courses,
project_rates, metrics и chats.
Собственных тестов у core сейчас нет. Часть поведения косвенно покрывается
тестами зависимых модулей.
- хранение generic-лайков через
Like; - хранение generic-просмотров через
View; - хранение generic-ссылок через
Link; - справочник навыков
SkillCategory/Skill; - generic-привязка навыков через
SkillToObject; - справочник специализаций
SpecializationCategory/Specialization; - generic-привязка специализаций через
SpecializationToObject; - получение навыков nested-списком по категориям;
- получение навыков плоским paginated-списком с фильтром по названию;
- подготовка XLSX-файлов в памяти;
- безопасная подготовка имени файла и значений Excel-ячеек;
- построение download-response для XLSX;
- формирование ключей online-cache;
- JWT-аутентификация WebSocket через subprotocol;
- перехват стандартного logging в loguru.
core/models.py- generic-модели, навыки и специализации.core/views.py- API справочника навыков.core/serializers.py- serializers навыков и общие request serializers.core/services.py- лайки, просмотры, ссылки и Base64 image encoder.core/utils.py- email helper, online-cache keys и Excel helpers.core/permissions.py- общие permissions.core/pagination.py- общий limit/offset pagination.core/filters.py- фильтр навыков.core/fields.py- кастомное поле списка для comma-separated значений.core/auth/middleware.py- WebSocket JWT auth middleware.core/log/- интеграция стандартного logging с loguru.core/admin.py- Django admin для core-сущностей.
Like- generic-лайк пользователя к объекту черезContentType.View- generic-просмотр пользователя к объекту черезContentType.Link- generic-ссылка, привязанная к объекту черезContentType.SkillCategory- категория навыка.Skill- навык внутри категории.SkillToObject- generic-связь навыка с пользователем, вакансией, проектом или другим объектом.SpecializationCategory- категория специализации.Specialization- специализация внутри категории.SpecializationToObject- generic-связь специализации с объектом.
GET /core/skills/nested/- категории навыков со вложенным списком навыков.GET /core/skills/inline/- плоский список навыков с pagination.
Фильтр для /core/skills/inline/:
name__icontains- поиск навыка по части названия.
Pagination:
limit, по умолчанию10;offset.
Справочник специализаций физически хранится в core, но endpoints находятся в
модуле users:
GET /auth/users/specializations/nested/;GET /auth/users/specializations/inline/.
Для отображения навыков по категориям используется:
GET /core/skills/nested/
Для поиска и autocomplete используется:
GET /core/skills/inline/?name__icontains=python
Доменные модули создают SkillToObject через ContentType.
Например:
usersхранит навыки пользователя;vacancyхранит требуемые навыки вакансии;- serializers используют
SkillToObjectSerializerдля единого response формата навыка.
core.services предоставляет функции:
set_like(obj, user, is_liked);add_like(obj, user);remove_like(obj, user);is_fan(obj, user);get_likes_count(obj);set_viewed(obj, user, is_viewed);add_view(obj, user);remove_view(obj, user);is_viewer(obj, user);get_views_count(obj).
Эти функции используются в news, feed, partner_programs,
project_rates и других местах, где нужен generic-счетчик.
Важно: не все лайки в проекте уже переведены на generic-модель core.Like.
Например, у проектов и мероприятий еще есть отдельные legacy-модели лайков.
Для выгрузок используются:
XlsxFileToExport;sanitize_excel_value;build_xlsx_download_response.
Эти helpers применяются в partner_programs, project_rates, courses,
users и vacancy.
TokenAuthMiddleware подключен в procollab/asgi.py.
Он ожидает WebSocket subprotocols в формате:
["Bearer", "<JWT>"]
После проверки JWT middleware записывает пользователя в scope["user"].
Этим пользуется chats.ChatConsumer.
core.utils содержит функции:
get_user_online_cache_key(user);get_users_online_cache_key().
chats пишет в эти ключи при подключении и отключении пользователя, а
metrics читает aggregate-ключ для отображения количества пользователей онлайн.
users- навыки, специализации, online-флаги, Excel-выгрузки и permissions.vacancy- required skills черезSkillToObject, admin inline и выгрузки.projects- общие serializers/permissions, счетчики просмотров, online данные пользователей.news- generic likes/views.feed- generic likes/views для записей ленты.partner_programs- generic likes/views и Excel-выгрузки.project_rates- счетчики просмотров проектов и выгрузки.courses- Excel-выгрузка результатов.chats- WebSocket auth и online-cache keys.metrics- чтение online-cache.industriesиevents- переиспользуют общие permissions.
- У
coreнет собственных тестов; shared-поведение проверяется в основном косвенно через другие модули. remove_link()вcore.servicesфильтруетLike, а неLink; это выглядит как баг.get_views_count()кеширует значение, ноadd_view()/remove_view()не инвалидируют кеш.get_likes_count()не использует кеш, хотяLIKES_CACHING_TIMEOUTобъявлен.Skill,SkillCategory,SpecializationиSpecializationCategoryне имеют уникальности поname.SkillToObjectиSpecializationToObjectне ограничивают дубли на уровне модели.Base64ImageEncoder.get_encoded_base64_from_url()используетurlopenбез timeout.TokenAuthentication.authenticate()не обрабатывает отсутствие пользователя после декодирования JWT.CustomLoguruMiddlewareпишет логи в директориюlog/внутриBASE_DIR; окружение должно гарантировать доступность этой директории.CustomListFieldпреобразует список в строку через запятую и обратно; формат подходит не для всех типов значений.
Собственных тестов у модуля сейчас нет:
DEBUG=True .venv/bin/python manage.py test core
Текущий запуск находит 0 тестов.
Поведение core частично покрывается тестами зависимых модулей:
newsиfeedпроверяют generic likes/views;vacancyиusersпроверяют работу навыков;metricsпроверяет online-cache keys;partner_programs,project_rates,coursesпроверяют Excel-выгрузки через общие helpers.