2017-08-01 23:45:38 +00:00
|
|
|
from django.db import models
|
|
|
|
from django.utils.crypto import get_random_string
|
|
|
|
from django.core.mail import EmailMessage, get_connection
|
|
|
|
from django.conf import settings
|
2017-08-02 10:02:57 +00:00
|
|
|
from django.contrib.contenttypes.fields import GenericForeignKey
|
|
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
2017-08-11 20:25:16 +00:00
|
|
|
from django.contrib.auth import get_user_model
|
2017-08-01 23:45:38 +00:00
|
|
|
|
|
|
|
import hashlib
|
|
|
|
|
|
|
|
|
|
|
|
def generate_message_token():
|
|
|
|
# /!\ birthday problem
|
|
|
|
return get_random_string(length=32)
|
|
|
|
|
|
|
|
|
|
|
|
def hexdigest_sha256(*args):
|
|
|
|
r = hashlib.sha256()
|
|
|
|
for arg in args:
|
|
|
|
r.update(str(arg).encode('utf-8'))
|
|
|
|
return r.hexdigest()
|
|
|
|
|
|
|
|
|
|
|
|
class MessageCorrespondent(models.Model):
|
|
|
|
email = models.EmailField()
|
|
|
|
token = models.CharField(max_length=64, default=generate_message_token, unique=True)
|
|
|
|
|
|
|
|
|
|
|
|
class MessageThread(models.Model):
|
|
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
|
|
token = models.CharField(max_length=64, default=generate_message_token, unique=True)
|
|
|
|
|
|
|
|
|
|
|
|
class Message(models.Model):
|
|
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
|
|
thread = models.ForeignKey(MessageThread)
|
2017-08-02 10:02:57 +00:00
|
|
|
author_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True, blank=True)
|
|
|
|
author_id = models.PositiveIntegerField(null=True, blank=True)
|
|
|
|
author = GenericForeignKey('author_type', 'author_id')
|
|
|
|
from_email = models.EmailField()
|
2017-08-01 23:45:38 +00:00
|
|
|
content = models.TextField(blank=True)
|
|
|
|
token = models.CharField(max_length=64, default=generate_message_token, unique=True)
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
ordering = ['created']
|
|
|
|
|
2017-08-11 21:25:42 +00:00
|
|
|
def send_notification(self, subject, sender, dests, reply_to=None, message_id=None, reference=None, footer=None):
|
2017-08-01 23:45:38 +00:00
|
|
|
messages = []
|
|
|
|
for dest_name, dest_email in dests:
|
|
|
|
correspondent, created = MessageCorrespondent.objects.get_or_create(email=dest_email)
|
|
|
|
token = self.thread.token + correspondent.token + hexdigest_sha256(settings.SECRET_KEY, self.thread.token, correspondent.token)[:16]
|
|
|
|
if reply_to:
|
|
|
|
reply_to_name, reply_to_email = reply_to
|
|
|
|
reply_to_list = ['%s <%s>' % (reply_to_name, reply_to_email.format(token=token))]
|
|
|
|
else:
|
|
|
|
reply_to_list = []
|
|
|
|
headers = dict()
|
|
|
|
if message_id:
|
|
|
|
headers.update({
|
|
|
|
'Message-ID': message_id.format(id=self.token),
|
|
|
|
})
|
|
|
|
if message_id and reference:
|
|
|
|
headers.update({
|
|
|
|
'References': message_id.format(id=reference),
|
|
|
|
})
|
2017-08-11 21:25:42 +00:00
|
|
|
body = self.content
|
|
|
|
if footer is not None:
|
|
|
|
body += footer
|
2017-08-01 23:45:38 +00:00
|
|
|
messages.append(EmailMessage(
|
|
|
|
subject=subject,
|
2017-08-11 21:25:42 +00:00
|
|
|
body=body,
|
2017-08-11 20:25:16 +00:00
|
|
|
from_email='%s <%s>' % sender,
|
2017-08-01 23:45:38 +00:00
|
|
|
to=['%s <%s>' % (dest_name, dest_email)],
|
|
|
|
reply_to=reply_to_list,
|
|
|
|
headers=headers,
|
|
|
|
))
|
|
|
|
connection = get_connection()
|
|
|
|
connection.send_messages(messages)
|
|
|
|
|
2017-08-02 10:02:57 +00:00
|
|
|
@property
|
|
|
|
def author_display(self):
|
|
|
|
if self.author:
|
2017-08-11 20:25:16 +00:00
|
|
|
author_class = ContentType.objects.get_for_model(self.author).model_class()
|
|
|
|
if author_class == get_user_model():
|
2017-08-02 10:02:57 +00:00
|
|
|
return self.author.get_full_name()
|
|
|
|
else:
|
|
|
|
return str(self.author)
|
|
|
|
else:
|
|
|
|
return self.from_email
|
|
|
|
|
2017-08-01 23:45:38 +00:00
|
|
|
def __str__(self):
|
2017-08-02 10:02:57 +00:00
|
|
|
return _("Message from %(author)s") % {'author': self.author_display}
|