From ff8905210467b3949af209954936445bd610d6cc Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Fri, 7 Feb 2020 09:11:23 +0100
Subject: [PATCH] Save draft/reply now handle adding attachments

---
 apimail/api/views.py                             | 13 +++++++++++++
 .../assets/vue/components/MessageComposer.vue    | 16 +++++++++++-----
 2 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/apimail/api/views.py b/apimail/api/views.py
index a15cd5301..04855345d 100644
--- a/apimail/api/views.py
+++ b/apimail/api/views.py
@@ -8,6 +8,7 @@ from django.db.models import Q
 from django.shortcuts import get_object_or_404
 from django.utils import timezone
 
+from rest_framework.exceptions import NotFound
 from rest_framework.generics import (
     CreateAPIView, DestroyAPIView, ListAPIView,
     RetrieveAPIView, UpdateAPIView)
@@ -88,6 +89,18 @@ class ComposedMessageUpdateAPIView(UpdateAPIView):
     serializer_class = ComposedMessageSerializer
     lookup_field = 'uuid'
 
+    def partial_update(self, request, *args, **kwargs):
+        instance = self.get_object()
+        data = request.data
+        for att_uuid in data['attachment_uuids']:
+            try:
+                att = AttachmentFile.objects.get(uuid=att_uuid)
+                instance.attachment_files.remove(att)
+                instance.attachment_files.add(att)
+            except AttachmentFile.DoesNotExist:
+                raise NotFound(detail=('An attachment file with uuid %s was not found.' % att_uuid))
+        return super().partial_update(request, *args, **kwargs)
+
 
 class ComposedMessageDestroyAPIView(DestroyAPIView):
     permission_classes = (IsAuthenticated, CanHandleComposedMessage,)
diff --git a/apimail/static/apimail/assets/vue/components/MessageComposer.vue b/apimail/static/apimail/assets/vue/components/MessageComposer.vue
index c8d785359..6f69f6a2f 100644
--- a/apimail/static/apimail/assets/vue/components/MessageComposer.vue
+++ b/apimail/static/apimail/assets/vue/components/MessageComposer.vue
@@ -65,7 +65,8 @@
       class="mb-4"
       >
       <attachment-list-editable
-	:attachments="form.attachments"></attachment-list-editable>
+	:attachments="form.attachments">
+      </attachment-list-editable>
     </b-form-group>
     <b-form-group
       id="subject"
@@ -122,8 +123,6 @@
       <p class="m-2 p-2 bg-success text-white">
 	The message draft was successfully saved.
       </p>
-      <p>JSON: {{ response_body_json }}</p>
-      <p>Draft: {{ draftmessage }}</p>
     </template>
     <template v-else-if="markReadySuccessful">
       <p class="m-2 p-2 bg-success text-white">
@@ -132,7 +131,8 @@
     </template>
     <template v-else-if="saveDraftSuccessful === false || markReadySuccessful === false">
       <p class="m-2 p-2 bg-danger text-white">
-	The server responded with an error, please check and try again
+	The server responded with an error, please check and try again.<br>
+	{{ response_body_json }}
       </p>
     </template>
 
@@ -213,6 +213,10 @@ export default {
 	    else {
 		url += '/create'
 	    }
+	    var attachment_uuids = []
+	    this.form.attachments.forEach( function(att) {
+		attachment_uuids.push(att.uuid)
+	    })
 	    fetch(url,
 	    	  {
 	    	      method: method,
@@ -229,7 +233,7 @@ export default {
 			  'subject': this.form.subject,
 			  'body_text': this.form.body,
 			  'body_html': this.form.sanitized_body_html,
-			  'attachments': this.form.attachments
+			  'attachment_uuids': attachment_uuids
 	    	      })
 	    	  })
 		.then(response => {
@@ -271,6 +275,7 @@ export default {
 	    this.form.subject = this.draftmessage.subject
 	    this.form.body = this.draftmessage.body_text
 	    this.form.sanitized_body_html = this.$sanitize(this.draftmessage.body_html)
+	    this.form.attachments = this.draftmessage.attachment_files
 	}
       	else if (this.originalmessage) {
 	    this.form.from_account = this.originalmessage.data.To
@@ -291,6 +296,7 @@ export default {
 				   '\nDate: ' + this.originalmessage.datetimestamp +
 				   '\nTo: ' + this.originalmessage.data.To +
 				   '\n\n')
+		this.form.attachments = this.originalmessage.attachment_files
 	    }
 	    this.form.body += (this.originalmessage.data["body-plain"] +
 			       '\n</blockquote>')
-- 
GitLab