@@ -12,7 +12,7 @@ generic relation:
1212- партнерскими программами;
1313- объектами ленты, например вакансиями.
1414
15- Одна и та же модель используется для двух близких, но разных сценариев:
15+ Одна и та же модель используется для двух сценариев:
1616
1717- обычная новость с текстом и файлами;
1818- служебная запись ленты для существующего объекта, где ` text = "" ` .
@@ -23,7 +23,7 @@ generic relation:
2323аккуратного рефакторинга. Сейчас он обслуживает проектные новости, новости
2424пользователей, новости программ и часть общей ленты.
2525
26- Первый слой regression-тестов добавлен для живых сценариев API и feed .
26+ Первый слой regression-тестов добавлен для живых сценариев API.
2727
2828## Основные возможности
2929
@@ -41,14 +41,16 @@ generic relation:
4141
4242- ` news/models.py ` - модель ` News ` с ` content_type/object_id ` , файлами, лайками,
4343 просмотрами и флагом ` pin ` .
44- - ` news/managers.py ` - ` get_news(obj) ` и ` add_news(obj, **kwargs) ` для работы с
45- generic relation.
46- - ` news/mixins.py ` - выбор queryset по контексту URL: project, user или partner
47- program.
44+ - ` news/managers.py ` - низкоуровневые ` get_news(obj) ` и `add_news(obj,
45+ ** kwargs)` для работы с generic relation.
46+ - ` news/services.py ` - явное создание project/user/program news и helpers для
47+ различения обычной новости и feed-записи.
48+ - ` news/querysets.py ` - явные queryset helpers по контексту URL: project, user
49+ или partner program.
4850- ` news/views.py ` - общий API для list/create/detail/update/delete, set_viewed и
4951 set_liked.
50- - ` news/serializers.py ` - request/response serializers для списка, detail и feed
51- представления .
52+ - ` news/serializers.py ` - request/response serializers для создания, списка и
53+ detail .
5254- ` news/permissions.py ` - права на создание и изменение новости в зависимости от
5355 связанного объекта.
5456- ` news/admin.py ` - админка ` News ` .
@@ -63,45 +65,29 @@ generic relation:
6365- ` views ` - generic views через ` core.View ` .
6466- ` pin ` - закрепление новости, сейчас используется для новостей программ.
6567
68+ Feed-запись определяется через helper ` is_feed_record(news) ` , а обычная новость
69+ через ` is_content_news(news) ` . Сейчас оба helper'а используют текущий признак
70+ ` text ` , но вызывающий код не должен напрямую проверять ` text == "" ` .
71+
6672## API
6773
68- Контекстные endpoints:
69-
70- - ` GET /projects/<project_id>/news/ ` - список новостей проекта.
71- - ` POST /projects/<project_id>/news/ ` - создание новости проекта.
72- - ` GET /projects/<project_id>/news/<news_id>/ ` - детальная новость проекта.
73- - ` PATCH /projects/<project_id>/news/<news_id>/ ` - редактирование новости
74- проекта.
75- - ` DELETE /projects/<project_id>/news/<news_id>/ ` - удаление новости проекта.
76- - ` POST /projects/<project_id>/news/<news_id>/set_viewed/ ` - просмотр новости
77- проекта.
78- - ` POST /projects/<project_id>/news/<news_id>/set_liked/ ` - лайк новости
79- проекта.
80-
81- - ` GET /auth/users/<user_id>/news/ ` - список новостей пользователя.
82- - ` POST /auth/users/<user_id>/news/ ` - создание новости пользователя.
83- - ` GET /auth/users/<user_id>/news/<news_id>/ ` - детальная новость пользователя.
84- - ` PATCH /auth/users/<user_id>/news/<news_id>/ ` - редактирование новости
85- пользователя.
86- - ` DELETE /auth/users/<user_id>/news/<news_id>/ ` - удаление новости
87- пользователя.
88- - ` POST /auth/users/<user_id>/news/<news_id>/set_viewed/ ` - просмотр новости
89- пользователя.
90- - ` POST /auth/users/<user_id>/news/<news_id>/set_liked/ ` - лайк новости
91- пользователя.
92-
93- - ` GET /programs/<program_id>/news/ ` - список новостей программы.
94- - ` POST /programs/<program_id>/news/ ` - создание новости программы.
95- - ` GET /programs/<program_id>/news/<news_id>/ ` - детальная новость программы.
96- - ` PATCH /programs/<program_id>/news/<news_id>/ ` - редактирование новости
97- программы.
98- - ` DELETE /programs/<program_id>/news/<news_id>/ ` - удаление новости программы.
99- - ` POST /programs/<program_id>/news/<news_id>/set_viewed/ ` - просмотр новости
100- программы.
101- - ` POST /programs/<program_id>/news/<news_id>/set_liked/ ` - лайк новости
102- программы.
103-
104- Общие endpoints:
74+ Контекстные endpoints работают для трех базовых URL:
75+
76+ - ` /projects/<project_id>/news/ ` - новости проекта;
77+ - ` /auth/users/<user_id>/news/ ` - новости пользователя;
78+ - ` /programs/<program_id>/news/ ` - новости партнерской программы.
79+
80+ Для каждого контекста доступны:
81+
82+ - ` GET <base> ` - список новостей;
83+ - ` POST <base> ` - создание новости;
84+ - ` GET <base><news_id>/ ` - детальная новость;
85+ - ` PATCH <base><news_id>/ ` - редактирование новости;
86+ - ` DELETE <base><news_id>/ ` - удаление новости;
87+ - ` POST <base><news_id>/set_viewed/ ` - просмотр новости;
88+ - ` POST <base><news_id>/set_liked/ ` - лайк новости.
89+
90+ Связанные endpoints:
10591
10692- ` GET /news/ ` - подключен напрямую, но без контекста возвращает пустой список.
10793- ` GET /news/<news_id>/ ` - подключен напрямую, но без контекста не является
@@ -117,9 +103,8 @@ generic relation:
117103Новость сохраняется в ` news.News ` , а связь с проектом задается через
118104` content_type = Project ` и ` object_id = project.id ` .
119105
120- Новости проекта с непустым ` text ` отображаются как новости внутри проекта.
121- Служебные feed-записи проекта с ` text = "" ` из списка проектных новостей
122- исключаются.
106+ Новости проекта с текстом отображаются внутри проекта. Служебные feed-записи
107+ из списка проектных новостей исключаются.
123108
124109### 2. Новость пользователя
125110
@@ -148,8 +133,8 @@ generic relation:
148133Для проектных записей важно различать:
149134
150135- ` text = "" ` - служебная запись ленты о проекте;
151- - ` text != "" ` - полноценная новость проекта, которая в ленте возвращается как
152- ` type_model = "news" ` .
136+ - новость с текстом - полноценная новость проекта, которая в ленте возвращается
137+ как ` type_model = "news" ` .
153138
154139Лента исключает новости, связанные с непубличными или черновыми проектами.
155140
@@ -160,23 +145,16 @@ generic relation:
160145- Новость программы может создавать и изменять только менеджер программы.
161146- Прямой ` /news/ ` без project/user/program context не является основным
162147 пользовательским API.
163- - Старые ` ProjectNews* ` в ` projects ` не являются текущей реализацией проектных
164- новостей; живые routes используют ` news.News ` .
148+ - Несуществующий project/user/program context возвращает ` 404 ` .
149+ - Проектные новости реализованы через ` news.News ` .
165150
166151## Тесты
167152
168153Текущие regression-тесты проверяют:
169154
170- - ` NewsManager.add_news() ` привязывает новость к content object и файлам;
171- - ` NewsManager.get_news() ` возвращает новости нужного объекта;
172- - лидер проекта может создавать, редактировать и удалять новости проекта;
173- - пользователь без роли лидера не может создавать новость проекта;
174- - список новостей проекта исключает служебные feed-записи с ` text = "" ` ;
175- - новости проекта можно отметить просмотренными и лайкнуть;
176- - пользователь может создавать новости только в своем профиле;
177- - менеджер программы может создавать новости программы;
178- - пользователь без роли менеджера не может создавать новости программы;
179- - закрепленные новости программы идут выше обычных;
180- - ` /feed/?type=news ` возвращает новости пользователя;
181- - ` /feed/?type=project ` возвращает проектные новости как ` type_model = "news" ` ;
182- - feed исключает новости непубличных проектов.
155+ - manager, service и query helpers;
156+ - project/user/program API;
157+ - права на создание и изменение новостей;
158+ - лайки и просмотры;
159+ - исключение служебных feed-записей из списка новостей проекта;
160+ - сортировку закрепленных новостей программы.
0 commit comments