diff --git a/pytest.ini b/pytest.ini index f0ff1692ab5..20f8e46a905 100644 --- a/pytest.ini +++ b/pytest.ini @@ -2,10 +2,6 @@ addopts = --reuse-db python_files = tests.py test_*.py *_tests.py filterwarnings = - # TODO: this filter has to be removed before migrating to Django - # 2.0 and the code has to be upgrade accordingly - ignore::django.utils.deprecation.RemovedInDjango20Warning - # Ignore external dependencies warning deprecations # textclassifier ignore:The 'warn' method is deprecated, use 'warning' instead:DeprecationWarning diff --git a/readthedocs/api/v3/serializers.py b/readthedocs/api/v3/serializers.py index cc1f862a9ab..7ca6226ec58 100644 --- a/readthedocs/api/v3/serializers.py +++ b/readthedocs/api/v3/serializers.py @@ -3,7 +3,7 @@ from django.conf import settings from django.contrib.auth.models import User -from django.core.urlresolvers import reverse +from django.urls import reverse from django.utils.translation import ugettext as _ from rest_flex_fields import FlexFieldsModelSerializer diff --git a/readthedocs/builds/migrations/0001_initial.py b/readthedocs/builds/migrations/0001_initial.py index 27f61efb797..4418a4dc7a0 100644 --- a/readthedocs/builds/migrations/0001_initial.py +++ b/readthedocs/builds/migrations/0001_initial.py @@ -29,7 +29,7 @@ class Migration(migrations.Migration): ('commit', models.CharField(max_length=255, null=True, verbose_name='Commit', blank=True)), ('length', models.IntegerField(null=True, verbose_name='Build Length', blank=True)), ('builder', models.CharField(max_length=255, null=True, verbose_name='Builder', blank=True)), - ('project', models.ForeignKey(related_name='builds', verbose_name='Project', to='projects.Project')), + ('project', models.ForeignKey(related_name='builds', verbose_name='Project', to='projects.Project', on_delete=models.CASCADE)), ], options={ 'ordering': ['-date'], @@ -50,12 +50,11 @@ class Migration(migrations.Migration): ('uploaded', models.BooleanField(default=False, verbose_name='Uploaded')), ('privacy_level', models.CharField(default=b'public', help_text='Level of privacy for this Version.', max_length=20, verbose_name='Privacy Level', choices=[(b'public', 'Public'), (b'protected', 'Protected'), (b'private', 'Private')])), ('machine', models.BooleanField(default=False, verbose_name='Machine Created')), - ('project', models.ForeignKey(related_name='versions', verbose_name='Project', to='projects.Project')), + ('project', models.ForeignKey(related_name='versions', verbose_name='Project', to='projects.Project', on_delete=models.CASCADE)), ('tags', taggit.managers.TaggableManager(to='taggit.Tag', through='taggit.TaggedItem', blank=True, help_text='A comma-separated list of tags.', verbose_name='Tags')), ], options={ 'ordering': ['-verbose_name'], - 'permissions': (('view_version', 'View Version'),), }, ), migrations.CreateModel( @@ -65,13 +64,13 @@ class Migration(migrations.Migration): ('from_slug', models.CharField(default=b'', max_length=255, verbose_name='From slug')), ('to_slug', models.CharField(default=b'', max_length=255, verbose_name='To slug', blank=True)), ('largest', models.BooleanField(default=False, verbose_name='Largest')), - ('project', models.ForeignKey(related_name='aliases', verbose_name='Project', to='projects.Project')), + ('project', models.ForeignKey(related_name='aliases', verbose_name='Project', to='projects.Project', on_delete=models.CASCADE)), ], ), migrations.AddField( model_name='build', name='version', - field=models.ForeignKey(related_name='builds', verbose_name='Version', to='builds.Version', null=True), + field=models.ForeignKey(related_name='builds', verbose_name='Version', to='builds.Version', null=True, on_delete=models.CASCADE), ), migrations.AlterUniqueTogether( name='version', diff --git a/readthedocs/builds/migrations/0002_build_command_initial.py b/readthedocs/builds/migrations/0002_build_command_initial.py index d78b9d13d2f..3da213dcecc 100644 --- a/readthedocs/builds/migrations/0002_build_command_initial.py +++ b/readthedocs/builds/migrations/0002_build_command_initial.py @@ -21,7 +21,7 @@ class Migration(migrations.Migration): ('exit_code', models.IntegerField(verbose_name='Command exit code')), ('start_time', models.DateTimeField(verbose_name='Start time')), ('end_time', models.DateTimeField(verbose_name='End time')), - ('build', models.ForeignKey(related_name='commands', verbose_name='Build', to='builds.Build')), + ('build', models.ForeignKey(related_name='commands', verbose_name='Build', to='builds.Build', on_delete=models.CASCADE)), ], options={ 'ordering': ['start_time'], diff --git a/readthedocs/builds/models.py b/readthedocs/builds/models.py index 2993927c859..8c1846c45fa 100644 --- a/readthedocs/builds/models.py +++ b/readthedocs/builds/models.py @@ -92,6 +92,7 @@ class Version(models.Model): Project, verbose_name=_('Project'), related_name='versions', + on_delete=models.CASCADE, ) type = models.CharField( _('Type'), @@ -160,11 +161,6 @@ class Version(models.Model): class Meta: unique_together = [('project', 'slug')] ordering = ['-verbose_name'] - permissions = ( - # Translators: Permission around whether a user can view the - # version - ('view_version', _('View Version')), - ) def __str__(self): return ugettext( @@ -629,12 +625,14 @@ class Build(models.Model): Project, verbose_name=_('Project'), related_name='builds', + on_delete=models.CASCADE, ) version = models.ForeignKey( Version, verbose_name=_('Version'), null=True, related_name='builds', + on_delete=models.CASCADE, ) type = models.CharField( _('Type'), @@ -924,6 +922,7 @@ class BuildCommandResult(BuildCommandResultMixin, models.Model): Build, verbose_name=_('Build'), related_name='commands', + on_delete=models.CASCADE, ) command = models.TextField(_('Command')) diff --git a/readthedocs/builds/views.py b/readthedocs/builds/views.py index 53fa878aacd..85bc3a84dbe 100644 --- a/readthedocs/builds/views.py +++ b/readthedocs/builds/views.py @@ -87,8 +87,8 @@ def _get_versions(self, project): class BuildList(BuildBase, BuildTriggerMixin, ListView): - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) + def get_context_data(self, *, object_list=None, **kwargs): + context = super().get_context_data(object_list=object_list, **kwargs) active_builds = self.get_queryset().exclude( state='finished', diff --git a/readthedocs/core/migrations/0001_initial.py b/readthedocs/core/migrations/0001_initial.py index bb5bde04285..a97ef95762a 100644 --- a/readthedocs/core/migrations/0001_initial.py +++ b/readthedocs/core/migrations/0001_initial.py @@ -17,7 +17,7 @@ class Migration(migrations.Migration): ('whitelisted', models.BooleanField(default=False, verbose_name='Whitelisted')), ('homepage', models.CharField(max_length=100, verbose_name='Homepage', blank=True)), ('allow_email', models.BooleanField(default=True, help_text='Show your email on VCS contributions.', verbose_name='Allow email')), - ('user', models.ForeignKey(related_name='profile', verbose_name='User', to=settings.AUTH_USER_MODEL, unique=True)), + ('user', models.ForeignKey(related_name='profile', verbose_name='User', to=settings.AUTH_USER_MODEL, unique=True, on_delete=models.CASCADE)), ], ), ] diff --git a/readthedocs/core/migrations/0002_make_userprofile_user_a_onetoonefield.py b/readthedocs/core/migrations/0002_make_userprofile_user_a_onetoonefield.py index 5f7d04ff910..853624c76c8 100644 --- a/readthedocs/core/migrations/0002_make_userprofile_user_a_onetoonefield.py +++ b/readthedocs/core/migrations/0002_make_userprofile_user_a_onetoonefield.py @@ -13,6 +13,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='userprofile', name='user', - field=models.OneToOneField(related_name='profile', verbose_name='User', to=settings.AUTH_USER_MODEL), + field=models.OneToOneField(related_name='profile', verbose_name='User', to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE), ), ] diff --git a/readthedocs/core/models.py b/readthedocs/core/models.py index 3fab8570b45..433e694202d 100644 --- a/readthedocs/core/models.py +++ b/readthedocs/core/models.py @@ -21,6 +21,7 @@ class UserProfile(models.Model): 'auth.User', verbose_name=_('User'), related_name='profile', + on_delete=models.CASCADE, ) whitelisted = models.BooleanField(_('Whitelisted'), default=False) banned = models.BooleanField(_('Banned'), default=False) diff --git a/readthedocs/gold/migrations/0001_initial.py b/readthedocs/gold/migrations/0001_initial.py index 80a61461da8..3ac4542f0c7 100644 --- a/readthedocs/gold/migrations/0001_initial.py +++ b/readthedocs/gold/migrations/0001_initial.py @@ -22,7 +22,7 @@ class Migration(migrations.Migration): ('stripe_id', models.CharField(max_length=255)), ('subscribed', models.BooleanField(default=False)), ('projects', models.ManyToManyField(related_name='gold_owners', verbose_name='Projects', to='projects.Project')), - ('user', models.ForeignKey(related_name='gold', verbose_name='User', to=settings.AUTH_USER_MODEL, unique=True)), + ('user', models.ForeignKey(related_name='gold', verbose_name='User', to=settings.AUTH_USER_MODEL, unique=True, on_delete=models.CASCADE)), ], ), ] diff --git a/readthedocs/gold/models.py b/readthedocs/gold/models.py index b30a8a2b8f7..bd18babe0fe 100644 --- a/readthedocs/gold/models.py +++ b/readthedocs/gold/models.py @@ -35,6 +35,7 @@ class GoldUser(models.Model): verbose_name=_('User'), unique=True, related_name='gold', + on_delete=models.CASCADE, ) level = models.CharField( _('Level'), diff --git a/readthedocs/integrations/models.py b/readthedocs/integrations/models.py index af21354c913..f8daf557385 100644 --- a/readthedocs/integrations/models.py +++ b/readthedocs/integrations/models.py @@ -246,7 +246,11 @@ class Integration(models.Model): INTEGRATIONS = WEBHOOK_INTEGRATIONS - project = models.ForeignKey(Project, related_name='integrations') + project = models.ForeignKey( + Project, + related_name='integrations', + on_delete=models.CASCADE, + ) integration_type = models.CharField( _('Integration type'), max_length=32, diff --git a/readthedocs/oauth/migrations/0001_initial.py b/readthedocs/oauth/migrations/0001_initial.py index 3b3c4b1547b..2c7fba81b48 100644 --- a/readthedocs/oauth/migrations/0001_initial.py +++ b/readthedocs/oauth/migrations/0001_initial.py @@ -71,14 +71,14 @@ class Migration(migrations.Migration): ('html_url', models.URLField(null=True, verbose_name='HTML URL', blank=True)), ('active', models.BooleanField(default=False, verbose_name='Active')), ('json', models.TextField(verbose_name=b'JSON')), - ('organization', models.ForeignKey(related_name='projects', verbose_name='Organization', blank=True, to='oauth.GithubOrganization', null=True)), + ('organization', models.ForeignKey(related_name='projects', verbose_name='Organization', blank=True, to='oauth.GithubOrganization', null=True, on_delete=models.CASCADE)), ('users', models.ManyToManyField(related_name='github_projects', verbose_name='Users', to=settings.AUTH_USER_MODEL)), ], ), migrations.AddField( model_name='bitbucketproject', name='organization', - field=models.ForeignKey(related_name='projects', verbose_name='Organization', blank=True, to='oauth.BitbucketTeam', null=True), + field=models.ForeignKey(related_name='projects', verbose_name='Organization', blank=True, to='oauth.BitbucketTeam', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='bitbucketproject', diff --git a/readthedocs/oauth/migrations/0002_combine_services.py b/readthedocs/oauth/migrations/0002_combine_services.py index 1290dc5d95e..57980a5bc62 100644 --- a/readthedocs/oauth/migrations/0002_combine_services.py +++ b/readthedocs/oauth/migrations/0002_combine_services.py @@ -48,7 +48,7 @@ class Migration(migrations.Migration): ('vcs', models.CharField(blank=True, max_length=200, verbose_name='vcs', choices=[(b'git', 'Git'), (b'svn', 'Subversion'), (b'hg', 'Mercurial'), (b'bzr', 'Bazaar')])), ('source', models.CharField(max_length=16, verbose_name='Repository source', choices=[(b'github', 'GitHub'), (b'bitbucket', 'Bitbucket')])), ('json', models.TextField(verbose_name='Serialized API response')), - ('organization', models.ForeignKey(related_name='repositories', verbose_name='Organization', blank=True, to='oauth.RemoteOrganization', null=True)), + ('organization', models.ForeignKey(related_name='repositories', verbose_name='Organization', blank=True, to='oauth.RemoteOrganization', null=True, on_delete=models.CASCADE)), ('users', models.ManyToManyField(related_name='oauth_repositories', verbose_name='Users', to=settings.AUTH_USER_MODEL)), ], options={ diff --git a/readthedocs/oauth/migrations/0005_add_account_relation.py b/readthedocs/oauth/migrations/0005_add_account_relation.py index c8c466db37f..162f105a788 100644 --- a/readthedocs/oauth/migrations/0005_add_account_relation.py +++ b/readthedocs/oauth/migrations/0005_add_account_relation.py @@ -13,11 +13,11 @@ class Migration(migrations.Migration): migrations.AddField( model_name='remoteorganization', name='account', - field=models.ForeignKey(related_name='remote_organizations', verbose_name='Connected account', blank=True, to='socialaccount.SocialAccount', null=True), + field=models.ForeignKey(related_name='remote_organizations', verbose_name='Connected account', blank=True, to='socialaccount.SocialAccount', null=True, on_delete=models.CASCADE), ), migrations.AddField( model_name='remoterepository', name='account', - field=models.ForeignKey(related_name='remote_repositories', verbose_name='Connected account', blank=True, to='socialaccount.SocialAccount', null=True), + field=models.ForeignKey(related_name='remote_repositories', verbose_name='Connected account', blank=True, to='socialaccount.SocialAccount', null=True, on_delete=models.CASCADE), ), ] diff --git a/readthedocs/oauth/models.py b/readthedocs/oauth/models.py index 3dc70b23609..7b07fc93c64 100644 --- a/readthedocs/oauth/models.py +++ b/readthedocs/oauth/models.py @@ -41,6 +41,7 @@ class RemoteOrganization(models.Model): related_name='remote_organizations', null=True, blank=True, + on_delete=models.CASCADE, ) active = models.BooleanField(_('Active'), default=False) @@ -96,6 +97,7 @@ class RemoteRepository(models.Model): related_name='remote_repositories', null=True, blank=True, + on_delete=models.CASCADE, ) organization = models.ForeignKey( RemoteOrganization, @@ -103,6 +105,7 @@ class RemoteRepository(models.Model): related_name='repositories', null=True, blank=True, + on_delete=models.CASCADE, ) active = models.BooleanField(_('Active'), default=False) diff --git a/readthedocs/projects/migrations/0001_initial.py b/readthedocs/projects/migrations/0001_initial.py index 00d2a7915b0..fc7dfb319de 100644 --- a/readthedocs/projects/migrations/0001_initial.py +++ b/readthedocs/projects/migrations/0001_initial.py @@ -65,19 +65,18 @@ class Migration(migrations.Migration): ('num_major', models.IntegerField(default=2, blank=True, help_text='2 means supporting 3.X.X and 2.X.X, but not 1.X.X', null=True, verbose_name='Number of Major versions')), ('num_minor', models.IntegerField(default=2, blank=True, help_text='2 means supporting 2.2.X and 2.1.X, but not 2.0.X', null=True, verbose_name='Number of Minor versions')), ('num_point', models.IntegerField(default=2, blank=True, help_text='2 means supporting 2.2.2 and 2.2.1, but not 2.2.0', null=True, verbose_name='Number of Point versions')), - ('main_language_project', models.ForeignKey(related_name='translations', blank=True, to='projects.Project', null=True)), + ('main_language_project', models.ForeignKey(related_name='translations', blank=True, to='projects.Project', null=True, on_delete=models.CASCADE)), ], options={ 'ordering': ('slug',), - 'permissions': (('view_project', 'View Project'),), }, ), migrations.CreateModel( name='ProjectRelationship', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('child', models.ForeignKey(related_name='superprojects', verbose_name='Child', to='projects.Project')), - ('parent', models.ForeignKey(related_name='subprojects', verbose_name='Parent', to='projects.Project')), + ('child', models.ForeignKey(related_name='superprojects', verbose_name='Child', to='projects.Project', on_delete=models.CASCADE)), + ('parent', models.ForeignKey(related_name='subprojects', verbose_name='Parent', to='projects.Project', on_delete=models.CASCADE)), ], ), migrations.CreateModel( @@ -85,7 +84,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('url', models.URLField(help_text='URL to send the webhook to', blank=True)), - ('project', models.ForeignKey(related_name='webhook_notifications', to='projects.Project')), + ('project', models.ForeignKey(related_name='webhook_notifications', to='projects.Project', on_delete=models.CASCADE)), ], options={ 'abstract': False, @@ -109,6 +108,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='emailhook', name='project', - field=models.ForeignKey(related_name='emailhook_notifications', to='projects.Project'), + field=models.ForeignKey(related_name='emailhook_notifications', to='projects.Project', on_delete=models.CASCADE), ), ] diff --git a/readthedocs/projects/migrations/0002_add_importedfile_model.py b/readthedocs/projects/migrations/0002_add_importedfile_model.py index cfa6f3b9e63..6a206f7dc4b 100644 --- a/readthedocs/projects/migrations/0002_add_importedfile_model.py +++ b/readthedocs/projects/migrations/0002_add_importedfile_model.py @@ -19,8 +19,8 @@ class Migration(migrations.Migration): ('path', models.CharField(max_length=255, verbose_name='Path')), ('md5', models.CharField(max_length=255, verbose_name='MD5 checksum')), ('commit', models.CharField(max_length=255, verbose_name='Commit')), - ('project', models.ForeignKey(related_name='imported_files', verbose_name='Project', to='projects.Project')), - ('version', models.ForeignKey(related_name='imported_files', verbose_name='Version', to='builds.Version', null=True)), + ('project', models.ForeignKey(related_name='imported_files', verbose_name='Project', to='projects.Project', on_delete=models.CASCADE)), + ('version', models.ForeignKey(related_name='imported_files', verbose_name='Version', to='builds.Version', null=True, on_delete=models.CASCADE)), ], ), ] diff --git a/readthedocs/projects/migrations/0006_add_domain_models.py b/readthedocs/projects/migrations/0006_add_domain_models.py index e50617a6931..dcd3282ab7d 100644 --- a/readthedocs/projects/migrations/0006_add_domain_models.py +++ b/readthedocs/projects/migrations/0006_add_domain_models.py @@ -18,7 +18,7 @@ class Migration(migrations.Migration): ('cname', models.BooleanField(default=False, help_text='This URL is a CNAME for the project')), ('canonical', models.BooleanField(default=False, help_text='This URL is the primary one where the documentation is served from.')), ('count', models.IntegerField(default=0, help_text='Number of times this domain has been hit.')), - ('project', models.ForeignKey(related_name='domains', to='projects.Project')), + ('project', models.ForeignKey(related_name='domains', to='projects.Project', on_delete=models.CASCADE)), ], options={ 'ordering': ('-canonical', '-machine', 'url'), diff --git a/readthedocs/projects/models.py b/readthedocs/projects/models.py index 04c65c9ed8f..a6a66ea81bc 100644 --- a/readthedocs/projects/models.py +++ b/readthedocs/projects/models.py @@ -67,11 +67,13 @@ class ProjectRelationship(models.Model): 'Project', verbose_name=_('Parent'), related_name='subprojects', + on_delete=models.CASCADE, ) child = models.ForeignKey( 'Project', verbose_name=_('Child'), related_name='superprojects', + on_delete=models.CASCADE, ) alias = models.SlugField( _('Alias'), @@ -404,11 +406,6 @@ class Project(models.Model): class Meta: ordering = ('slug',) - permissions = ( - # Translators: Permission around whether a user can view the - # project - ('view_project', _('View Project')), - ) def __str__(self): return self.name @@ -1281,12 +1278,14 @@ class ImportedFile(models.Model): 'Project', verbose_name=_('Project'), related_name='imported_files', + on_delete=models.CASCADE, ) version = models.ForeignKey( 'builds.Version', verbose_name=_('Version'), related_name='imported_files', null=True, + on_delete=models.CASCADE, ) name = models.CharField(_('Name'), max_length=255) slug = models.SlugField(_('Slug')) @@ -1376,7 +1375,11 @@ def processed_json(self): class Notification(models.Model): - project = models.ForeignKey(Project, related_name='%(class)s_notifications') + project = models.ForeignKey( + Project, + related_name='%(class)s_notifications', + on_delete=models.CASCADE, + ) objects = RelatedProjectQuerySet.as_manager() class Meta: @@ -1405,7 +1408,11 @@ class Domain(models.Model): """A custom domain name for a project.""" - project = models.ForeignKey(Project, related_name='domains') + project = models.ForeignKey( + Project, + related_name='domains', + on_delete=models.CASCADE, + ) domain = models.CharField( _('Domain'), unique=True, diff --git a/readthedocs/projects/views/private.py b/readthedocs/projects/views/private.py index eb12c0aa150..44b72ad606c 100644 --- a/readthedocs/projects/views/private.py +++ b/readthedocs/projects/views/private.py @@ -115,8 +115,8 @@ def get(self, request, *args, **kwargs): self.validate_primary_email(request.user) return super(ProjectDashboard, self).get(self, request, *args, **kwargs) - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) + def get_context_data(self, *, object_list=None, **kwargs): + context = super().get_context_data(object_list=object_list, **kwargs) return context diff --git a/readthedocs/projects/views/public.py b/readthedocs/projects/views/public.py index aa994d12dcd..b5928a1ed99 100644 --- a/readthedocs/projects/views/public.py +++ b/readthedocs/projects/views/public.py @@ -60,8 +60,8 @@ def get_queryset(self): return queryset - def get_context_data(self, **kwargs): - context = super().get_context_data(**kwargs) + def get_context_data(self, *, object_list=None, **kwargs): + context = super().get_context_data(object_list=object_list, **kwargs) context['tag'] = self.tag return context diff --git a/readthedocs/proxito/tests/handler_404_urls.py b/readthedocs/proxito/tests/handler_404_urls.py index 5f11ad0c38d..c918a709394 100644 --- a/readthedocs/proxito/tests/handler_404_urls.py +++ b/readthedocs/proxito/tests/handler_404_urls.py @@ -21,7 +21,7 @@ def map_proxito_path(view_func): @wraps(view_func) - def inner_view(request, *args, **kwargs): + def inner_view(request, exception, *args, **kwargs): return view_func( request, *args, diff --git a/readthedocs/proxito/tests/test_urls.py b/readthedocs/proxito/tests/test_urls.py index 052e4d6aa87..26b235ce5e4 100644 --- a/readthedocs/proxito/tests/test_urls.py +++ b/readthedocs/proxito/tests/test_urls.py @@ -3,7 +3,7 @@ # -*- coding: utf-8 -*- """Test URL config.""" -from django.core.urlresolvers import resolve +from django.urls import resolve from django.test import TestCase, override_settings diff --git a/readthedocs/redirects/migrations/0001_initial.py b/readthedocs/redirects/migrations/0001_initial.py index 0bb2fb946eb..b7d42bb9bf7 100644 --- a/readthedocs/redirects/migrations/0001_initial.py +++ b/readthedocs/redirects/migrations/0001_initial.py @@ -20,7 +20,7 @@ class Migration(migrations.Migration): ('status', models.BooleanField(default=True, choices=[(True, 'Active'), (False, 'Inactive')])), ('create_dt', models.DateTimeField(auto_now_add=True)), ('update_dt', models.DateTimeField(auto_now=True)), - ('project', models.ForeignKey(related_name='redirects', verbose_name='Project', to='projects.Project')), + ('project', models.ForeignKey(related_name='redirects', verbose_name='Project', to='projects.Project', on_delete=models.CASCADE)), ], options={ 'ordering': ('-update_dt',), diff --git a/readthedocs/redirects/models.py b/readthedocs/redirects/models.py index bd0673b733e..57990ee1772 100644 --- a/readthedocs/redirects/models.py +++ b/readthedocs/redirects/models.py @@ -59,6 +59,7 @@ class Redirect(models.Model): Project, verbose_name=_('Project'), related_name='redirects', + on_delete=models.CASCADE, ) redirect_type = models.CharField( diff --git a/readthedocs/rtd_tests/tests/test_builds.py b/readthedocs/rtd_tests/tests/test_builds.py index fe9de763887..118d322a3f3 100644 --- a/readthedocs/rtd_tests/tests/test_builds.py +++ b/readthedocs/rtd_tests/tests/test_builds.py @@ -380,10 +380,10 @@ def test_get_env_vars(self): class BuildModelTests(TestCase): - fixtures = ['test_data'] + fixtures = ['test_data', 'eric'] def setUp(self): - self.eric = User(username='eric') + self.eric = User.objects.get(username='eric') self.eric.set_password('test') self.eric.save() diff --git a/readthedocs/rtd_tests/tests/test_doc_builder.py b/readthedocs/rtd_tests/tests/test_doc_builder.py index 9cae164007d..da7ce55df51 100644 --- a/readthedocs/rtd_tests/tests/test_doc_builder.py +++ b/readthedocs/rtd_tests/tests/test_doc_builder.py @@ -23,7 +23,7 @@ class SphinxBuilderTest(TestCase): - fixtures = ['test_data'] + fixtures = ['test_data', 'eric'] def setUp(self): self.project = Project.objects.get(slug='pip') diff --git a/readthedocs/rtd_tests/tests/test_doc_building.py b/readthedocs/rtd_tests/tests/test_doc_building.py index 974bb447116..9b73f123bcf 100644 --- a/readthedocs/rtd_tests/tests/test_doc_building.py +++ b/readthedocs/rtd_tests/tests/test_doc_building.py @@ -45,7 +45,7 @@ class TestLocalBuildEnvironment(TestCase): """Test execution and exception handling in environment.""" - fixtures = ['test_data'] + fixtures = ['test_data', 'eric'] def setUp(self): self.project = Project.objects.get(slug='pip') @@ -363,7 +363,7 @@ class TestDockerBuildEnvironment(TestCase): """Test docker build environment.""" - fixtures = ['test_data'] + fixtures = ['test_data', 'eric'] def setUp(self): self.project = Project.objects.get(slug='pip') @@ -1448,7 +1448,7 @@ def test_install_user_requirements_conda(self, checkout_path): class AutoWipeEnvironmentBase: - fixtures = ['test_data'] + fixtures = ['test_data', 'eric'] build_env_class = None def setUp(self): diff --git a/readthedocs/rtd_tests/tests/test_footer.py b/readthedocs/rtd_tests/tests/test_footer.py index cae4c93aa65..f07e6a84946 100644 --- a/readthedocs/rtd_tests/tests/test_footer.py +++ b/readthedocs/rtd_tests/tests/test_footer.py @@ -148,7 +148,8 @@ def test_not_show_edit_on_github(self): PUBLIC_DOMAIN_USES_HTTPS=True, ) class TestVersionCompareFooter(TestCase): - fixtures = ['test_data'] + + fixtures = ['test_data', 'eric'] def setUp(self): self.pip = Project.objects.get(slug='pip') @@ -267,7 +268,7 @@ def test_highest_version_without_tags(self): class TestFooterPerformance(APITestCase): - fixtures = ['test_data'] + fixtures = ['test_data', 'eric'] url = '/api/v2/footer_html/?project=pip&version=latest&page=index&docroot=/' factory = APIRequestFactory() diff --git a/readthedocs/rtd_tests/tests/test_managers.py b/readthedocs/rtd_tests/tests/test_managers.py index 381c359ef1e..76b75d11ece 100644 --- a/readthedocs/rtd_tests/tests/test_managers.py +++ b/readthedocs/rtd_tests/tests/test_managers.py @@ -347,7 +347,7 @@ def test_api_user(self): class TestHTMLFileManager(TestCase): - fixtures = ['test_data'] + fixtures = ['test_data', 'eric'] def setUp(self): self.user = User.objects.create(username='test_user', password='test') diff --git a/readthedocs/rtd_tests/tests/test_project.py b/readthedocs/rtd_tests/tests/test_project.py index f4aa5b0a3b1..e30f54237a3 100644 --- a/readthedocs/rtd_tests/tests/test_project.py +++ b/readthedocs/rtd_tests/tests/test_project.py @@ -452,6 +452,10 @@ def test_user_cant_change_lang_to_translation_lang(self): self.assertEqual(project_a.language, 'en') self.assertEqual(project_b.language, 'es') data = model_to_dict(project_a) + + # Remove None values from data + data = {k: v for k, v in data.items() if v is not None} + data['language'] = 'es' resp = self.client.post( reverse( @@ -485,6 +489,10 @@ def test_user_can_change_project_with_same_lang(self): self.assertEqual(project_a.language, 'en') self.assertEqual(project_b.language, 'es') data = model_to_dict(project_a) + + # Remove None values from data + data = {k: v for k, v in data.items() if v is not None} + # Same language data['language'] = 'en' resp = self.client.post( diff --git a/readthedocs/rtd_tests/tests/test_project_symlinks.py b/readthedocs/rtd_tests/tests/test_project_symlinks.py index 2316522e4cf..c3efb16b191 100644 --- a/readthedocs/rtd_tests/tests/test_project_symlinks.py +++ b/readthedocs/rtd_tests/tests/test_project_symlinks.py @@ -832,7 +832,7 @@ def test_symlink_single_version(self): self.assertFilesystem(filesystem) def test_symlink_single_version_missing(self): - self.project.versions = [] + self.project.versions.set([]) self.project.save() self.symlink = self.symlink_class(self.project) self.symlink.symlink_single_version() diff --git a/readthedocs/search/tests/test_api.py b/readthedocs/search/tests/test_api.py index f0cb4633671..4bf44d48d80 100644 --- a/readthedocs/search/tests/test_api.py +++ b/readthedocs/search/tests/test_api.py @@ -1,7 +1,7 @@ import re import pytest -from django.core.urlresolvers import reverse +from django.urls import reverse from django_dynamic_fixture import G from readthedocs.builds.models import Version diff --git a/readthedocs/search/tests/test_views.py b/readthedocs/search/tests/test_views.py index ed376855560..18312768b27 100644 --- a/readthedocs/search/tests/test_views.py +++ b/readthedocs/search/tests/test_views.py @@ -3,7 +3,7 @@ import re import pytest -from django.core.urlresolvers import reverse +from django.urls import reverse from django_dynamic_fixture import G from readthedocs.builds.constants import LATEST diff --git a/readthedocs/sphinx_domains/models.py b/readthedocs/sphinx_domains/models.py index 268ee366638..35e1cf71d6a 100644 --- a/readthedocs/sphinx_domains/models.py +++ b/readthedocs/sphinx_domains/models.py @@ -26,16 +26,19 @@ class SphinxDomain(TimeStampedModel): project = models.ForeignKey( Project, related_name='sphinx_domains', + on_delete=models.CASCADE, ) version = models.ForeignKey( Version, verbose_name=_('Version'), related_name='sphinx_domains', + on_delete=models.CASCADE, ) html_file = models.ForeignKey( HTMLFile, related_name='sphinx_domains', null=True, + on_delete=models.CASCADE, ) commit = models.CharField(_('Commit'), max_length=255, null=True) build = models.IntegerField(_('Build id'), null=True) diff --git a/requirements/pip.txt b/requirements/pip.txt index 5fbdf4df8ef..27802ba17a5 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -3,7 +3,7 @@ pip==19.3.1 appdirs==1.4.3 virtualenv==16.7.7 -django==1.11.28 # pyup: <1.12 +django==2.2.10 # pyup: <2.3 django-extensions==2.2.5 django_polymorphic==2.1.2