From ea1bd1392d59c4bb83fbe32ed3db317136be415b Mon Sep 17 00:00:00 2001 From: oki priyadi Date: Fri, 9 Oct 2020 20:33:26 +0700 Subject: [PATCH 1/2] add subscribe function --- app/migrations/0018_subscribemodel.py | 26 +++++ app/models.py | 16 +++- app/static/images/sub-btn.png | Bin 0 -> 102953 bytes app/templates/app/emails/subscription.html | 20 ++++ app/templates/app/katalog_materi.html | 1 + app/templates/subscribe.html | 12 +++ app/tests.py | 13 ++- app/urls.py | 3 + app/utils/email_utility.py | 90 +++++++++++++++++ app/utils/encryption_util.py | 37 +++++++ app/views.py | 106 ++++++++++++++++++++- digipus/settings.py | 2 + 12 files changed, 322 insertions(+), 4 deletions(-) create mode 100644 app/migrations/0018_subscribemodel.py create mode 100644 app/static/images/sub-btn.png create mode 100644 app/templates/app/emails/subscription.html create mode 100644 app/templates/subscribe.html create mode 100644 app/utils/email_utility.py create mode 100644 app/utils/encryption_util.py diff --git a/app/migrations/0018_subscribemodel.py b/app/migrations/0018_subscribemodel.py new file mode 100644 index 0000000..323ec96 --- /dev/null +++ b/app/migrations/0018_subscribemodel.py @@ -0,0 +1,26 @@ +# Generated by Django 3.1 on 2020-10-09 07:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0017_auto_20201005_2145'), + ] + + operations = [ + migrations.CreateModel( + name='SubscribeModel', + fields=[ + ('sys_id', models.AutoField(primary_key=True, serialize=False)), + ('email', models.EmailField(blank=True, max_length=200, unique=True)), + ('status', models.CharField(blank=True, max_length=64)), + ('created_date', models.DateTimeField(blank=True)), + ('updated_date', models.DateTimeField(blank=True)), + ], + options={ + 'db_table': 'app_subscribe', + }, + ), + ] diff --git a/app/models.py b/app/models.py index 54e05f4..d8b4941 100644 --- a/app/models.py +++ b/app/models.py @@ -145,4 +145,18 @@ class RatingContributor(models.Model): if 1 <= self.score <= 5: super().save(force_insert, force_update, using, update_fields) else: - raise ValidationError("Rating score must be integer between 1-5") \ No newline at end of file + raise ValidationError("Rating score must be integer between 1-5") + +class SubscribeModel(models.Model): + sys_id = models.AutoField(primary_key=True, null=False, blank=True) + email = models.EmailField(null=False, blank=True, max_length=200, unique=True) + status = models.CharField(max_length=64, null=False, blank=True) + created_date = models.DateTimeField(null=False, blank=True) + updated_date = models.DateTimeField(null=False, blank=True) + + class Meta: + app_label = "app" + db_table = "app_subscribe" + + def __str__(self): + return self.email \ No newline at end of file diff --git a/app/static/images/sub-btn.png b/app/static/images/sub-btn.png new file mode 100644 index 0000000000000000000000000000000000000000..81b0489c7c988c9769980e0bca8698a24cc3851d GIT binary patch literal 102953 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

^W}NC=rgMEe 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 z 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 literal 0 HcmV?d00001 diff --git a/app/templates/app/emails/subscription.html b/app/templates/app/emails/subscription.html new file mode 100644 index 0000000..6a83c2d --- /dev/null +++ b/app/templates/app/emails/subscription.html @@ -0,0 +1,20 @@ +

+ Hi
+ Thanks for subscribing to {{ project_name }} newsletter.
+ We will be sending you latest published articles on
{{ site_url }}. Mail frequency won't be more than twice a month.
+ We hate spamming as much as you do.
+
+ To confirm your subscription, please click on the link given below. If clicking doesn't work, copy paste the URL in browser.
+ If you think this is a mistake, just ignore this email and we won't bother you again. +
+
+ {{ confirmation_url }} + +
+
+

