Skip to content

Commit

Permalink
Merge pull request #2574 from rtfd/fix-translation-model
Browse files Browse the repository at this point in the history
Stop cascading delete on translation deletion
  • Loading branch information
ericholscher committed Jan 5, 2017
2 parents d6aa24b + 63d9cea commit 71acc78
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 0 deletions.
20 changes: 20 additions & 0 deletions readthedocs/projects/migrations/0018_fix-translation-model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('projects', '0017_add_domain_https'),
]

operations = [
migrations.AlterField(
model_name='project',
name='main_language_project',
field=models.ForeignKey(related_name='translations', on_delete=django.db.models.deletion.SET_NULL, blank=True, to='projects.Project', null=True),
),
]
1 change: 1 addition & 0 deletions readthedocs/projects/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ class Project(models.Model):
# A subproject pointed at its main language, so it can be tracked
main_language_project = models.ForeignKey('self',
related_name='translations',
on_delete=models.SET_NULL,
blank=True, null=True)

# Version State
Expand Down
20 changes: 20 additions & 0 deletions readthedocs/rtd_tests/tests/test_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,26 @@ def test_translations(self):
set(translation_ids_from_orm)
)

def test_translation_delete(self):
"""Ensure translation deletion doesn't cascade up to main project"""
# In this scenario, a user has created a project and set the translation
# to another project. If the user deletes this new project, the delete
# operation shouldn't cascade up to the main project, and should instead
# set None on the relation.
project_keep = get(Project)
project_delete = get(Project)
project_delete.translations.add(project_keep)
self.assertTrue(Project.objects.filter(pk=project_keep.pk).exists())
self.assertTrue(Project.objects.filter(pk=project_delete.pk).exists())
self.assertEqual(
Project.objects.get(pk=project_keep.pk).main_language_project,
project_delete
)
project_delete.delete()
self.assertFalse(Project.objects.filter(pk=project_delete.pk).exists())
self.assertTrue(Project.objects.filter(pk=project_keep.pk).exists())
self.assertIsNone(Project.objects.get(pk=project_keep.pk).main_language_project)

def test_token(self):
r = self.client.get('/api/v2/project/6/token/', {})
resp = json.loads(r.content)
Expand Down

0 comments on commit 71acc78

Please sign in to comment.