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 == "".
Контекстные 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.
Лидер проекта создает новость через /projects/<id>/news/.
Новость сохраняется в news.News, а связь с проектом задается через
content_type = Project и object_id = project.id.
Новости проекта с текстом отображаются внутри проекта. Служебные feed-записи из списка проектных новостей исключаются.
Пользователь создает новость в своем профиле через /auth/users/<id>/news/.
Создавать новость за другого пользователя нельзя.
Менеджер партнерской программы создает новость через /programs/<id>/news/.
Пользователь без роли менеджера программы не может создавать и изменять такие
новости.
Новости программ сортируются с учетом pin: закрепленные новости идут выше
обычных.
Просмотры и лайки работают через generic-модели core.View и core.Like.
Они привязаны к самой новости, а не к объекту, которому эта новость посвящена.
/feed/ читает News и возвращает элементы в формате, зависящем от типа
связанного объекта.
Для проектных записей важно различать:
text = ""- служебная запись ленты о проекте;- новость с текстом - полноценная новость проекта, которая в ленте возвращается
как
type_model = "news".
Лента исключает новости, связанные с непубличными или черновыми проектами.
- Новость проекта может создавать и изменять только лидер проекта.
- Новость пользователя может создавать и изменять только сам пользователь.
- Новость программы может создавать и изменять только менеджер программы.
- Вложения новости должны ссылаться только на
UserFileтекущего пользователя. - Несуществующий project/user/program context возвращает
404. - Проектные новости реализованы через
news.News.
Текущие regression-тесты проверяют:
- manager, service и query helpers;
- project/user/program API;
- права на создание и изменение новостей;
- лайки и просмотры;
- исключение служебных feed-записей из списка новостей проекта;
- сортировку закрепленных новостей программы.