From c30d39d6b2fc3106efdf764ac169e4453e9616f3 Mon Sep 17 00:00:00 2001 From: Mahdi Date: Sat, 3 Feb 2024 21:13:28 +0330 Subject: [PATCH] add agency news api --- news/api/urls.py | 1 + news/api/views.py | 13 +++++++++++++ news/services/news.py | 18 +++++++++++++++++- news/utils/news.py | 7 +++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/news/api/urls.py b/news/api/urls.py index 021f40a..d675b56 100644 --- a/news/api/urls.py +++ b/news/api/urls.py @@ -15,5 +15,6 @@ path('search/', views.NewsSearchView.as_view()), path('suggestion/', views.NewsSuggestionView.as_view()), path('subscription/', views.NewsSubscriptionView.as_view()), + path('agency/', views.AgencyDetailView.as_view()), path('/', views.NewsDetailView.as_view()), ] diff --git a/news/api/views.py b/news/api/views.py index 9cd83af..ee879a6 100644 --- a/news/api/views.py +++ b/news/api/views.py @@ -25,6 +25,8 @@ create_news_suggestion, get_user_subscriptions_service, subscribe_news_service, + get_agency_service, + get_agency_news_service, ) from response.rest import ( OkResponse, @@ -113,6 +115,17 @@ def post(self, request): return NotFoundResponse(message=message) +class AgencyDetailView(APIView): + + def get(self, request, agency_name): + is_successful, message = get_agency_service(agency_name) + if is_successful: + news = get_agency_news_service(agency_name) + return OkResponse(agency=message, news=news) + else: + return NotFoundResponse(message=message) + + # Get news by Category title class CategoryDetailView(APIView): def get(self, request, category_name): diff --git a/news/services/news.py b/news/services/news.py index d7b45dd..e1ed8d8 100644 --- a/news/services/news.py +++ b/news/services/news.py @@ -16,10 +16,11 @@ get_news_by_description_detail, get_random_news, get_subscriptions_by_subscriber, + get_agency_news, ) from news.utils.news_cache import NewsCache from news.models import News, Agency, Reporter, Subscription -from news.api.serializers import NewsSerializer +from news.api.serializers import NewsSerializer, AgencySerializer def login_by_username_password(username: str, password: str) -> Tuple[bool, str]: @@ -68,6 +69,21 @@ def get_detail_view_service(token: str): return True, resp +def get_agency_service(agency_name: str): + # todo add cache + try: + agency = get_agency_by_name(agency_name) + except Agency.DoesNotExist: + return False, 'there is no agency with this token' + resp = AgencySerializer(agency).data + return True, resp + + +def get_agency_news_service(agency_name: str): + news = get_agency_news(agency_name) + resp = NewsSerializer(news, many=True).data + return resp + def is_user_reporter(username): reporter = get_reporter_by_username(username) if reporter is None: diff --git a/news/utils/news.py b/news/utils/news.py index e226220..6408b03 100644 --- a/news/utils/news.py +++ b/news/utils/news.py @@ -48,6 +48,13 @@ def get_agency_by_name(name): return None +def get_agency_news(agency_name): + agency = Agency.objects.get(name=agency_name) + news = News.objects.filter(agency=agency) + return news + + + def get_category_id(category_name): category = Category.objects.get(title=category_name) return category.id