From 4ee476e4ce5e70f38d938a4919f17e0b94c388a1 Mon Sep 17 00:00:00 2001 From: Shruti1229 Date: Mon, 20 Nov 2023 02:29:11 +0530 Subject: [PATCH 1/2] Preview in newslette --- backend/newsletter/serializers.py | 3 +- backend/newsletter/views.py | 105 ++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 1 deletion(-) diff --git a/backend/newsletter/serializers.py b/backend/newsletter/serializers.py index b3df1447..e0b603e8 100644 --- a/backend/newsletter/serializers.py +++ b/backend/newsletter/serializers.py @@ -1,9 +1,10 @@ from rest_framework import serializers from .models import Newsletter +from django.db import migrations, models class NewsletterSerializer(serializers.ModelSerializer): - category = serializers.ListField() + content = serializers.ListField(child=serializers.DictField()) class Meta: model = Newsletter fields = ("newsletter_uuid", "submitter_id", "content", "category") diff --git a/backend/newsletter/views.py b/backend/newsletter/views.py index 29f3ba1f..c43e4732 100644 --- a/backend/newsletter/views.py +++ b/backend/newsletter/views.py @@ -145,6 +145,111 @@ def create(self, request, pk=None, *args, **kwargs): status=status.HTTP_200_OK, ) + + @is_admin + @swagger_auto_schema(request_body=NewsletterSerializer) + @action(detail=False, methods=["post"], url_path="preview") + def preview(self, request, pk=None, *args, **kwargs): + category = request.data.get("category") + content = request.data.get("content") + submitter_id = request.data.get("submitter_id") + template_id = request.data.get("template_id") + BASE_DIR = Path(__file__).resolve().parent.parent + + if content is None or content == "": + return Response( + {"message": "missing param : content can't be empty"}, + status=status.HTTP_400_BAD_REQUEST, + ) + + if template_id == 1: + if len(content) != 0: + final_html_content = "" + for c in content: + header_variable = c["header"] + paragraph_variable = c["paragraph"] + html_content = """

{header}

{paragraph}

""".format( + header=header_variable, paragraph=paragraph_variable + ) + final_html_content = final_html_content + html_content + requested_html = os.path.join( + BASE_DIR, "newsletter", "templates", "cl_newsletter_1.html" + ) + file_html = open( + os.path.join(BASE_DIR, "newsletter", "templates", "variable.html"), + "w", + ) + soup = BeautifulSoup(final_html_content, "html.parser") + file_html.write(soup.prettify()) + context = {"variable": ""} + file_html.close() + html_file = loader.get_template(requested_html) + html_content = html_file.render(context, request) + elif template_id == 2: + if len(content) != 0: + final_html_content = "" + for c in content: + header_variable = c["header"] + paragraph_variable = c["paragraph"] + video_poster = c["image"] + youtube_url = c["youtube_url"] + html_content = """
image instead of video

{header}

{paragraph}

""".format( + header=header_variable, + video_poster=video_poster, + youtube_url=youtube_url, + paragraph=paragraph_variable, + ) + final_html_content = final_html_content + html_content + requested_html = os.path.join( + BASE_DIR, "newsletter", "templates", "cl_newsletter_1.html" + ) + file_html = open( + os.path.join(BASE_DIR, "newsletter", "templates", "variable.html"), + "w", + ) + soup = BeautifulSoup(final_html_content, "html.parser") + file_html.write(soup.prettify()) + context = {"variable": ""} + file_html.close() + html_file = loader.get_template(requested_html) + html_content = html_file.render(context, request) + elif template_id == 3: + if len(content) != 0: + message = base64.b64decode(content).decode("utf-8") + f = open('content.html','w') + f.write(message) + f.close() + + # Parse the file using an HTML parser. + parser = html.parser.HTMLParser() + with open('content.html', 'rb') as f: + parser.feed(f.read().decode('utf-8')) + + # Check for common HTML errors. + if parser.error_list: + return Response( + {"message": "Error in HTML."}, + status=status.HTTP_400_BAD_REQUEST, + ) + html_content = message + else: + return Response( + {"message": "Template not supported."}, + status=status.HTTP_400_BAD_REQUEST, + ) + + new_newsletter = Newsletter( + content=html_content, + submitter_id=User.objects.get(pk=submitter_id), + category="NEW_FEATURE", + ) + new_newsletter.save() + return Response( + {"html": html_content}, + status=status.HTTP_200_OK, + ) + + @swagger_auto_schema( method="post", request_body=openapi.Schema( From 5a76508cd189149a4efaf8a4b1db320c4794c62e Mon Sep 17 00:00:00 2001 From: Shruti1229 Date: Mon, 20 Nov 2023 05:30:54 +0530 Subject: [PATCH 2/2] Bug fix in subscribing --- backend/newsletter/tasks.py | 31 +++++++++++++++++++------------ backend/newsletter/views.py | 10 ++++++++-- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/backend/newsletter/tasks.py b/backend/newsletter/tasks.py index 72b73a40..dbbcc381 100644 --- a/backend/newsletter/tasks.py +++ b/backend/newsletter/tasks.py @@ -1,22 +1,29 @@ from celery import shared_task from backend.celery import celery_app from .models import SubscribedUsers, Newsletter +from django.utils import timezone @shared_task(name="send_newsletter") def send_newsletter(): logging.info("Sending Newsletter") - today = date.today() - newsletters = Newsletter.objects.filter(created_at__contains=today).all() - if newsletter is not None: - subscribed_users = SubscribedUsers.get.all() + now = timezone.now() + past_24_hours = now - timezone.timedelta(hours=24) + + # Get all objects created in the past 24 hours + newsletters = Newsletter.objects.filter(created_at__gte=past_24_hours).all() + if newsletters is not None: + subscribed_users = SubscribedUsers.objects.all() for newsletter in newsletters: for subscribed_user in subscribed_users: - logging.info("Sending Mail to %s", suscribed_user.user.email) - send_mail( - "Chitralekha - Newsletter", - message, - settings.DEFAULT_FROM_EMAIL, - [manager.email], - html_message=newsletter.content, - ) + logging.info("Sending Mail to %s", subscribed_user.user.email) + try: + send_mail( + "Chitralekha - Newsletter", + "", + settings.DEFAULT_FROM_EMAIL, + [subscribed_user.user.email], + html_message=newsletter.content, + ) + except: + logging.info("Mail can't be sent.") diff --git a/backend/newsletter/views.py b/backend/newsletter/views.py index c43e4732..25ddf3f9 100644 --- a/backend/newsletter/views.py +++ b/backend/newsletter/views.py @@ -325,8 +325,14 @@ def subscribe(self, request): {"message": "User with this Email Id doesn't exist."}, status=status.HTTP_400_BAD_REQUEST, ) - sub_user = SubscribedUsers(user=user) - sub_user.save() + + sub_user, created = SubscribedUsers.objects.get_or_create(user=user) + if not created: + return Response( + {"message": "User is already subscribed."}, + status=status.HTTP_400_BAD_REQUEST, + ) + return Response( {"message": "Newsletter is successfully subscribed."}, status=status.HTTP_200_OK,