email.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from django.db.models import Q
  2. from django.conf import settings
  3. from django.contrib.auth import get_user_model
  4. from django.core.mail import EmailMultiAlternatives
  5. from django.template.loader import render_to_string
  6. from users.models import ProjectAlertStatus
  7. User = get_user_model()
  8. def send_email_notification(notification):
  9. single_template_html = "issue-drip.html"
  10. multiple_template_html = "multiple-issues-drip.html"
  11. subject = "GlitchTip"
  12. issue_count = notification.issues.count()
  13. first_issue = notification.issues.all().first()
  14. if issue_count == 1:
  15. subject = f"Error in {first_issue.project}: {first_issue.title}"
  16. elif issue_count > 1:
  17. subject = f"{issue_count} errors reported in {first_issue.project}"
  18. base_url = settings.GLITCHTIP_DOMAIN.geturl()
  19. org_slug = first_issue.project.organization.slug
  20. text_content = f"Errors reported in {first_issue.project}:\n\n"
  21. for issue in notification.issues.all():
  22. text_content += f"{issue.title}\n"
  23. text_content += f"{base_url}/{org_slug}/issues/{issue.id}\n\n"
  24. settings_link = (
  25. f"{base_url}/{org_slug}/settings/projects/{first_issue.project.slug}"
  26. )
  27. if issue_count == 1:
  28. issue_link = f"{base_url}/{org_slug}/issues/{first_issue.id}"
  29. html_content = render_to_string(
  30. single_template_html,
  31. {
  32. "issue_title": first_issue.title,
  33. "project_name": first_issue.project,
  34. "base_url": base_url,
  35. "issue_link": issue_link,
  36. "project_notification_settings_link": settings_link,
  37. },
  38. )
  39. elif issue_count > 1:
  40. project_link = f"{base_url}/{org_slug}/issues?project={first_issue.project.id}"
  41. html_content = render_to_string(
  42. multiple_template_html,
  43. {
  44. "org_slug": org_slug,
  45. "project_notification_settings_link": settings_link,
  46. "issues": notification.issues.all(),
  47. "project_name": first_issue.project,
  48. "project_link": project_link,
  49. },
  50. )
  51. users = User.objects.filter(
  52. organizations_ext_organization__projects__notification=notification
  53. ).exclude(
  54. Q(
  55. userprojectalert__project=notification.project,
  56. userprojectalert__status=ProjectAlertStatus.OFF,
  57. )
  58. | Q(subscribe_by_default=False, userprojectalert=None),
  59. )
  60. if not users.exists():
  61. return
  62. to = users.values_list("email", flat=True)
  63. msg = EmailMultiAlternatives(subject, text_content, to=to)
  64. msg.merge_data = {user.email: {"unique_id": user.id} for user in users}
  65. msg.attach_alternative(html_content, "text/html")
  66. msg.send()