Skip to content

Commit 799a522

Browse files
committed
Merge pull request #1686 from rtfd/fix-deleting-files
Clean up logic around how we delete files for deleted projects and inactive versions
2 parents 1392891 + efee905 commit 799a522

File tree

3 files changed

+28
-10
lines changed

3 files changed

+28
-10
lines changed

readthedocs/builds/models.py

+6
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,12 @@ def save(self, *args, **kwargs):
159159
self.project.sync_supported_versions()
160160
return obj
161161

162+
def delete(self, *args, **kwargs):
163+
from readthedocs.projects.tasks import clear_artifacts
164+
log.info('Removing files for version %s' % self.slug)
165+
clear_artifacts.delay(version_pk=self.pk)
166+
super(Version, self).delete(*args, **kwargs)
167+
162168
@property
163169
def identifier_friendly(self):
164170
'''Return display friendly identifier'''

readthedocs/projects/views/private.py

+17-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from django.contrib.auth.models import User
77
from django.contrib import messages
88
from django.core.urlresolvers import reverse
9+
from django.conf import settings
910
from django.http import (HttpResponseRedirect, HttpResponseNotAllowed,
1011
Http404, HttpResponseBadRequest)
1112
from django.shortcuts import get_object_or_404, render_to_response, render
@@ -32,7 +33,7 @@
3233
from readthedocs.projects.models import Project, EmailHook, WebHook, Domain
3334
from readthedocs.projects.views.base import ProjectAdminMixin
3435
from readthedocs.projects import constants, tasks
35-
from readthedocs.projects.tasks import remove_path_from_web
36+
from readthedocs.projects.tasks import remove_dir, clear_artifacts
3637

3738
from readthedocs.core.mixins import LoginRequiredMixin
3839
from readthedocs.projects.signals import project_import
@@ -188,7 +189,13 @@ def project_version_detail(request, project_slug, version_slug):
188189
form = VersionForm(request.POST or None, instance=version)
189190

190191
if request.method == 'POST' and form.is_valid():
191-
form.save()
192+
version = form.save()
193+
if form.has_changed():
194+
if 'active' in form.changed_data and version.active is False:
195+
log.info('Removing files for version %s' % version.slug)
196+
clear_artifacts.delay(version_pk=version.pk)
197+
version.built = False
198+
version.save()
192199
url = reverse('project_version_list', args=[project.slug])
193200
return HttpResponseRedirect(url)
194201

@@ -210,8 +217,14 @@ def project_delete(request, project_slug):
210217
slug=project_slug)
211218

212219
if request.method == 'POST':
213-
# Remove the repository checkout
214-
remove_path_from_web.delay(path=project.doc_path)
220+
# Support hacky "broadcast" with MULTIPLE_APP_SERVERS setting,
221+
# otherwise put in normal celery queue
222+
for server in getattr(settings, "MULTIPLE_APP_SERVERS", ['celery']):
223+
log.info('Removing files on %s' % server)
224+
remove_dir.apply_async(
225+
args=[project.doc_path],
226+
queue=server,
227+
)
215228

216229
# Delete the project and everything related to it
217230
project.delete()

readthedocs/rtd_tests/tests/test_project_views.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -212,12 +212,11 @@ def test_delete_project(self):
212212
response = self.client.get('/dashboard/pip/delete/')
213213
self.assertEqual(response.status_code, 200)
214214

215-
patcher = patch(
216-
'readthedocs.projects.views.private.remove_path_from_web')
217-
with patcher as remove_path_from_web:
215+
patcher = patch('readthedocs.projects.views.private.remove_dir')
216+
with patcher as remove_dir:
218217
response = self.client.post('/dashboard/pip/delete/')
219218
self.assertEqual(response.status_code, 302)
220-
221219
self.assertFalse(Project.objects.filter(slug='pip').exists())
222-
remove_path_from_web.delay.assert_called_with(
223-
path=project.doc_path)
220+
remove_dir.apply_async.assert_called_with(
221+
queue='celery',
222+
args=[project.doc_path])

0 commit comments

Comments
 (0)