85 lines
2.3 KiB
Python
85 lines
2.3 KiB
Python
from django.db import models
|
|
import json
|
|
|
|
# Create your models here.
|
|
|
|
TYPES = [('<=', 'Arrival'),
|
|
('=>', 'Delivery'),
|
|
('==', 'Defered'),
|
|
('**', 'Failed'),
|
|
('->', 'Additional'),
|
|
('*>', 'Suppressed'),
|
|
('Completed', 'Completed'),
|
|
('Frozen', 'Frozen'),
|
|
('SMTP error', 'SMTP error'),
|
|
]
|
|
|
|
|
|
class Address(models.Model):
|
|
email = models.EmailField(blank=True, null=True)
|
|
|
|
class Meta:
|
|
abstract = True
|
|
ordering = ['email']
|
|
|
|
def email_count(self):
|
|
return self.mail_set.all().count()
|
|
|
|
def pending_count(self):
|
|
return self.mail_set.filter(has_completed=False).count()
|
|
|
|
def error_count(self):
|
|
return self.mail_set.filter(has_error=True).count()
|
|
|
|
def __str__(self):
|
|
return self.email
|
|
|
|
|
|
class Sender(Address):
|
|
pass
|
|
|
|
|
|
class Recipient(Address):
|
|
pass
|
|
|
|
|
|
class Mail(models.Model):
|
|
identifier = models.CharField(max_length=30)
|
|
sender = models.ForeignKey(Sender, null=True)
|
|
recipients = models.ManyToManyField(Recipient)
|
|
has_error = models.BooleanField(default=False)
|
|
has_completed = models.BooleanField(default=False)
|
|
stamp = models.DateTimeField(null=True)
|
|
|
|
def __str__(self):
|
|
return '%s %s' % (self.identifier, self.sender)
|
|
|
|
def handle_exim_data(self):
|
|
for entry in self.entry_set.all():
|
|
if entry.action == '<=':
|
|
address = entry.data.split(' ')[0]
|
|
sender, _ = Sender.objects.get_or_create(email=address)
|
|
self.sender = sender
|
|
self.stamp = entry.stamp
|
|
elif entry.action in ('=>', '->'):
|
|
address, _ = Recipient.objects.get_or_create(email=entry.data.split(' ')[0])
|
|
self.recipients.add(address)
|
|
elif entry.action == 'Completed':
|
|
self.has_completed = True
|
|
elif entry.action == '==' or entry.action == '**':
|
|
self.has_error = True
|
|
self.save()
|
|
|
|
|
|
class Entry(models.Model):
|
|
mail = models.ForeignKey(Mail)
|
|
data = models.CharField(max_length=512)
|
|
action = models.CharField(max_length=30, choices=TYPES)
|
|
stamp = models.DateTimeField()
|
|
|
|
class Meta:
|
|
ordering = ['stamp', 'id']
|
|
|
|
def __str__(self):
|
|
return '%s %s %s' % (self.stamp, self.action, self.data)
|