Skip to content

Commit

Permalink
Merge pull request #19 from ethankent/master
Browse files Browse the repository at this point in the history
Implement folder deletion
  • Loading branch information
paltman committed Apr 10, 2016
2 parents bd73c65 + da7ee0f commit b50c14a
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 3 deletions.
15 changes: 15 additions & 0 deletions pinax/documents/hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,21 @@ def document_deleted_message(self, request, document):
"""
messages.success(request, _("Document has been deleted"))

def folder_deleted_message(self, request, folder):
"""
Send messages.success message after successful document deletion.
"""
messages.success(request, _("Folder has been deleted"))

def folder_pre_delete(self, request, folder):
"""
Perform folder operations prior to deletions. For example, deleting all contents.
"""
for m in folder.members():
if m.__class__ == folder.__class__:
self.folder_pre_delete(request, m)
m.delete()


class HookProxy(object):

Expand Down
6 changes: 6 additions & 0 deletions pinax/documents/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,12 @@ def share(self, users):
FM._default_manager.bulk_create(fm)
DM._default_manager.bulk_create(dm)

def delete_url(self):
return reverse(
"pinax_documents:folder_delete",
args=[self.pk]
)


class Document(models.Model):

Expand Down
56 changes: 53 additions & 3 deletions pinax/documents/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ def setUp(self):
self.create_urlname = "pinax_documents:folder_create"
self.detail_urlname = "pinax_documents:folder_detail"
self.share_urlname = "pinax_documents:folder_share"
self.delete_urlname = "pinax_documents:folder_delete"

def test_get_create_without_parent(self):
"""
Expand Down Expand Up @@ -118,11 +119,60 @@ def test_duplicate_folder_name(self):
"""
pass

def test_delete(self):
@mock.patch("django.contrib.messages.success")
def test_delete(self, mock_messages):
"""
Ensure we can delete a folder?
Ensure we can delete a folder.
"""
pass
parent_folder = Folder.objects.create(name="Parent", author=self.user)

with self.login(self.user):
response = self.get(self.delete_urlname, pk=parent_folder.pk)
self.response_200(response)
self.assertTrue('pinax/documents/folder_confirm_delete.html' in response.template_name)

response = self.post(self.delete_urlname, pk=parent_folder.pk, follow=True)
self.response_200(response)
self.assertFalse(Folder.objects.filter(pk=parent_folder.pk))
self.assertTrue(mock_messages.called)

response = self.get(self.detail_urlname, pk=parent_folder.pk)
self.response_404(response)

@mock.patch("django.contrib.messages.success")
def test_delete_recursive(self, mock_messages):
"""
Ensure that when we delete a folder with contents, those contents are also deleted.
"""
parent_folder = Folder.objects.create(name="Parent", author=self.user)
child_folder = Folder.objects.create(name="Child", author=self.user, parent=parent_folder)
Folder.objects.create(name="Grand Child", author=self.user, parent=child_folder)

child_file = SimpleUploadedFile("child.txt", b"Child document")
child_document = Document.objects.create(name="Child Doc",
author=self.user,
file=child_file,
folder=parent_folder,
)
grand_child_file = SimpleUploadedFile("grand_child.txt", b"Grand Child document")
grand_child_document = Document.objects.create(name="Grand Child Doc",
author=self.user,
file=grand_child_file,
folder=child_folder,
)

with self.login(self.user):
response = self.post(self.delete_urlname, pk=parent_folder.pk, follow=True)
self.response_200(response)
self.assertFalse(Folder.objects.all())
self.assertFalse(Document.objects.all())

self.assertTrue(mock_messages.called)

response = self.get("pinax_documents:document_detail", pk=child_document.pk)
self.response_404(response)
response = self.get("pinax_documents:document_detail", pk=grand_child_document.pk)
self.response_404(response)

def test_get_share(self):
"""
Expand Down
2 changes: 2 additions & 0 deletions pinax/documents/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@
name="folder_detail"),
url(r"^f/(?P<pk>\d+)/share/$", views.FolderShare.as_view(),
name="folder_share"),
url(r"^f/(?P<pk>\d+)/delete/$", views.FolderDelete.as_view(),
name="folder_delete"),
]
12 changes: 12 additions & 0 deletions pinax/documents/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,18 @@ def get_context_data(self, **kwargs):
return context


class FolderDelete(LoginRequiredMixin, DeleteView):
model = Folder
success_url = reverse_lazy("pinax_documents:document_index")
template_name = 'pinax/documents/folder_confirm_delete.html'

def delete(self, request, *args, **kwargs):
hookset.folder_pre_delete(self.request, self.get_object())
success_url = super(FolderDelete, self).delete(request, *args, **kwargs)
hookset.folder_deleted_message(self.request, self.object)
return success_url


class DocumentCreate(LoginRequiredMixin, CreateView):
model = Document
form_class = DocumentCreateForm
Expand Down

0 comments on commit b50c14a

Please sign in to comment.