From 5422470ff071dc5cbd2ef850c89a047a816d954a Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Sun, 26 Jan 2020 16:10:14 +0100
Subject: [PATCH] Add model apimail.ComposedMessage

---
 apimail/admin.py                           |  7 +++
 apimail/migrations/0012_composedmessage.py | 36 +++++++++++
 apimail/models/__init__.py                 |  2 +
 apimail/models/composed_message.py         | 70 ++++++++++++++++++++++
 4 files changed, 115 insertions(+)
 create mode 100644 apimail/migrations/0012_composedmessage.py
 create mode 100644 apimail/models/composed_message.py

diff --git a/apimail/admin.py b/apimail/admin.py
index 920e6fd68..c59fd8163 100644
--- a/apimail/admin.py
+++ b/apimail/admin.py
@@ -6,6 +6,7 @@ from django.contrib import admin
 
 from .models import (
     EmailAccount, EmailAccountAccess,
+    ComposedMessage,
     Event,
     StoredMessage, StoredMessageAttachment,
     UserTag)
@@ -23,6 +24,12 @@ class EmailAccountAdmin(admin.ModelAdmin):
 admin.site.register(EmailAccount, EmailAccountAdmin)
 
 
+class ComposedMessageAdmin(admin.ModelAdmin):
+    pass
+
+admin.site.register(ComposedMessage, ComposedMessageAdmin)
+
+
 class EventAdmin(admin.ModelAdmin):
     pass
 
diff --git a/apimail/migrations/0012_composedmessage.py b/apimail/migrations/0012_composedmessage.py
new file mode 100644
index 000000000..43486b0c7
--- /dev/null
+++ b/apimail/migrations/0012_composedmessage.py
@@ -0,0 +1,36 @@
+# Generated by Django 2.1.8 on 2020-01-26 15:09
+
+from django.conf import settings
+import django.contrib.postgres.fields
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+import uuid
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('apimail', '0011_auto_20200118_0843'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='ComposedMessage',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('uuid', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False)),
+                ('created_on', models.DateTimeField(default=django.utils.timezone.now)),
+                ('status', models.CharField(choices=[('draft', 'Draft'), ('ready', 'Ready for sending'), ('rendered', 'Rendered'), ('sent', 'Sent')], default='draft', max_length=8)),
+                ('to_recipient', models.EmailField(max_length=254)),
+                ('cc_recipients', django.contrib.postgres.fields.ArrayField(base_field=models.EmailField(max_length=254), blank=True, null=True, size=None)),
+                ('bcc_recipients', django.contrib.postgres.fields.ArrayField(base_field=models.EmailField(max_length=254), blank=True, null=True, size=None)),
+                ('subject', models.CharField(max_length=256)),
+                ('body_text', models.TextField()),
+                ('body_html', models.TextField(blank=True)),
+                ('author', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)),
+                ('from_account', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='apimail.EmailAccount')),
+            ],
+        ),
+    ]
diff --git a/apimail/models/__init__.py b/apimail/models/__init__.py
index 21b2984b3..78b5e8e21 100644
--- a/apimail/models/__init__.py
+++ b/apimail/models/__init__.py
@@ -4,6 +4,8 @@ __license__ = "AGPL v3"
 
 from .account import EmailAccount, EmailAccountAccess
 
+from .composed_message import ComposedMessage
+
 from .event import Event
 
 from .stored_message import StoredMessage, StoredMessageAttachment
diff --git a/apimail/models/composed_message.py b/apimail/models/composed_message.py
new file mode 100644
index 000000000..0b29877b9
--- /dev/null
+++ b/apimail/models/composed_message.py
@@ -0,0 +1,70 @@
+__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
+from django.db import models
+from django.utils import timezone
+
+
+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()
+    body_html = models.TextField(blank=True)
+
+    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())
-- 
GitLab