-
Jean-Sébastien Caux authored884f39ce
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
composed_message.py 2.48 KiB
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"
import uuid as uuid_lib
from django.conf import settings
from django.contrib.postgres.fields import ArrayField, JSONField
from django.db import models
from django.urls import reverse
from django.utils import timezone
from ..managers import ComposedMessageQuerySet
class ComposedMessage(models.Model):
"""
An outgoing email message.
"""
STATUS_DRAFT = 'draft'
STATUS_READY = 'ready'
STATUS_RENDERED = 'rendered'
STATUS_SENT = 'sent'
STATUS_CHOICES = (
(STATUS_DRAFT, 'Draft'),
(STATUS_READY, 'Ready for sending'),
(STATUS_RENDERED, 'Rendered'),
(STATUS_SENT, 'Sent'),
)
uuid = models.UUIDField( # Used by the API to look up the record
db_index=True,
default=uuid_lib.uuid4,
editable=False)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.PROTECT)
created_on = models.DateTimeField(default=timezone.now)
status = models.CharField(
max_length=8,
choices=STATUS_CHOICES,
default=STATUS_DRAFT)
from_account = models.ForeignKey(
'apimail.EmailAccount',
on_delete=models.PROTECT)
to_recipient = models.EmailField()
cc_recipients = ArrayField(
models.EmailField(),
blank=True, null=True)
bcc_recipients = ArrayField(
models.EmailField(),
blank=True, null=True)
subject = models.CharField(max_length=256)
body_text = models.TextField(blank=True)
body_html = models.TextField(blank=True)
attachment_files = models.ManyToManyField(
'apimail.AttachmentFile',
blank=True)
objects = ComposedMessageQuerySet.as_manager()
class Meta:
ordering = ['-created_on']
def __str__(self):
return '%s: %s (from %s to %s) [%s]' % (
self.created_on,
self.subject[:20],
self.from_account.email,
self.to_recipient,
self.get_status_display())
class ComposedMessageAPIResponse(models.Model):
"""
Mailgun API response upon action on ComposedMessage.
"""
message = models.ForeignKey(
'apimail.ComposedMessage',
on_delete=models.CASCADE,
related_name='api_responses')
datetime = models.DateTimeField(default=timezone.now)
status_code = models.PositiveSmallIntegerField()
json = JSONField(default=dict)
class Meta:
ordering = ['-datetime']