import re
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.utils.timezone import datetime
from django.utils.translation import gettext as _
[docs]class MailLogSession(models.Model):
"""
Log the E-Mail transmission
"""
uuid = models.UUIDField(editable=False, help_text=_("E-Mail header Identificator"))
content_type = models.ForeignKey(ContentType, on_delete=models.SET_NULL, blank=True, null=True)
reference = models.CharField(max_length=255, null=True, blank=True)
recipient_email = models.EmailField(max_length=255, help_text=_("E-Mail Empfänger"))
sender_email = models.EmailField(max_length=255, help_text=_("E-Mail Sender"))
context = models.TextField(help_text=_("Context, used for E-Mail rendering"))
email = models.TextField(help_text=_("Full E-Mail"))
send_at = models.DateTimeField(auto_now=True, help_text=_("Send Timestamp"))
[docs] def logparse(self, log):
"""
Parse a E-Mail sendlog
:param log: Log string
:return:
"""
line_regex = re.compile(r'(?P<timestamp>[\d+\:]{5,10}\.\d+)\s(?P<linetype>\w+)\:\s(?P<payload>.*)', re.MULTILINE)
entry_list = []
for match in line_regex.finditer(log):
timestamp, linetype, payload= match.groups()
time = datetime.strptime(timestamp, "%H:%M:%S.%f")
if not (payload == "" and linetype == ""):
if type(linetype) is bytes:
linetype = linetype.decode("ascii")
if type(payload) is bytes:
payload = payload.decode("ascii")
entry = MailLogLine(protocol=self, type=linetype, payload=payload, timestamp=time)
entry_list.append(entry)
MailLogLine.objects.bulk_create(entry_list)
[docs] def get_reference(self):
"""
Resolve saved Reference
:return Model: Any previously saved Database Object
"""
model = self.content_type.model_class()
return model.objects.get(pk=self.reference)
[docs]class MailLogLine(models.Model):
"""
Single line of transmission log. Linked with MailLogSession.
"""
protocol = models.ForeignKey(MailLogSession, on_delete=models.CASCADE)
timestamp = models.TimeField()
type = models.CharField(max_length=255)
payload = models.TextField()
insert = models.DateTimeField(auto_now_add=True)
TEMPLATE_PATH = getattr(settings, "MAILSYSTEM_MAIL_TEMPLATE_PATH", "mailsystem/templates/mailsystem/")
[docs]class MailTemplate(models.Model):
name = models.CharField(max_length=255)
html_file = models.FilePathField(path=TEMPLATE_PATH, recursive=True, max_length=500)
alternative_file = models.FilePathField(path=TEMPLATE_PATH, recursive=True, max_length=500)
def __str__(self):
return self.name
[docs]class MailTemplateVariable(models.Model):
template = models.ForeignKey(MailTemplate, on_delete=models.CASCADE)
name = models.CharField(max_length=255, help_text="Variablen Name")
default = models.TextField(default="Undefined Value")
def __str__(self):
return self.name
[docs]class Mail(models.Model):
subject = models.CharField(max_length=255, help_text=_("E-Mail Betreff"))
template = models.ForeignKey(MailTemplate, on_delete=models.DO_NOTHING)
generator = models.CharField(max_length=255, default="notification.generator.generic.BasicGenerator")
reason = models.SlugField(max_length=100, unique=True)
def __str__(self):
return self.subject
[docs]class MailVariable(models.Model):
mail = models.ForeignKey(Mail, on_delete=models.DO_NOTHING)
mail_template_variable = models.ForeignKey(MailTemplateVariable, on_delete=models.DO_NOTHING)
content = models.TextField()
def __str__(self):
return "{} - {}".format(self.mail_template_variable.name, self.mail)