Skip to content

Commit 71acc78

Browse files
authored
Merge pull request #2574 from rtfd/fix-translation-model
Stop cascading delete on translation deletion
2 parents d6aa24b + 63d9cea commit 71acc78

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-0
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import models, migrations
5+
import django.db.models.deletion
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('projects', '0017_add_domain_https'),
12+
]
13+
14+
operations = [
15+
migrations.AlterField(
16+
model_name='project',
17+
name='main_language_project',
18+
field=models.ForeignKey(related_name='translations', on_delete=django.db.models.deletion.SET_NULL, blank=True, to='projects.Project', null=True),
19+
),
20+
]

readthedocs/projects/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ class Project(models.Model):
242242
# A subproject pointed at its main language, so it can be tracked
243243
main_language_project = models.ForeignKey('self',
244244
related_name='translations',
245+
on_delete=models.SET_NULL,
245246
blank=True, null=True)
246247

247248
# Version State

readthedocs/rtd_tests/tests/test_project.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,26 @@ def test_translations(self):
4848
set(translation_ids_from_orm)
4949
)
5050

51+
def test_translation_delete(self):
52+
"""Ensure translation deletion doesn't cascade up to main project"""
53+
# In this scenario, a user has created a project and set the translation
54+
# to another project. If the user deletes this new project, the delete
55+
# operation shouldn't cascade up to the main project, and should instead
56+
# set None on the relation.
57+
project_keep = get(Project)
58+
project_delete = get(Project)
59+
project_delete.translations.add(project_keep)
60+
self.assertTrue(Project.objects.filter(pk=project_keep.pk).exists())
61+
self.assertTrue(Project.objects.filter(pk=project_delete.pk).exists())
62+
self.assertEqual(
63+
Project.objects.get(pk=project_keep.pk).main_language_project,
64+
project_delete
65+
)
66+
project_delete.delete()
67+
self.assertFalse(Project.objects.filter(pk=project_delete.pk).exists())
68+
self.assertTrue(Project.objects.filter(pk=project_keep.pk).exists())
69+
self.assertIsNone(Project.objects.get(pk=project_keep.pk).main_language_project)
70+
5171
def test_token(self):
5272
r = self.client.get('/api/v2/project/6/token/', {})
5373
resp = json.loads(r.content)

0 commit comments

Comments
 (0)