Skip to content

Hotfix: fix news attachment link validation - #698

Merged
TThanos3000 merged 1 commit into
masterfrom
hotfix/news-attachments
Aug 21, 2026
Merged

Hotfix: fix news attachment link validation#698
TThanos3000 merged 1 commit into
masterfrom
hotfix/news-attachments

Conversation

@TThanos3000

Copy link
Copy Markdown
Collaborator

Что исправлено

Backend действительно воспроизводил Invalid pk при отправке files=[UserFile.link] в News API, даже когда UserFile существовал и принадлежал authenticated user.

Root cause: поле files объявлено как PrimaryKeyRelatedField(..., many=True). DRF оборачивает его в ManyRelatedField, а фактическая валидация каждого элемента выполняется через child_relation. Код менял self.fields[files].queryset, но child_relation.queryset оставался исходным UserFile.objects.none(), поэтому любой URL валидировался как несуществующий pk.

Fix минимальный: ownership validation сохранён, queryset текущего пользователя назначается на self.fields[files].child_relation.queryset.

Regression tests

Добавлен news/tests/test_news_attachment_contract.py:

  • POST /projects/<id>/news/ принимает UserFile.link текущего пользователя и прикрепляет именно этот UserFile.
  • POST /auth/users/<id>/news/ принимает UserFile.link текущего пользователя и прикрепляет именно этот UserFile.
  • POST /programs/<id>/news/ принимает UserFile.link текущего пользователя и прикрепляет именно этот UserFile.
  • Production-like flow: POST /files/ с замоканным CDN upload создаёт UserFile; upload_response.data[url] == UserFile.link; UserFile.user == authenticated_user; затем POST /projects/<id>/news/ с files=[url] возвращает 201.
  • Дополнительно покрыт прямой serializer-level contract.

Существующий security-case UserFile другого пользователя → 400 сохранён и проходит.

Проверки

Команда:

DEBUG=True python manage.py test news.tests.test_news_attachment_contract news.tests.test_news_project_api.ProjectScopedNewsAPITests.test_project_news_create_rejects_file_of_another_user --verbosity 1

Результат: 6 tests passed.

Также:

python -m black --check news/serializers.py news/tests/test_news_attachment_contract.py

Результат: passed.

Примечание по локальному окружению

Локально tests запускались во временном venv на Windows. Для обхода отсутствующих native runtime deps были использованы test-env shims только вне репозитория: webp и weasyprint не выполнялись в этих сценариях, CDN upload замокан. В репозиторий эти shims не добавлялись.

Frontend PR #281 не менялся.

@TThanos3000
TThanos3000 marked this pull request as ready for review August 21, 2026 03:32
@TThanos3000
TThanos3000 merged commit 9075dc9 into master Aug 21, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant