From 9442be5c230e286073244451189ffc05ae6c8083 Mon Sep 17 00:00:00 2001 From: Jefferson Stachelski Date: Wed, 3 Feb 2016 14:31:53 -0200 Subject: Issue #549 - Implemented remove attachment --- .../adapter/mailstore/leap_attachment_store.py | 6 ++++++ service/pixelated/adapter/services/mail_service.py | 10 +++++++--- service/pixelated/resources/attachments_resource.py | 3 +++ .../adapter/mailstore/test_leap_attachment_store.py | 15 +++++++++++++++ web-ui/app/js/mail_view/ui/attachment_list.js | 20 ++++++++++++++++++-- web-ui/app/js/mail_view/ui/forward_box.js | 5 +++-- 6 files changed, 52 insertions(+), 7 deletions(-) diff --git a/service/pixelated/adapter/mailstore/leap_attachment_store.py b/service/pixelated/adapter/mailstore/leap_attachment_store.py index 982d9222..2c004abf 100644 --- a/service/pixelated/adapter/mailstore/leap_attachment_store.py +++ b/service/pixelated/adapter/mailstore/leap_attachment_store.py @@ -63,3 +63,9 @@ class LeapAttachmentStore(object): def _calc_attachment_id_(self, content, content_type, encoder=encoders.encode_base64): cdoc = self._attachment_to_cdoc(content, content_type, encoder) return cdoc.phash + + @defer.inlineCallbacks + def delete_attachment(self, attachment_id): + doc = yield self.soledad.get_from_index('by-type-and-payloadhash', 'cnt', attachment_id) + doc = doc[0] + yield self.soledad.delete_doc(doc) diff --git a/service/pixelated/adapter/services/mail_service.py b/service/pixelated/adapter/services/mail_service.py index 2da2cca6..5ec3a298 100644 --- a/service/pixelated/adapter/services/mail_service.py +++ b/service/pixelated/adapter/services/mail_service.py @@ -35,7 +35,7 @@ class MailService(object): self.search_engine = search_engine self.mail_sender = mail_sender self.account_email = account_email - self.attchment_store = attachment_store + self.attachment_store = attachment_store @defer.inlineCallbacks def all_mails(self): @@ -43,7 +43,7 @@ class MailService(object): defer.returnValue(mails) def save_attachment(self, content, content_type): - return self.attchment_store.add_attachment(content, content_type) + return self.attachment_store.add_attachment(content, content_type) @log_time_deferred @defer.inlineCallbacks @@ -87,7 +87,7 @@ class MailService(object): return self.mail_store.get_mail(mail_id, include_body=True) def attachment(self, attachment_id): - return self.attchment_store.get_mail_attachment(attachment_id) + return self.attachment_store.get_mail_attachment(attachment_id) @defer.inlineCallbacks def mail_exists(self, mail_id): @@ -151,3 +151,7 @@ class MailService(object): @defer.inlineCallbacks def delete_permanent(self, mail_id): yield self.mail_store.delete_mail(mail_id) + + @defer.inlineCallbacks + def delete_attachment(self, attachment_id): + yield self.attachment_store.delete_attachment(attachment_id) diff --git a/service/pixelated/resources/attachments_resource.py b/service/pixelated/resources/attachments_resource.py index 249d268a..401fb321 100644 --- a/service/pixelated/resources/attachments_resource.py +++ b/service/pixelated/resources/attachments_resource.py @@ -71,6 +71,9 @@ class AttachmentResource(Resource): match = re.compile('([A-Za-z-]+\/[A-Za-z-]+)').search(content_type) return match.group(1) + def render_DELETE(self, request): + self.mail_service.delete_attachment(self.attachment_id) + class AttachmentsResource(BaseResource): BASE_URL = 'attachment' diff --git a/service/test/unit/adapter/mailstore/test_leap_attachment_store.py b/service/test/unit/adapter/mailstore/test_leap_attachment_store.py index 4e9b56b1..f1bd8528 100644 --- a/service/test/unit/adapter/mailstore/test_leap_attachment_store.py +++ b/service/test/unit/adapter/mailstore/test_leap_attachment_store.py @@ -116,6 +116,21 @@ class TestLeapAttachmentStore(TestCase): except ValueError: pass + @defer.inlineCallbacks + def test_soledad_delete_doc_is_called_when_deleting_an_attachment(self): + attachment_id = '1B0A9AAD9E153D24265395203C53884506ABA276394B9FEC02B214BF9E77E48E' + doc = SoledadDocument(json=json.dumps({'content_type': 'foo/bar', 'raw': 'quoted-printable', + 'phash': attachment_id, + 'content_transfer_encoding': ''})) + + when(self.soledad).get_from_index('by-type-and-payloadhash', 'cnt', attachment_id).thenReturn(defer.succeed([doc])) + when(self.soledad).delete_doc(doc).thenReturn(defer.succeed(None)) + + store = LeapAttachmentStore(self.soledad) + yield store.delete_attachment(attachment_id) + + verify(self.soledad).delete_doc(doc) + def _mock_get_mailbox(self, mailbox_name, create_new_uuid=False): mbox_uuid = self.mbox_uuid if not create_new_uuid else str(uuid4()) when(self.soledad).list_indexes().thenReturn(defer.succeed(MAIL_INDEXES)).thenReturn( diff --git a/web-ui/app/js/mail_view/ui/attachment_list.js b/web-ui/app/js/mail_view/ui/attachment_list.js index b3b26710..3d57ede5 100644 --- a/web-ui/app/js/mail_view/ui/attachment_list.js +++ b/web-ui/app/js/mail_view/ui/attachment_list.js @@ -19,10 +19,11 @@ define( [ 'views/templates', 'page/events', - 'helpers/view_helper' + 'helpers/view_helper', + 'helpers/monitored_ajax' ], - function (templates, events, viewHelper) { + function (templates, events, viewHelper, monitoredAjax) { 'use strict'; function attachmentList() { @@ -180,11 +181,26 @@ define( this.select('inputFileUpload').click(); }; + this.removeAttachments = function(event, data) { + var success = function() { + console.log('Success'); + }; + + var failure = function() { + console.log('Fail!!!!!'); + }; + + monitoredAjax(this, '/attachment/' + data.ident, { + type: 'DELETE' + }).done(success.bind(this)).fail(failure.bind(this)); + }; + this.after('initialize', function () { this.addJqueryFileUploadConfig(); this.on(document, events.mail.uploadedAttachment, this.showAttachment); this.on(document, events.mail.startUploadAttachment, this.startUpload); this.on(document, events.mail.appendAttachment, this.addAttachment); + this.on(document, events.mail.removeAttachment, this.removeAttachments); }); } diff --git a/web-ui/app/js/mail_view/ui/forward_box.js b/web-ui/app/js/mail_view/ui/forward_box.js index 3d643b2f..5acef337 100644 --- a/web-ui/app/js/mail_view/ui/forward_box.js +++ b/web-ui/app/js/mail_view/ui/forward_box.js @@ -56,7 +56,7 @@ define( self.trigger(document, events.mail.removeAttachment, {ident: ident}); event.preventDefault(); }); - + this.on(this.select('subjectDisplay'), 'click', this.showSubjectInput); this.select('recipientsDisplay').hide(); this.select('recipientsFields').show(); @@ -64,7 +64,8 @@ define( this.convertToRemovableAttachments = function(attachments) { return attachments.map(function(attachment) { - attachment.removable = true; + attachment.removable = false; // don't show this button until the bug is fixed + attachment.received = true; return attachment; }); }; -- cgit v1.2.3