File: //home/arjun/projects/aigenerator/AI-LG-backend/Ai_logo_generation/utils/email/email_service.py
import logging
from datetime import timedelta
from django.core.mail import EmailMultiAlternatives
from django.conf import settings
from django.template.loader import get_template
from rest_framework_simplejwt.tokens import RefreshToken
from authorization.models import CustomUser
from image_generation.models import ThirdPartyAPIStatus
class EmailService:
def __init__(self, user_id) -> None:
self.user_id = user_id
self.from_email = settings.DEFAULT_FROM_EMAIL
self.base_url = settings.AI_LOGO_GENERATION_BE
self.log = logging.getLogger("email_service")
def get_user(self):
return CustomUser.objects.get(id=self.user_id)
def create_email(self, subject, content, to_email, attachments=[]):
email = EmailMultiAlternatives(
subject, content, from_email=self.from_email, to=[to_email]
)
for attachment in attachments:
email.attach(attachment["filename"], attachment["content"])
return email
def create_email_html(self, subject, content, to_email, attachments=[]):
email = EmailMultiAlternatives(
subject, from_email=self.from_email, to=[to_email]
)
email.attach_alternative(content, "text/html")
for attachment in attachments:
email.attach(attachment["filename"], attachment["content"])
return email
def send_forget_password(self, redirect_link):
user = self.get_user()
subject = "Your Password Reset Link Inside"
context = {
"base_url": self.base_url,
"name": f"{user.first_name} {user.last_name}",
"redirect_link": redirect_link,
}
template = get_template("forgot_password_email_template.html")
content = template.render(context)
email = self.create_email_html(subject, content, user.email)
try:
email.send()
except Exception as exp:
self.log.debug("sending email for forget password failed")
raise exp
def send_signup_confirmation(self):
user = self.get_user()
subject = "Welcome to LogosGPT - Let's Create Your Perfect Logo!"
context = {
"base_url": self.base_url,
"name": f"{user.first_name} {user.last_name}",
}
template = get_template("welcome_email_template.html")
content = template.render(context)
email = self.create_email_html(subject, content, user.email)
try:
email.send()
except Exception as exp:
self.log.debug("sending email for signup confirmation failed")
raise exp
def send_login_confirmation(self, otp):
user = self.get_user()
subject = "Your OTP Code for Verification"
context = {"base_url": self.base_url, "otp": otp}
template = get_template("login_verify_email_template.html")
content = template.render(context)
email = self.create_email_html(subject, content, user.email)
try:
email.send()
except Exception as exp:
self.log.debug("sending email for signup confirmation failed")
raise exp
def payment_successfull(self, amount, plan, receipt_url, transaction_id, is_subscription):
user = self.get_user()
subject = "Payment Successful – Thank You!"
context = {"base_url": self.base_url, "amount" :amount, "plan" : plan,
"name": f"{user.first_name} {user.last_name}",
"receipt_url": receipt_url ,
"transaction_id" :transaction_id,
"is_subscription" : is_subscription
}
template = get_template("payment-sucessfull-template.html")
content = template.render(context)
email = self.create_email_html(subject, content, user.email)
try:
email.send()
except Exception as exp:
self.log.debug("sending email for successfull payment failure")
raise exp
def send_cancel_subscription_mail(self):
user = self.get_user()
subject = "Subscription Cancelled - We're Sorry to See You Go"
context = {
"base_url": self.base_url,
"name": f"{user.first_name} {user.last_name}",
}
template = get_template("cancel_subscription_email_template.html")
content = template.render(context)
email = self.create_email_html(subject, content, user.email)
try:
email.send()
except Exception as exp:
self.log.debug("sending email for cancelled subscription failure")
raise exp
def send_3D_secure_card_confirmation_mail(self, payment_link):
user = self.get_user()
subject = "Your Subscription Has Expired - Renew to Continue!"
context = {
"base_url": self.base_url,
"name": f"{user.first_name} {user.last_name}",
"payment_link": payment_link,
}
template = get_template("payment-confirmation-template.html")
content = template.render(context)
email = self.create_email_html(subject, content, user.email)
try:
email.send()
except Exception as exp:
self.log.debug("sending email for payment conformation failed")
raise exp
class ThirdPartyAPIStatusEmailService:
def __init__(self, user_id, service_id) -> None:
self.user_id = user_id
self.service_id = service_id
self.from_email = settings.DEFAULT_FROM_EMAIL
self.base_url = settings.AI_LOGO_GENERATION_BE
self.log = logging.getLogger("email_service")
def get_user(self):
return CustomUser.objects.get(id=self.user_id)
def get_thirdpary_service(self):
return ThirdPartyAPIStatus.objects.get(id=self.service_id)
def create_email(self, subject, content, to_email, attachments=[]):
email = EmailMultiAlternatives(
subject, content, from_email=self.from_email, to=[to_email]
)
for attachment in attachments:
email.attach(attachment["filename"], attachment["content"])
return email
def create_email_html(self, subject, content, to_email, attachments=[]):
email = EmailMultiAlternatives(
subject, from_email=self.from_email, to=[to_email]
)
email.attach_alternative(content, "text/html")
for attachment in attachments:
email.attach(attachment["filename"], attachment["content"])
return email
def send_warning(self, percentage):
user = self.get_user()
service = self.get_thirdpary_service()
subject = f"{service.name} Status Limit Warning - {percentage}%"
context = {
"base_url": self.base_url,
"service_name": service.name,
"percentage": percentage,
"name": f"{user.first_name} {user.last_name}",
}
template = get_template("thirdparty_api_status_warning_template.html")
content = template.render(context)
email = self.create_email_html(subject, content, user.email)
try:
email.send()
except Exception as exp:
self.log.debug("sending email for thirdparty service api warning failed")
raise exp
def send_error(self):
user = self.get_user()
service = self.get_thirdpary_service()
subject = f"{service.name} Status Error Notification"
context = {"base_url": self.base_url, "service_name": service.name}
template = get_template("thirdparty_api_status_error_template.html")
content = template.render(context)
email = self.create_email_html(subject, content, user.email)
try:
email.send()
except Exception as exp:
self.log.debug("sending email for thirdparty service api error failed")
raise exp
class MobilePaymentEmailService:
def __init__(self, user_id) -> None:
self.user_id = user_id
self.from_email = settings.DEFAULT_FROM_EMAIL
self.base_url = settings.AI_LOGO_GENERATION_BE
self.base_fe_url = settings.AI_LOGO_GENERATION_FE
self.log = logging.getLogger("email_service")
def get_user(self):
return CustomUser.objects.get(id=self.user_id)
def create_email(self, subject, content, to_email, attachments=[]):
email = EmailMultiAlternatives(
subject, content, from_email=self.from_email, to=[to_email]
)
for attachment in attachments:
email.attach(attachment["filename"], attachment["content"])
return email
def create_email_html(self, subject, content, to_email, attachments=[]):
email = EmailMultiAlternatives(
subject, from_email=self.from_email, to=[to_email]
)
email.attach_alternative(content, "text/html")
for attachment in attachments:
email.attach(attachment["filename"], attachment["content"])
return email
def send_mobile_subscription(self):
user = self.get_user()
refresh = RefreshToken.for_user(user)
refresh.set_exp(lifetime=timedelta(days=1))
subject = "Complete Your Subscription - Click the Link to Proceed"
context = {
"base_url": self.base_url,
"name": f"{user.first_name} {user.last_name}",
"redirect_link": f"{self.base_fe_url}/ios-check-out?token={refresh.access_token}"
}
template = get_template("mobile_subscription_email.html")
content = template.render(context)
email = self.create_email_html(subject, content, user.email)
try:
email.send()
except Exception as exp:
self.log.debug("sending email for thirdparty service api warning failed")
raise exp
def send_mobile_payment(self, logo_id, prev_link):
user = self.get_user()
refresh = RefreshToken.for_user(user)
refresh.set_exp(lifetime=timedelta(days=1))
subject = "Complete Your Logo Purchase - Click the Link to Proceed"
context = {
"base_url": self.base_url,
"name": f"{user.first_name} {user.last_name}",
"prev_link": prev_link,
"redirect_link": f"{self.base_fe_url}/ios-check-out?token={refresh.access_token}&logoId={logo_id}"
}
template = get_template("mobile_payment_email.html")
content = template.render(context)
email = self.create_email_html(subject, content, user.email)
try:
email.send()
except Exception as exp:
self.log.debug("sending email for thirdparty service api warning failed")
raise exp