From 88d024f81140b8d70a4359b21413ff98db23aa98 Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Thu, 14 Nov 2019 21:26:23 +0100
Subject: [PATCH] Improve apimail models and serializers

---
 apimail/api/serializers.py                    |  2 +-
 .../commands/mailgun_get_stored_messages.py   |  5 +++-
 apimail/managers.py                           | 12 ++++-----
 apimail/migrations/0004_auto_20191114_2115.py | 27 +++++++++++++++++++
 apimail/models/event.py                       |  3 +++
 apimail/models/stored_message.py              |  4 ++-
 6 files changed, 44 insertions(+), 9 deletions(-)
 create mode 100644 apimail/migrations/0004_auto_20191114_2115.py

diff --git a/apimail/api/serializers.py b/apimail/api/serializers.py
index ccb347fb8..7f644606e 100644
--- a/apimail/api/serializers.py
+++ b/apimail/api/serializers.py
@@ -16,4 +16,4 @@ class EventSerializer(serializers.ModelSerializer):
 class StoredMessageSerializer(serializers.ModelSerializer):
     class Meta:
         model = StoredMessage
-        fields = ['uuid', 'data',]
+        fields = ['uuid', 'data', 'datetimestamp']
diff --git a/apimail/management/commands/mailgun_get_stored_messages.py b/apimail/management/commands/mailgun_get_stored_messages.py
index 7b0b5f1dd..aeaa48c20 100644
--- a/apimail/management/commands/mailgun_get_stored_messages.py
+++ b/apimail/management/commands/mailgun_get_stored_messages.py
@@ -2,6 +2,7 @@ __copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
 __license__ = "AGPL v3"
 
 
+from email.utils import parsedate_to_datetime
 from tempfile import TemporaryFile
 
 import requests
@@ -34,7 +35,9 @@ class Command(BaseCommand):
             if not StoredMessage.objects.filter(
                 data__contains={'message-id': orphan.data['message']['headers']['message-id']}
             ).exists():
-                sm = StoredMessage.objects.create(data=response)
+                sm = StoredMessage.objects.create(
+                    data=response,
+                    datetimestamp=parsedate_to_datetime(response['Date']))
                 orphan.stored_message = sm
                 orphan.save()
                 # Now deal with attachments
diff --git a/apimail/managers.py b/apimail/managers.py
index 63e1eac12..3f6d00656 100644
--- a/apimail/managers.py
+++ b/apimail/managers.py
@@ -9,17 +9,17 @@ class StoredMessageQuerySet(models.QuerySet):
     """
     All StoredMessage querysets are always filtered for the user.
     """
-    def filter_for_user(self, request):
+    def filter_for_user(self, user):
         """
         Either su or staff, or user's email addresses overlap with sender/recipients.
         """
-        if not request.user.is_authenticated:
+        if not user.is_authenticated:
             return self.none()
-        elif request.user.is_superuser or request.user.is_admin:
+        elif user.is_superuser or user.is_admin:
             return self
-        emails = [request.user.email,] if request.user.email else []
-        if request.user.contributor:
-            for pe in request.user.contributor.profile.emails.all():
+        emails = [user.email,] if user.email else []
+        if user.contributor:
+            for pe in user.contributor.profile.emails.all():
                 emails.append(pe.email)
         return self.filter_for_emails(emails=emails)
 
diff --git a/apimail/migrations/0004_auto_20191114_2115.py b/apimail/migrations/0004_auto_20191114_2115.py
new file mode 100644
index 000000000..b1819eb09
--- /dev/null
+++ b/apimail/migrations/0004_auto_20191114_2115.py
@@ -0,0 +1,27 @@
+# Generated by Django 2.1.8 on 2019-11-14 20:15
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('apimail', '0003_auto_20191113_2226'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='event',
+            options={'ordering': ['-data__timestamp']},
+        ),
+        migrations.AlterModelOptions(
+            name='storedmessage',
+            options={'ordering': ['-datetimestamp']},
+        ),
+        migrations.AddField(
+            model_name='storedmessage',
+            name='datetimestamp',
+            field=models.DateTimeField(default=django.utils.timezone.now),
+        ),
+    ]
diff --git a/apimail/models/event.py b/apimail/models/event.py
index 183d54009..c830e26aa 100644
--- a/apimail/models/event.py
+++ b/apimail/models/event.py
@@ -38,5 +38,8 @@ class Event(models.Model):
         on_delete=models.CASCADE
     )
 
+    class Meta:
+        ordering = ['-data__timestamp',]
+
     def get_absolute_url(self):
         return reverse('apimail:event_detail', kwargs={'uuid': self.uuid})
diff --git a/apimail/models/stored_message.py b/apimail/models/stored_message.py
index 1f5e01b9a..d9ccade77 100644
--- a/apimail/models/stored_message.py
+++ b/apimail/models/stored_message.py
@@ -7,6 +7,7 @@ import uuid as uuid_lib
 from django.contrib.postgres.fields import JSONField
 from django.db import models
 from django.urls import reverse
+from django.utils import timezone
 
 from scipost.storage import SecureFileStorage
 
@@ -23,11 +24,12 @@ class StoredMessage(models.Model):
         default=uuid_lib.uuid4,
         editable=False)
     data = JSONField(default=dict)
+    datetimestamp = models.DateTimeField(default=timezone.now)
 
     objects = StoredMessageQuerySet.as_manager()
 
     class Meta:
-        ordering = ['-data__Date',]
+        ordering = ['-datetimestamp',]
 
     def get_absolute_url(self):
         return reverse('apimail:stored_message_detail', kwargs={'uuid': self.uuid})
-- 
GitLab