diff --git a/apps/news/tasks.py b/apps/news/tasks.py index 4a980144..0267fcf4 100644 --- a/apps/news/tasks.py +++ b/apps/news/tasks.py @@ -9,12 +9,14 @@ from django.template.loader import get_template, render_to_string from main.models import SiteSettings from news import models -from notification.models import Subscriber +from notification.models import Subscribe @shared_task def send_email_with_news(news_ids): - subscribers = Subscriber.objects.all() + subscribes = Subscribe.objects.all() \ + .prefetch_related('subscriber') \ + .prefetch_related('subscription_type') sent_news = models.News.objects.filter(id__in=news_ids) htmly = get_template(settings.NEWS_EMAIL_TEMPLATE) @@ -23,11 +25,16 @@ def send_email_with_news(news_ids): socials = list(SiteSettings.objects.with_country().select_related('country')) socials = dict(zip(map(lambda social: social.country.code, socials), socials)) - for subscriber in subscribers: - socials_for_subscriber = socials.get(subscriber.country_code) + for subscribe in subscribes.filter(unsubscribe_date=None): + country = subscribe.subscription_type.country + + if country is None: + continue + + socials_for_subscriber = socials.get(country.code) + subscriber = subscribe.subscriber + try: - # TODO: вот тут надо учесть, подписки на какие страны есть у юзера активные (нулл время отписки) и не посылать лишнего - # TODO: обрати внимание на кол-во запросов в БД плс. они пишутся в консоль for new in sent_news: context = { "title": new.title.get(subscriber.locale), diff --git a/apps/notification/tests.py b/apps/notification/tests.py index 410365ff..cf380410 100644 --- a/apps/notification/tests.py +++ b/apps/notification/tests.py @@ -80,7 +80,7 @@ class NotificationSubscribeInfoTestCase(APITestCase): class NotificationUnsubscribeAuthUserTestCase(BaseTestCase): def test_unsubscribe_auth_user(self): - Subscriber.objects.create(user=self.user, email=self.email, state=1) + Subscriber.objects.create(user=self.user, email=self.email) self.test_data = { "email": self.email @@ -174,7 +174,7 @@ class NotificationManySubscribeTestCase(APITestCase): test_data = { 'email': self.email, 'subscription_types_pk': [ - self.test_subscribe_type + self.test_subscribe_type.id ] } @@ -183,6 +183,12 @@ class NotificationManySubscribeTestCase(APITestCase): self.assertEqual(response.json()["email"], test_data["email"]) def test_unsubscribe(self): + self.username = 'sedragurda' + self.password = 'sedragurdaredips19' + self.email = 'sedragurda@desoz.com' + self.user = User.objects.create_user( + username=self.username, email=self.email, password=self.password) + test_data = { "email": self.email } diff --git a/apps/notification/views/common.py b/apps/notification/views/common.py index 257c3286..f7fbf9fe 100644 --- a/apps/notification/views/common.py +++ b/apps/notification/views/common.py @@ -28,7 +28,6 @@ class SubscribeInfoView(generics.RetrieveAPIView): class SubscribeInfoAuthUserView(generics.ListAPIView): """Subscribe info auth user view.""" - # TODO: тут пользователь должен видеть свои подписки. проверь плс, что работает permission_classes = (permissions.IsAuthenticated,) serializer_class = serializers.SubscribeSerializer