diff --git a/readthedocs/builds/migrations/0047_build_default_triggered.py b/readthedocs/builds/migrations/0047_build_default_triggered.py new file mode 100644 index 00000000000..83bd7e1429e --- /dev/null +++ b/readthedocs/builds/migrations/0047_build_default_triggered.py @@ -0,0 +1,32 @@ +# Generated by Django 3.2.16 on 2023-01-26 23:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("builds", "0046_identifier_null"), + ] + + operations = [ + migrations.AlterField( + model_name="build", + name="state", + field=models.CharField( + choices=[ + ("triggered", "Triggered"), + ("cloning", "Cloning"), + ("installing", "Installing"), + ("building", "Building"), + ("uploading", "Uploading"), + ("finished", "Finished"), + ("cancelled", "Cancelled"), + ], + db_index=True, + default="triggered", + max_length=55, + verbose_name="State", + ), + ), + ] diff --git a/readthedocs/builds/models.py b/readthedocs/builds/models.py index 9652de04249..86af1ba9c14 100644 --- a/readthedocs/builds/models.py +++ b/readthedocs/builds/models.py @@ -290,7 +290,9 @@ def config(self): .only('_config') .first() ) - return last_build.config + if last_build: + return last_build.config + return None @property def commit_name(self): @@ -630,7 +632,7 @@ class Build(models.Model): _('State'), max_length=55, choices=BUILD_STATE, - default='finished', + default=BUILD_STATE_TRIGGERED, db_index=True, ) diff --git a/readthedocs/builds/tests/test_views.py b/readthedocs/builds/tests/test_views.py index b15399b7482..65469d0ad32 100644 --- a/readthedocs/builds/tests/test_views.py +++ b/readthedocs/builds/tests/test_views.py @@ -68,7 +68,10 @@ def test_cancel_build_from_another_project(self, app): another_user = get(User) another_project = self._get_project(owners=[another_user]) another_build = get( - Build, project=another_project, version=another_project.versions.first() + Build, + project=another_project, + version=another_project.versions.first(), + state=BUILD_STATE_INSTALLING, ) self.client.force_login(another_user) diff --git a/readthedocs/rtd_tests/tests/test_api.py b/readthedocs/rtd_tests/tests/test_api.py index 17379205894..de34a19f104 100644 --- a/readthedocs/rtd_tests/tests/test_api.py +++ b/readthedocs/rtd_tests/tests/test_api.py @@ -41,6 +41,7 @@ from readthedocs.api.v2.views.task_views import get_status_data from readthedocs.builds.constants import ( BUILD_STATE_CLONING, + BUILD_STATE_FINISHED, BUILD_STATE_TRIGGERED, EXTERNAL, EXTERNAL_VERSION_STATE_CLOSED, @@ -510,17 +511,23 @@ def test_make_build_commands(self): def test_get_raw_log_success(self): project = Project.objects.get(pk=1) version = project.versions.first() - build = get(Build, project=project, version=version, builder='foo') + build = get( + Build, + project=project, + version=version, + builder="foo", + state=BUILD_STATE_FINISHED, + ) get( BuildCommandResult, build=build, - command='python setup.py install', - output='Installing dependencies...', + command="python setup.py install", + output="Installing dependencies...", ) get( BuildCommandResult, build=build, - command='git checkout master', + command="git checkout master", output='Switched to branch "master"', ) client = APIClient() @@ -598,14 +605,19 @@ def test_get_raw_log_failure(self): project = Project.objects.get(pk=1) version = project.versions.first() build = get( - Build, project=project, version=version, - builder='foo', success=False, exit_code=1, + Build, + project=project, + version=version, + builder="foo", + success=False, + exit_code=1, + state=BUILD_STATE_FINISHED, ) get( BuildCommandResult, build=build, - command='python setup.py install', - output='Installing dependencies...', + command="python setup.py install", + output="Installing dependencies...", exit_code=1, ) get( diff --git a/readthedocs/rtd_tests/tests/test_project_views.py b/readthedocs/rtd_tests/tests/test_project_views.py index 2ec080e8a42..a9f84001b34 100644 --- a/readthedocs/rtd_tests/tests/test_project_views.py +++ b/readthedocs/rtd_tests/tests/test_project_views.py @@ -8,7 +8,7 @@ from django.views.generic.base import ContextMixin from django_dynamic_fixture import get, new -from readthedocs.builds.constants import EXTERNAL +from readthedocs.builds.constants import BUILD_STATE_FINISHED, EXTERNAL from readthedocs.builds.models import Build, Version from readthedocs.integrations.models import GenericAPIWebhook, GitHubWebhook from readthedocs.oauth.models import RemoteRepository, RemoteRepositoryRelation @@ -517,28 +517,56 @@ def test_badge_caching(self): self.assertTrue('no-cache' in res['Cache-Control']) def test_passing_badge(self): - get(Build, project=self.project, version=self.version, success=True) - res = self.client.get(self.badge_url, {'version': self.version.slug}) - self.assertContains(res, 'passing') - self.assertEqual(res['Content-Type'], 'image/svg+xml') + get( + Build, + project=self.project, + version=self.version, + success=True, + state=BUILD_STATE_FINISHED, + ) + res = self.client.get(self.badge_url, {"version": self.version.slug}) + self.assertContains(res, "passing") + self.assertEqual(res["Content-Type"], "image/svg+xml") def test_failing_badge(self): - get(Build, project=self.project, version=self.version, success=False) - res = self.client.get(self.badge_url, {'version': self.version.slug}) - self.assertContains(res, 'failing') + get( + Build, + project=self.project, + version=self.version, + success=False, + state=BUILD_STATE_FINISHED, + ) + res = self.client.get(self.badge_url, {"version": self.version.slug}) + self.assertContains(res, "failing") def test_plastic_failing_badge(self): - get(Build, project=self.project, version=self.version, success=False) - res = self.client.get(self.badge_url, {'version': self.version.slug, 'style': 'plastic'}) - self.assertContains(res, 'failing') + get( + Build, + project=self.project, + version=self.version, + success=False, + state=BUILD_STATE_FINISHED, + ) + res = self.client.get( + self.badge_url, {"version": self.version.slug, "style": "plastic"} + ) + self.assertContains(res, "failing") # The plastic badge has slightly more rounding self.assertContains(res, 'rx="4"') def test_social_passing_badge(self): - get(Build, project=self.project, version=self.version, success=True) - res = self.client.get(self.badge_url, {'version': self.version.slug, 'style': 'social'}) - self.assertContains(res, 'passing') + get( + Build, + project=self.project, + version=self.version, + success=True, + state=BUILD_STATE_FINISHED, + ) + res = self.client.get( + self.badge_url, {"version": self.version.slug, "style": "social"} + ) + self.assertContains(res, "passing") # The social badge (but not the other badges) has this element self.assertContains(res, 'rlink') @@ -556,9 +584,15 @@ def test_private_version(self): self.version.save() # Without a token, badge is unknown - get(Build, project=self.project, version=self.version, success=True) - res = self.client.get(self.badge_url, {'version': self.version.slug}) - self.assertContains(res, 'unknown') + get( + Build, + project=self.project, + version=self.version, + success=True, + state=BUILD_STATE_FINISHED, + ) + res = self.client.get(self.badge_url, {"version": self.version.slug}) + self.assertContains(res, "unknown") # With an invalid token, the badge is unknown res = self.client.get( diff --git a/readthedocs/rtd_tests/tests/test_version_config.py b/readthedocs/rtd_tests/tests/test_version_config.py index cbae0dc1d7e..015b4b3a09f 100644 --- a/readthedocs/rtd_tests/tests/test_version_config.py +++ b/readthedocs/rtd_tests/tests/test_version_config.py @@ -1,6 +1,7 @@ from django.test import TestCase from django_dynamic_fixture import get +from readthedocs.builds.constants import BUILD_STATE_BUILDING, BUILD_STATE_FINISHED from readthedocs.builds.models import Build, Version from readthedocs.projects.models import Project @@ -16,23 +17,26 @@ def test_get_correct_config(self): project=self.project, version=self.version, _config={'version': 1}, + state=BUILD_STATE_FINISHED, ) build_new = Build.objects.create( project=self.project, version=self.version, _config={'version': 2}, + state=BUILD_STATE_FINISHED, ) build_new_error = Build.objects.create( project=self.project, version=self.version, _config={'version': 3}, success=False, + state=BUILD_STATE_FINISHED, ) build_new_unfinish = Build.objects.create( project=self.project, version=self.version, _config={'version': 4}, - state='building', + state=BUILD_STATE_BUILDING, ) self.assertEqual(self.version.config, {'version': 2}) @@ -42,6 +46,7 @@ def test_get_correct_config_when_same_config(self): project=self.project, version=self.version, _config={}, + state=BUILD_STATE_FINISHED, ) build_old.config = {'version': 1} build_old.save() @@ -51,6 +56,7 @@ def test_get_correct_config_when_same_config(self): project=self.project, version=self.version, _config={}, + state=BUILD_STATE_FINISHED, ) build_new.config = {'version': 1} build_new.save() @@ -61,6 +67,7 @@ def test_get_correct_config_when_same_config(self): version=self.version, _config={}, success=False, + state=BUILD_STATE_FINISHED, ) build_new_error.config = {'version': 3} build_new_error.save() @@ -70,7 +77,7 @@ def test_get_correct_config_when_same_config(self): project=self.project, version=self.version, _config={}, - state='building', + state=BUILD_STATE_BUILDING, ) build_new_unfinish.config = {'version': 1} build_new_unfinish.save()