Skip to content

Commit

Permalink
Add a DeleteProject view #24
Browse files Browse the repository at this point in the history
Signed-off-by: Thomas Druez <[email protected]>
  • Loading branch information
tdruez committed Jan 15, 2021
1 parent 83aa92a commit 27248e1
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 12 deletions.
1 change: 0 additions & 1 deletion scanpipe/management/commands/delete-project.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ def handle(self, *inputs, **options):
self.stdout.write("Flush cancelled.")
sys.exit(0)

shutil.rmtree(self.project.work_directory)
self.project.delete()

msg = f"All the {self.project} project data have been removed."
Expand Down
7 changes: 7 additions & 0 deletions scanpipe/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,13 @@ def save(self, *args, **kwargs):
self.setup_work_directory()
super().save(*args, **kwargs)

def delete(self, *args, **kwargs):
"""
Delete the `work_directory` along all the project related data in the database.
"""
shutil.rmtree(self.work_directory)
return super().delete(*args, **kwargs)

def setup_work_directory(self):
"""
Create all the work_directory structure, skip existing.
Expand Down
7 changes: 7 additions & 0 deletions scanpipe/templates/scanpipe/includes/messages.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{% for message in messages %}
<article class="message is-{{ message.level_tag }}">
<div class="message-body">
{{ message|linebreaksbr }}
</div>
</article>
{% endfor %}
1 change: 1 addition & 0 deletions scanpipe/templates/scanpipe/project_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
{% block content %}
<div class="container is-max-desktop">
{% include 'scanpipe/includes/navbar_header.html' %}
<div class="mx-5 mb-2">{% include 'scanpipe/includes/messages.html' %}</div>

<section class="section pt-0">
<div class="is-flex is-justify-content-space-between mb-2">
Expand Down
23 changes: 23 additions & 0 deletions scanpipe/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,29 @@ def test_scanpipe_project_model_clear_tmp_directory(self):
self.assertTrue(self.project1.tmp_path.exists())
self.assertEqual([], list(self.project1.tmp_path.glob("*")))

def test_scanpipe_project_model_delete(self):
work_path = self.project1.work_path
self.assertTrue(work_path.exists())

self.project1.add_input_file(SimpleUploadedFile("file.ext", content=b"content"))
self.project1.add_pipeline(scanpipe_app_config.pipelines[0][0])
resource = CodebaseResource.objects.create(project=self.project1, path="path")
package = DiscoveredPackage.objects.create(project=self.project1)
resource.discovered_packages.add(package)

delete_log = self.project1.delete()
expected = {
"scanpipe.CodebaseResource": 1,
"scanpipe.DiscoveredPackage": 1,
"scanpipe.DiscoveredPackage_codebase_resources": 1,
"scanpipe.Project": 1,
"scanpipe.Run": 1,
}
self.assertEqual(expected, delete_log[1])

self.assertFalse(Project.objects.filter(name="my_project").exists())
self.assertFalse(work_path.exists())

def test_scanpipe_project_model_inputs_and_input_files_and_input_root(self):
self.assertEqual([], list(self.project1.inputs()))
self.assertEqual([], self.project1.input_files)
Expand Down
5 changes: 5 additions & 0 deletions scanpipe/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@
views.ProjectTreeView.as_view(),
name="project_tree",
),
path(
"project/<uuid:uuid>/delete/",
views.ProjectDeleteView.as_view(),
name="project_delete",
),
path(
"project/<uuid:uuid>/results/<path:format>/",
views.ProjectResultsView.as_view(),
Expand Down
37 changes: 26 additions & 11 deletions scanpipe/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,13 @@

from collections import Counter

from django.contrib import messages
from django.db.models import Q
from django.http import FileResponse
from django.http import Http404
from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.views.generic import CreateView
from django.views.generic import DetailView
from django.views.generic import ListView
from django.urls import reverse_lazy
from django.views import generic

from django_filters.views import FilterView

Expand Down Expand Up @@ -58,7 +57,7 @@ class ProjectListView(PrefetchRelatedViewMixin, FilterView):
prefetch_related = ["runs"]


class ProjectCreateView(CreateView):
class ProjectCreateView(generic.CreateView):
model = Project
form_class = ProjectForm
template_name = "scanpipe/project_form.html"
Expand All @@ -77,10 +76,10 @@ def get_context_data(self, **kwargs):
return context

def get_success_url(self):
return reverse("project_detail", kwargs={"uuid": self.object.pk})
return reverse_lazy("project_detail", kwargs={"uuid": self.object.pk})


class ProjectDetailView(DetailView):
class ProjectDetailView(generic.DetailView):
model = Project
slug_url_kwarg = "uuid"
slug_field = "uuid"
Expand Down Expand Up @@ -175,7 +174,23 @@ def get_context_data(self, **kwargs):
return context


class ProjectTreeView(DetailView):
class ProjectDeleteView(generic.DeleteView):
model = Project
slug_url_kwarg = "uuid"
slug_field = "uuid"
success_url = reverse_lazy("project_list")
success_message = 'The project "{}" and all its related data have been removed.'

def delete(self, request, *args, **kwargs):
response_redirect = super().delete(request, *args, **kwargs)
messages.success(self.request, self.success_message.format(self.object.name))
return response_redirect

def get(self, request, *args, **kwargs):
return self.delete(request, *args, **kwargs)


class ProjectTreeView(generic.DetailView):
model = Project
slug_url_kwarg = "uuid"
slug_field = "uuid"
Expand Down Expand Up @@ -210,7 +225,7 @@ def project_results_json_response(project, as_attachment=False):
return response


class ProjectResultsView(DetailView):
class ProjectResultsView(generic.DetailView):
model = Project
slug_url_kwarg = "uuid"
slug_field = "uuid"
Expand Down Expand Up @@ -248,7 +263,7 @@ def get_context_data(self, **kwargs):


class CodebaseResourceListView(
PrefetchRelatedViewMixin, ProjectRelatedViewMixin, ListView
PrefetchRelatedViewMixin, ProjectRelatedViewMixin, generic.ListView
):
model = CodebaseResource
template_name = "scanpipe/resource_list.html"
Expand All @@ -257,7 +272,7 @@ class CodebaseResourceListView(


class DiscoveredPackageListView(
PrefetchRelatedViewMixin, ProjectRelatedViewMixin, ListView
PrefetchRelatedViewMixin, ProjectRelatedViewMixin, generic.ListView
):
model = DiscoveredPackage
template_name = "scanpipe/package_list.html"
Expand Down

0 comments on commit 27248e1

Please sign in to comment.