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