+ Note:
+ This is notification only email. Please do not reply on this email.
+ You can contact us here. +

+
\ No newline at end of file diff --git a/app/templates/app/katalog_materi.html b/app/templates/app/katalog_materi.html index c4013e2..f992f0a 100644 --- a/app/templates/app/katalog_materi.html +++ b/app/templates/app/katalog_materi.html @@ -54,6 +54,7 @@
+

Temukan Materi Yang Kamu Mau!

Cari dengan judul buku, penerbit, atau penulis

\ No newline at end of file diff --git a/app/tests.py b/app/tests.py index cff2740..19c6eec 100644 --- a/app/tests.py +++ b/app/tests.py @@ -25,7 +25,8 @@ from .views import (DaftarKatalog, DashboardKontributorView, DetailMateri, from app.forms import SuntingProfilForm from app.utils.fileManagementUtil import get_random_filename, remove_image_exifdata import pandas as pd - +from django.core import mail +from app.utils.email_utility import send_gmail class DaftarKatalogTest(TestCase): def test_daftar_katalog_url_exist(self): @@ -1658,3 +1659,13 @@ class RatingContributorTest(TransactionTestCase): self.assertEqual(0, RatingContributor.objects.filter(user=self.contributor.id).count()) self.client.post(url, data={"user": self.contributor.id, "score": 0}) self.assertEqual(0, RatingContributor.objects.filter(user=self.contributor.id).count()) + + class EmailTest(TestCase): + def test_send_email(self): + send_gmail('bass_of_ncreep@yahoo.com', 'Here is the message') + mail.send_mail('Subject here', 'Here is the message.', + 'pmplmailer@gmail.com', ['bass_of_ncreep@yahoo.com'], + fail_silently=False) + self.assertEqual(len(mail.outbox), 1) + self.assertEqual(mail.outbox[0].subject, 'Subject here') + \ No newline at end of file diff --git a/app/urls.py b/app/urls.py index e401f2e..557ca88 100644 --- a/app/urls.py +++ b/app/urls.py @@ -32,4 +32,7 @@ urlpatterns = [ path("profil//", KatalogPerKontributorView.as_view(), name="katalog-per-kontributor"), path("materi/rate/", views.add_rating_materi, name="rate-materi"), + path(r'subscribe/', views.subscribe, name='subscribe'), + path(r'subscribeform/', views.subscribeform, name='subscribeform'), + path(r'subscription_confirmation/', views.subscription_confirmation, name='subscription_confirmation'), ] diff --git a/app/utils/email_utility.py b/app/utils/email_utility.py new file mode 100644 index 0000000..bc72075 --- /dev/null +++ b/app/utils/email_utility.py @@ -0,0 +1,90 @@ +import logging, traceback +from django.urls import reverse +import requests +from django.template.loader import get_template +from django.utils.html import strip_tags +from django.conf import settings +import smtplib +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +import email +import email.mime.application +from django.utils.html import strip_tags + + +def send_email(data): + try: + url = "https://api.mailgun.net/v3//messages" + status = requests.post( + url, + auth=("api", settings.MAILGUN_API_KEY), + data={"from": "OKI ", + "to": [data["email"]], + "subject": data["subject"], + "text": data["plain_text"], + "html": data["html_text"]} + ) + logging.getLogger("info").info("Mail sent to " + data["email"] + ". status: " + str(status)) + return status + except Exception as e: + logging.getLogger("error").error(traceback.format_exc()) + return False + + +def send_subscription_email(email, subscription_confirmation_url): + data = dict() + data["confirmation_url"] = subscription_confirmation_url + data["subject"] = "Please Confirm The Subscription" + data["email"] = email + template = get_template("app/emails/subscription.html") + data["html_text"] = template.render(data) + data["plain_text"] = strip_tags(data["html_text"]) + return send_email(data) + + +def send_gmail(email, subscription_confirmation_url): + # create message + msg = MIMEMultipart('alternative') + msg['Subject'] = "Please verify your mail" + msg['From'] = "pmplmailer@gmail.com" + msg['To'] = email + + # create body + html_text = '
Thanks for subscribing to Us. Please click this link to activate your subscription : ' + subscription_confirmation_url + '
' + plain_text = strip_tags(html_text) + + # Create the body of the message (a plain-text and an HTML version). + # Record the MIME types of both parts - text/plain and text/html. + part1 = MIMEText(plain_text, 'plain') + part2 = MIMEText(html_text, 'html') + + # Attach image if any + + # Attach parts into message container. + # According to RFC 2046, the last part of a multipart message, in this case + # the HTML message, is best and preferred. + msg.attach(part1) + msg.attach(part2) + + # Send the message via local SMTP server. + host = "smtp.gmail.com" + port = 587 + mail = smtplib.SMTP(host, port, timeout=60) + mail.ehlo() + mail.starttls() + + # Add recepiens, cc or bcc if any + recepient = [msg["To"]] + + # username and password of gmail id which will be used to send email + username = "pmplmailer@gmail.com" + password = "asdf1234$" + + # login using credentials + mail.login(username, password) + + # send email + mail.sendmail(msg["From"], recepient, msg.as_string()) + mail.quit() + + return "\nSent\n" \ No newline at end of file diff --git a/app/utils/encryption_util.py b/app/utils/encryption_util.py new file mode 100644 index 0000000..a448767 --- /dev/null +++ b/app/utils/encryption_util.py @@ -0,0 +1,37 @@ +from cryptography.fernet import Fernet +import base64 +import logging +import traceback +from django.conf import settings + +#this is your "password/ENCRYPT_KEY". keep it in settings.py file +#key = Fernet.generate_key() + +def encrypt(txt): + try: + # convert integer etc to string first + txt = str(txt) + # get the key from settings + cipher_suite = Fernet(settings.ENCRYPT_KEY) # key should be byte + # #input should be byte, so convert the text to byte + encrypted_text = cipher_suite.encrypt(txt.encode('ascii')) + # encode to urlsafe base64 format + encrypted_text = base64.urlsafe_b64encode(encrypted_text).decode("ascii") + return encrypted_text + except Exception as e: + # log the error if any + logging.getLogger("error_logger").error(traceback.format_exc()) + return None + + +def decrypt(txt): + try: + # base64 decode + txt = base64.urlsafe_b64decode(txt) + cipher_suite = Fernet(settings.ENCRYPT_KEY) + decoded_text = cipher_suite.decrypt(txt).decode("ascii") + return decoded_text + except Exception as e: + # log the error + logging.getLogger("error_logger").error(traceback.format_exc()) + return None \ No newline at end of file diff --git a/app/views.py b/app/views.py index 8a68875..f793960 100644 --- a/app/views.py +++ b/app/views.py @@ -1,6 +1,9 @@ import mimetypes import os - +import re +import time +import logging +import traceback from django.conf import settings from django.contrib import messages from django.contrib.auth.models import AnonymousUser @@ -9,7 +12,7 @@ from django.core.paginator import Paginator from django.db.models import Q, Count from django.http import (Http404, HttpResponse, HttpResponseRedirect, JsonResponse) -from django.shortcuts import get_object_or_404, redirect +from django.shortcuts import get_object_or_404, redirect, render from django.template import loader from django.views.generic import TemplateView @@ -23,6 +26,11 @@ import django import pandas as pd from io import BytesIO from django.contrib import messages +from django.urls import reverse +from app.utils.encryption_util import encrypt, decrypt +from app.utils.email_utility import send_subscription_email, send_gmail +from app.models import SubscribeModel +from datetime import datetime class DaftarKatalog(TemplateView): @@ -235,7 +243,99 @@ def add_rating_materi(request): return JsonResponse({"success": True, "msg": "Rating successfully created", "rating_score": rating_score}, status=201) return JsonResponse({"success": False, "msg": "Forbidden"}, status=403) + +def subscribeform(request): + return render(request, 'subscribe.html', ) + +def subscribe(request): + post_data = request.POST.copy() + email = post_data.get("email", None) + error_msg = validate_email(email) + if error_msg: + messages.error(request, error_msg) + return HttpResponseRedirect(reverse('subscribe')) + + token = encrypt(email + "_" + str(time.time())) + subscription_confirmation_url = request.build_absolute_uri( reverse('subscription_confirmation')) + "?token=" + token + status = send_gmail(email, subscription_confirmation_url) + save_status = save_email(email) + + if save_status: + token = encrypt(email + "_" + str(time.time())) + subscription_confirmation_url = request.build_absolute_uri(reverse('subscription_confirmation')) + "?token=" + token + status = send_gmail(email, subscription_confirmation_url) + if not status: + SubscribeModel.objects.get(email=email).delete() + logging.getLogger("info").info( + "Deleted the record from Subscribe table for " + email + " as email sending failed. status: " + str( + status)) + else: + msg = "Mail sent to email Id '" + email + "'. Please confirm your subscription by clicking on " \ + "confirmation link provided in email. " \ + "Please check your spam folder as well." + messages.success(request, msg) + return HttpResponse(msg) + else: + msg = "Some error occurred. Please try in some time. Meanwhile we are looking into it." + messages.error(request, msg) + return HttpResponse(msg) + return HttpResponseRedirect(reverse('subscribeform')) + +def subscription_confirmation(request): + if "POST" == request.method: + raise Http404 + + token = request.GET.get("token", None) + + if not token: + logging.getLogger("warning").warning("Invalid Link ") + messages.error(request, "Invalid Link") + return HttpResponseRedirect(reverse('subscribeform')) + + token = decrypt(token) + if token: + token = token.split("_") + email = token[0] + print(email) + initiate_time = token[1] # time when email was sent , in epoch format. can be used for later calculations + try: + subscribe_model_instance = SubscribeModel.objects.get(email=email) + subscribe_model_instance.status = "CONFIRMED" + subscribe_model_instance.updated_date = datetime.today() + subscribe_model_instance.save() + messages.success(request, "Subscription Confirmed. Thank you.") + except Exception as e: + logging.getLogger("warning").warning(traceback.format_exc()) + messages.error(request, "Invalid Link") + else: + logging.getLogger("warning").warning("Invalid token ") + messages.error(request, "Invalid Link") + + return HttpResponse('

Thank you for subscribing us

') + +def validate_email(email): + if email is None: + return "Email is required." + elif not re.match(r"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$", email): + return "Invalid Email Address." + else: + return None + +def save_email(email): + try: + subscribe_model_instance = SubscribeModel.objects.get(email=email) + except Exception as e: + subscribe_model_instance = SubscribeModel() + + + # does not matter if already subscribed or not...resend the email + subscribe_model_instance.email = email + subscribe_model_instance.status = "SUBSCRIBED" + subscribe_model_instance.created_date = datetime.today() + subscribe_model_instance.updated_date = datetime.today() + subscribe_model_instance.save() + return True def download_materi(request, pk): materi = get_object_or_404(Materi, pk=pk) @@ -736,6 +836,8 @@ class RevisiMateriView(TemplateView): context["form_revisi"] = form return self.render_to_response(context) + + def pages(request): context = {} # All resource paths end in .html. diff --git a/digipus/settings.py b/digipus/settings.py index 4b4ac60..d06956c 100644 --- a/digipus/settings.py +++ b/digipus/settings.py @@ -163,3 +163,5 @@ MEDIA_URL = "/media/" LOGOUT_REDIRECT_URL = "/" CRISPY_TEMPLATE_PACK = 'bootstrap4' +ENCRYPT_KEY = b'YVLSFH4WgxkLgCOmCBchVmahU_VIF2xPFdD7GUTsvgY=' +MAILGUN_API_KEY = 'a93a52270d7871930c8813bf0b96f21b-0d2e38f7-bb01a5b0' -- GitLab From f8ea268b6c2cd583804d980a70f60ff69cf52b69 Mon Sep 17 00:00:00 2001 From: oki priyadi Date: Fri, 9 Oct 2020 21:58:13 +0700 Subject: [PATCH 2/2] fitur search order by like (favorite materi) --- app/migrations/0019_auto_20201009_2144.py | 18 +++++++++++++++++ app/migrations/0020_auto_20201009_2144.py | 18 +++++++++++++++++ app/migrations/0021_auto_20201009_2145.py | 23 ++++++++++++++++++++++ app/migrations/0022_auto_20201009_2149.py | 24 +++++++++++++++++++++++ app/templates/app/katalog_materi.html | 6 +++++- app/views.py | 2 ++ 6 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 app/migrations/0019_auto_20201009_2144.py create mode 100644 app/migrations/0020_auto_20201009_2144.py create mode 100644 app/migrations/0021_auto_20201009_2145.py create mode 100644 app/migrations/0022_auto_20201009_2149.py diff --git a/app/migrations/0019_auto_20201009_2144.py b/app/migrations/0019_auto_20201009_2144.py new file mode 100644 index 0000000..335ca13 --- /dev/null +++ b/app/migrations/0019_auto_20201009_2144.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-10-09 14:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0018_subscribemodel'), + ] + + operations = [ + migrations.AlterField( + model_name='materi', + name='cover', + field=models.ImageField(blank=True, upload_to=''), + ), + ] diff --git a/app/migrations/0020_auto_20201009_2144.py b/app/migrations/0020_auto_20201009_2144.py new file mode 100644 index 0000000..1a699aa --- /dev/null +++ b/app/migrations/0020_auto_20201009_2144.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1 on 2020-10-09 14:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0019_auto_20201009_2144'), + ] + + operations = [ + migrations.AlterField( + model_name='materi', + name='content', + field=models.FileField(blank=True, upload_to=''), + ), + ] diff --git a/app/migrations/0021_auto_20201009_2145.py b/app/migrations/0021_auto_20201009_2145.py new file mode 100644 index 0000000..bc7d785 --- /dev/null +++ b/app/migrations/0021_auto_20201009_2145.py @@ -0,0 +1,23 @@ +# Generated by Django 3.1 on 2020-10-09 14:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0020_auto_20201009_2144'), + ] + + operations = [ + migrations.AlterField( + model_name='materi', + name='content', + field=models.FileField(blank=True, null=True, upload_to=''), + ), + migrations.AlterField( + model_name='materi', + name='cover', + field=models.ImageField(blank=True, null=True, upload_to=''), + ), + ] diff --git a/app/migrations/0022_auto_20201009_2149.py b/app/migrations/0022_auto_20201009_2149.py new file mode 100644 index 0000000..3b306a4 --- /dev/null +++ b/app/migrations/0022_auto_20201009_2149.py @@ -0,0 +1,24 @@ +# Generated by Django 3.1 on 2020-10-09 14:49 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0021_auto_20201009_2145'), + ] + + operations = [ + migrations.AlterField( + model_name='materi', + name='date_created', + field=models.DateTimeField(default=django.utils.timezone.now, null=True), + ), + migrations.AlterField( + model_name='materi', + name='date_modified', + field=models.DateTimeField(auto_now=True, null=True), + ), + ] diff --git a/app/templates/app/katalog_materi.html b/app/templates/app/katalog_materi.html index f992f0a..78366ce 100644 --- a/app/templates/app/katalog_materi.html +++ b/app/templates/app/katalog_materi.html @@ -57,7 +57,7 @@

Temukan Materi Yang Kamu Mau!

Cari dengan judul buku, penerbit, atau penulis

-