141 lines
4.5 KiB
Python
141 lines
4.5 KiB
Python
from django.contrib.auth import get_user_model
|
|
from django.core.mail import send_mail
|
|
from django.template.loader import render_to_string
|
|
from django.utils.html import strip_tags
|
|
from django.conf import settings
|
|
|
|
import logging
|
|
|
|
from apps.communications.models import NewsletterSubscription
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def send_announcement_email(announcement, recipients):
|
|
"""Send announcement email to recipients"""
|
|
try:
|
|
template_name = f'emails/announcement_email.html'
|
|
|
|
context = {
|
|
'announcement': announcement,
|
|
'unsubscribe_url': f"{settings.FRONTEND_ROOT}newsletter/unsubscribe/",
|
|
'manage_subscription_url': f"{settings.FRONTEND_ROOT}newsletter/manage-subscription",
|
|
}
|
|
|
|
html_message = render_to_string(template_name, context)
|
|
plain_message = strip_tags(html_message)
|
|
|
|
subject = f"انجمن علمی کامپیوتر گیلان | {announcement.title}"
|
|
|
|
send_mail(
|
|
subject=subject,
|
|
message=plain_message,
|
|
from_email=settings.DEFAULT_FROM_EMAIL,
|
|
recipient_list=recipients,
|
|
html_message=html_message,
|
|
fail_silently=False,
|
|
)
|
|
|
|
logger.info(f"Announcement email sent to {len(recipients)} recipients")
|
|
return True
|
|
|
|
except Exception as e:
|
|
logger.error(f"Failed to send announcement email: {str(e)}")
|
|
return False
|
|
|
|
|
|
def send_newsletter_confirmation(subscription):
|
|
"""Send newsletter confirmation email"""
|
|
try:
|
|
template_name = f'emails/newsletter_confirmation.html'
|
|
|
|
confirmation_url = f"{settings.FRONTEND_ROOT}confirm-subscription/{subscription.confirmation_token}"
|
|
|
|
context = {
|
|
'subscription': subscription,
|
|
'confirmation_url': confirmation_url,
|
|
}
|
|
|
|
html_message = render_to_string(template_name, context)
|
|
plain_message = strip_tags(html_message)
|
|
|
|
subject = "تأیید اشتراک خبرنامه"
|
|
send_mail(
|
|
subject=subject,
|
|
message=plain_message,
|
|
from_email=settings.DEFAULT_FROM_EMAIL,
|
|
recipient_list=[subscription.email],
|
|
html_message=html_message,
|
|
fail_silently=False,
|
|
)
|
|
|
|
logger.info(f"Newsletter confirmation sent to {subscription.email}")
|
|
return True
|
|
|
|
except Exception as e:
|
|
logger.error(f"Failed to send newsletter confirmation: {str(e)}")
|
|
return False
|
|
|
|
|
|
def send_event_reminder(event, user):
|
|
"""Send event reminder email"""
|
|
try:
|
|
template_name = f'emails/event_reminder.html'
|
|
|
|
event_url = f"{settings.FRONTEND_ROOT}events/{event.slug}"
|
|
|
|
context = {
|
|
'event': event,
|
|
'user': user,
|
|
'event_url': event_url,
|
|
}
|
|
|
|
html_message = render_to_string(template_name, context)
|
|
plain_message = strip_tags(html_message)
|
|
|
|
subject = f"یادآوری رویداد: {event.title}"
|
|
|
|
send_mail(
|
|
subject=subject,
|
|
message=plain_message,
|
|
from_email=settings.DEFAULT_FROM_EMAIL,
|
|
recipient_list=[user.email],
|
|
html_message=html_message,
|
|
fail_silently=False,
|
|
)
|
|
|
|
logger.info(f"Event reminder sent to {user.email} for event {event.title}")
|
|
return True
|
|
|
|
except Exception as e:
|
|
logger.error(f"Failed to send event reminder: {str(e)}")
|
|
return False
|
|
|
|
|
|
def get_announcement_recipients(announcement):
|
|
"""Get list of email addresses based on announcement target audience"""
|
|
|
|
User = get_user_model()
|
|
recipients = []
|
|
|
|
if announcement.target_audience == 'all':
|
|
# All users with email
|
|
recipients = list(User.objects.filter(email__isnull=False).values_list('email', flat=True))
|
|
|
|
elif announcement.target_audience == 'members':
|
|
# Only members (users with is_member=True)
|
|
recipients = list(User.objects.filter(is_member=True, email__isnull=False).values_list('email', flat=True))
|
|
|
|
elif announcement.target_audience == 'committee':
|
|
# Only committee members
|
|
recipients = list(User.objects.filter(is_committee=True, email__isnull=False).values_list('email', flat=True))
|
|
|
|
elif announcement.target_audience == 'subscribers':
|
|
# Only newsletter subscribers
|
|
recipients = list(NewsletterSubscription.objects.filter(
|
|
is_active=True,
|
|
confirmed_at__isnull=False
|
|
).values_list('email', flat=True))
|
|
|
|
return recipients
|