Skip to content

Latest commit

 

History

History
156 lines (111 loc) · 8.17 KB

File metadata and controls

156 lines (111 loc) · 8.17 KB

News

Назначение

News отвечает за публикации и новости в разных частях продукта.

Модуль хранит новости в единой модели News и связывает их с объектами через generic relation:

  • проектами;
  • пользователями;
  • партнерскими программами;
  • объектами ленты, например вакансиями.

Одна и та же модель используется для двух сценариев:

  • обычная новость с текстом и файлами;
  • служебная запись ленты для существующего объекта, где text = "".

Статус модуля

Модуль рабочий, но связан с несколькими доменными областями и требует аккуратного рефакторинга. Сейчас он обслуживает проектные новости, новости пользователей, новости программ и часть общей ленты.

Первый слой regression-тестов добавлен для живых сценариев API.

Основные возможности

  • создание новости в контексте проекта;
  • создание новости в профиле пользователя;
  • создание новости в партнерской программе;
  • просмотр списка новостей в конкретном контексте;
  • просмотр, редактирование и удаление отдельной новости;
  • отметка просмотра новости;
  • лайк и снятие лайка с новости;
  • участие новостей в общей ленте /feed/;
  • закрепление новости программы через pin.

Архитектура

  • news/models.py - модель News с content_type/object_id, файлами, лайками, просмотрами и флагом pin.
  • news/managers.py - низкоуровневые get_news(obj) и add_news(obj, **kwargs) для работы с generic relation.
  • news/services.py - явное создание project/user/program news и helpers для различения обычной новости и feed-записи.
  • news/querysets.py - явные queryset helpers по контексту URL: project, user или partner program.
  • news/views.py - контекстный API для list/create/detail/update/delete, set_viewed и set_liked.
  • news/serializers.py - request serializers и response serializers, разделенные по контекстам project/user/program.
  • news/permissions.py - права на создание и изменение новости в зависимости от связанного объекта.
  • news/admin.py - админка News.
  • news/tests/ - regression-тесты живых сценариев модуля.

Основные сущности

  • News - публикация или запись ленты.
  • content_object - объект, к которому относится новость.
  • files - вложения новости.
  • likes - generic likes через core.Like.
  • views - generic views через core.View.
  • pin - закрепление новости, сейчас используется для новостей программ.

Feed-запись определяется через helper is_feed_record(news), а обычная новость через is_content_news(news). Сейчас оба helper'а используют текущий признак text, но вызывающий код не должен напрямую проверять text == "".

API

Контекстные endpoints работают для трех базовых URL:

  • /projects/<project_id>/news/ - новости проекта;
  • /auth/users/<user_id>/news/ - новости пользователя;
  • /programs/<program_id>/news/ - новости партнерской программы.

Для каждого контекста доступны:

  • GET <base> - список новостей;
  • POST <base> - создание новости;
  • GET <base><news_id>/ - детальная новость;
  • PATCH <base><news_id>/ - редактирование новости;
  • DELETE <base><news_id>/ - удаление новости;
  • POST <base><news_id>/set_viewed/ - просмотр новости;
  • POST <base><news_id>/set_liked/ - лайк новости.

Связанные endpoints:

  • GET /feed/?type=... - общая лента, которая читает данные из News.

Основные сценарии

1. Новость проекта

Лидер проекта создает новость через /projects/<id>/news/.

Новость сохраняется в news.News, а связь с проектом задается через content_type = Project и object_id = project.id.

Новости проекта с текстом отображаются внутри проекта. Служебные feed-записи из списка проектных новостей исключаются.

2. Новость пользователя

Пользователь создает новость в своем профиле через /auth/users/<id>/news/. Создавать новость за другого пользователя нельзя.

3. Новость программы

Менеджер партнерской программы создает новость через /programs/<id>/news/. Пользователь без роли менеджера программы не может создавать и изменять такие новости.

Новости программ сортируются с учетом pin: закрепленные новости идут выше обычных.

4. Просмотры и лайки

Просмотры и лайки работают через generic-модели core.View и core.Like. Они привязаны к самой новости, а не к объекту, которому эта новость посвящена.

5. Лента

/feed/ читает News и возвращает элементы в формате, зависящем от типа связанного объекта.

Для проектных записей важно различать:

  • text = "" - служебная запись ленты о проекте;
  • новость с текстом - полноценная новость проекта, которая в ленте возвращается как type_model = "news".

Лента исключает новости, связанные с непубличными или черновыми проектами.

Ограничения и правила

  • Новость проекта может создавать и изменять только лидер проекта.
  • Новость пользователя может создавать и изменять только сам пользователь.
  • Новость программы может создавать и изменять только менеджер программы.
  • Вложения новости должны ссылаться только на UserFile текущего пользователя.
  • Несуществующий project/user/program context возвращает 404.
  • Проектные новости реализованы через news.News.

Тесты

Текущие regression-тесты проверяют:

  • manager, service и query helpers;
  • project/user/program API;
  • права на создание и изменение новостей;
  • лайки и просмотры;
  • исключение служебных feed-записей из списка новостей проекта;
  • сортировку закрепленных новостей программы.