From 107092fecb793d16f1fdf624f5e3abaf0b57c57c Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Thu, 16 Jan 2020 20:12:26 +0100
Subject: [PATCH] Add read_by and update API for StoredMessage

---
 apimail/api/views.py                          |  3 +-
 apimail/migrations/0007_auto_20200116_1955.py | 19 +++++
 apimail/models/stored_message.py              |  5 +-
 .../assets/vue/components/MessageContent.vue  | 75 +++++++++++--------
 package.json                                  |  1 +
 5 files changed, 69 insertions(+), 34 deletions(-)
 create mode 100644 apimail/migrations/0007_auto_20200116_1955.py

diff --git a/apimail/api/views.py b/apimail/api/views.py
index e62579d61..761ec872f 100644
--- a/apimail/api/views.py
+++ b/apimail/api/views.py
@@ -109,6 +109,7 @@ class StoredMessageRetrieveAPIView(RetrieveAPIView):
 
 class StoredMessageUpdateReadAPIView(UpdateAPIView):
     """Updates the read field (M2M to user) in StoredMessage."""
+    queryset = StoredMessage.objects.all()
     permission_classes = (IsAdminUser,)
     serializer_class = StoredMessageSerializer
     lookup_field = 'uuid'
@@ -117,5 +118,5 @@ class StoredMessageUpdateReadAPIView(UpdateAPIView):
     def partial_update(self, request, *args, **kwargs):
         instance = self.get_object()
         instance.read_by.add(request.user)
-        instance.save(update_fields=['read_by'])
+        instance.save()
         return Response()
diff --git a/apimail/migrations/0007_auto_20200116_1955.py b/apimail/migrations/0007_auto_20200116_1955.py
new file mode 100644
index 000000000..ee0e77c20
--- /dev/null
+++ b/apimail/migrations/0007_auto_20200116_1955.py
@@ -0,0 +1,19 @@
+# Generated by Django 2.1.8 on 2020-01-16 18:55
+
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('apimail', '0006_storedmessage_read_by'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='storedmessage',
+            name='read_by',
+            field=models.ManyToManyField(blank=True, related_name='_storedmessage_read_by_+', to=settings.AUTH_USER_MODEL),
+        ),
+    ]
diff --git a/apimail/models/stored_message.py b/apimail/models/stored_message.py
index 75688cd5f..ffcf29055 100644
--- a/apimail/models/stored_message.py
+++ b/apimail/models/stored_message.py
@@ -26,7 +26,10 @@ class StoredMessage(models.Model):
         editable=False)
     data = JSONField(default=dict)
     datetimestamp = models.DateTimeField(default=timezone.now)
-    read_by = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='+')
+    read_by = models.ManyToManyField(
+        settings.AUTH_USER_MODEL,
+        blank=True,
+        related_name='+')
 
     objects = StoredMessageQuerySet.as_manager()
 
diff --git a/apimail/static/apimail/assets/vue/components/MessageContent.vue b/apimail/static/apimail/assets/vue/components/MessageContent.vue
index 28cd814a7..b42c2db01 100644
--- a/apimail/static/apimail/assets/vue/components/MessageContent.vue
+++ b/apimail/static/apimail/assets/vue/components/MessageContent.vue
@@ -51,36 +51,47 @@
 </template>
 
 <script>
-  export default {
-      name: "message-content",
-      props: {
-	  message: {
-	      type: Object,
-	      required: true
-	  },
-      },
-      computed: {
-	  sanitized_html() {
-	      if (this.message.data["body-html"]) {
-		  return this.$sanitize(this.message.data["body-html"])
-	      }
-	      return this.$sanitize(this.message.data["body-plain"])
-	  }
-      },
-      filters: {
-	  toDatestring(unixtimestamp) {
-	      return new Date(1000 * unixtimestamp).toISOString()
-	  }
-      },
-      mounted () {
-	  if (!this.message.read) {
-	      console.log('uuid: ' + this.message.uuid)
-	      fetch('/mail/api/stored_message/' + this.message.uuid + '/mark_as_read',
-		    { method: 'PATCH', }
-		   ).then((res) => res.json())
-		  .then((data) =>  console.log(data))
-		  .catch((err)=>console.log(err))
-	  }
-      }
-  }
+import Cookies from 'js-cookie'
+
+var csrftoken = Cookies.get('csrftoken');
+
+export default {
+    name: "message-content",
+    props: {
+	message: {
+	    type: Object,
+	    required: true
+	},
+    },
+    computed: {
+	sanitized_html() {
+	    if (this.message.data["body-html"]) {
+		return this.$sanitize(this.message.data["body-html"])
+	    }
+	    return this.$sanitize(this.message.data["body-plain"])
+	}
+    },
+    filters: {
+	toDatestring(unixtimestamp) {
+	    return new Date(1000 * unixtimestamp).toISOString()
+	}
+    },
+    mounted () {
+	if (!this.message.read) {
+	    console.log('uuid: ' + this.message.uuid)
+	    fetch('/mail/api/stored_message/' + this.message.uuid + '/mark_as_read',
+		  { method: 'PATCH',
+		    headers: {
+			"X-CSRFToken": csrftoken,
+		    }
+		  }
+		 ).then(function(response) {
+		     if (!response.ok) {
+			 throw new Error('HTTP error, status = ' + response.status);
+		     }
+		 });
+	    this.message.read = true
+	}
+    }
+}
 </script>
diff --git a/package.json b/package.json
index a2b7bc6b9..73230ec77 100644
--- a/package.json
+++ b/package.json
@@ -56,6 +56,7 @@
     "bootstrap-vue": "^2.1.0",
     "expose-loader": "^0.7.5",
     "fibers": "^4.0.2",
+    "js-cookie": "^2.2.1",
     "mem": "^6.0.0",
     "mini-css-extract-plugin": "^0.8.0",
     "nan": "^2.14.0",
-- 
GitLab