HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
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