From eb5072633a10f9ac0a31aad4aee4eb596d7826dd Mon Sep 17 00:00:00 2001 From: SyedMa3 Date: Wed, 17 Aug 2022 23:24:18 +0530 Subject: [PATCH 01/10] added support for tags in API --- readthedocs/api/v3/serializers.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/readthedocs/api/v3/serializers.py b/readthedocs/api/v3/serializers.py index 0cd4a6b5b78..bd2c1830375 100644 --- a/readthedocs/api/v3/serializers.py +++ b/readthedocs/api/v3/serializers.py @@ -9,6 +9,7 @@ from rest_flex_fields import FlexFieldsModelSerializer from rest_flex_fields.serializers import FlexFieldsSerializerMixin from rest_framework import serializers +from taggit.serializers import (TagListSerializerField, TaggitSerializer) from readthedocs.builds.models import Build, Version from readthedocs.core.utils import slugify @@ -457,12 +458,13 @@ def get_translations(self, obj): return self._absolute_url(path) -class ProjectCreateSerializerBase(FlexFieldsModelSerializer): +class ProjectCreateSerializerBase(TaggitSerializer, FlexFieldsModelSerializer): """Serializer used to Import a Project.""" repository = RepositorySerializer(source='*') homepage = serializers.URLField(source='project_url', required=False) + tags = TagListSerializerField() class Meta: model = Project @@ -472,6 +474,11 @@ class Meta: 'programming_language', 'repository', 'homepage', + 'tags', + + # Advanced Settings -> General Settings + 'default_version', + 'default_branch', ) def _validate_remote_repository(self, data): @@ -534,7 +541,7 @@ class ProjectCreateSerializer(SettingsOverrideObject): _default_class = ProjectCreateSerializerBase -class ProjectUpdateSerializerBase(FlexFieldsModelSerializer): +class ProjectUpdateSerializerBase(TaggitSerializer, FlexFieldsModelSerializer): """Serializer used to modify a Project once imported.""" @@ -543,6 +550,7 @@ class ProjectUpdateSerializerBase(FlexFieldsModelSerializer): source='project_url', required=False, ) + tags = TagListSerializerField() class Meta: model = Project @@ -553,6 +561,7 @@ class Meta: 'language', 'programming_language', 'homepage', + 'tags', # Advanced Settings -> General Settings 'default_version', From 116cf9e7e562f1cc7e18766abab3fd0aabd07419 Mon Sep 17 00:00:00 2001 From: SyedMa3 Date: Thu, 18 Aug 2022 12:49:50 +0530 Subject: [PATCH 02/10] set tags to be not required by default --- readthedocs/api/v3/serializers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readthedocs/api/v3/serializers.py b/readthedocs/api/v3/serializers.py index bd2c1830375..01d8850b815 100644 --- a/readthedocs/api/v3/serializers.py +++ b/readthedocs/api/v3/serializers.py @@ -464,7 +464,7 @@ class ProjectCreateSerializerBase(TaggitSerializer, FlexFieldsModelSerializer): repository = RepositorySerializer(source='*') homepage = serializers.URLField(source='project_url', required=False) - tags = TagListSerializerField() + tags = TagListSerializerField(required=False) class Meta: model = Project @@ -550,7 +550,7 @@ class ProjectUpdateSerializerBase(TaggitSerializer, FlexFieldsModelSerializer): source='project_url', required=False, ) - tags = TagListSerializerField() + tags = TagListSerializerField(required=False) class Meta: model = Project From d2d2099e07bc1f05232332bf0109228f76487bf6 Mon Sep 17 00:00:00 2001 From: SyedMa3 Date: Thu, 1 Sep 2022 10:36:08 +0530 Subject: [PATCH 03/10] removed unrelated fields and updated API docs for tags --- docs/user/api/v3.rst | 10 +++++++++- readthedocs/api/v3/serializers.py | 7 +------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/user/api/v3.rst b/docs/user/api/v3.rst index 4d05c4a0a4b..aef838d4259 100644 --- a/docs/user/api/v3.rst +++ b/docs/user/api/v3.rst @@ -347,7 +347,11 @@ Project create }, "homepage": "http://template.readthedocs.io/", "programming_language": "py", - "language": "es" + "language": "es", + "tags": [ + "generic tag", + "test tag" + ] } **Example response**: @@ -413,6 +417,10 @@ Project update "language": "ja", "programming_language": "py", "homepage": "https://readthedocs.org/", + "tags" : [ + "new tag", + "updated tag" + ] "default_version": "v0.27.0", "default_branch": "develop", "analytics_code": "UA000000", diff --git a/readthedocs/api/v3/serializers.py b/readthedocs/api/v3/serializers.py index 01d8850b815..f00e01673f7 100644 --- a/readthedocs/api/v3/serializers.py +++ b/readthedocs/api/v3/serializers.py @@ -9,7 +9,7 @@ from rest_flex_fields import FlexFieldsModelSerializer from rest_flex_fields.serializers import FlexFieldsSerializerMixin from rest_framework import serializers -from taggit.serializers import (TagListSerializerField, TaggitSerializer) +from taggit.serializers import TaggitSerializer, TagListSerializerField from readthedocs.builds.models import Build, Version from readthedocs.core.utils import slugify @@ -475,10 +475,6 @@ class Meta: 'repository', 'homepage', 'tags', - - # Advanced Settings -> General Settings - 'default_version', - 'default_branch', ) def _validate_remote_repository(self, data): @@ -492,7 +488,6 @@ def _validate_remote_repository(self, data): If we cannot ensure the relationship here, this method should raise a `ValidationError`. """ - pass def validate_name(self, value): potential_slug = slugify(value) From 64c02fa7a687ffae33c5d3043354e9ea8bb76221 Mon Sep 17 00:00:00 2001 From: SyedMa3 Date: Thu, 1 Sep 2022 10:39:30 +0530 Subject: [PATCH 04/10] pre-commit linting --- readthedocs/api/v3/serializers.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/readthedocs/api/v3/serializers.py b/readthedocs/api/v3/serializers.py index f00e01673f7..68133ba03c3 100644 --- a/readthedocs/api/v3/serializers.py +++ b/readthedocs/api/v3/serializers.py @@ -469,12 +469,12 @@ class ProjectCreateSerializerBase(TaggitSerializer, FlexFieldsModelSerializer): class Meta: model = Project fields = ( - 'name', - 'language', - 'programming_language', - 'repository', - 'homepage', - 'tags', + "name", + "language", + "programming_language", + "repository", + "homepage", + "tags", ) def _validate_remote_repository(self, data): @@ -551,13 +551,12 @@ class Meta: model = Project fields = ( # Settings - 'name', - 'repository', - 'language', - 'programming_language', - 'homepage', - 'tags', - + "name", + "repository", + "language", + "programming_language", + "homepage", + "tags", # Advanced Settings -> General Settings 'default_version', 'default_branch', From b621fcbd39b40d179cb622258f7f1d4bb9d9208b Mon Sep 17 00:00:00 2001 From: SyedMa3 Date: Thu, 1 Sep 2022 21:29:39 +0530 Subject: [PATCH 05/10] pre-commit linter --- readthedocs/api/v3/tests/test_projects.py | 76 +++++++++++++---------- 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/readthedocs/api/v3/tests/test_projects.py b/readthedocs/api/v3/tests/test_projects.py index 19b27e83e16..c6fa515478f 100644 --- a/readthedocs/api/v3/tests/test_projects.py +++ b/readthedocs/api/v3/tests/test_projects.py @@ -3,8 +3,8 @@ import django_dynamic_fixture as fixture from django.urls import reverse -from readthedocs.projects.models import Project from readthedocs.oauth.models import RemoteRepository +from readthedocs.projects.models import Project from .mixins import APIEndpointMixin @@ -118,8 +118,9 @@ def test_import_project(self): 'url': 'https://github.com/rtfd/template', 'type': 'git', }, - 'homepage': 'http://template.readthedocs.io/', - 'programming_language': 'py', + "homepage": "http://template.readthedocs.io/", + "programming_language": "py", + "tags": ["test tag", "template tag"], } self.client.credentials(HTTP_AUTHORIZATION=f'Token {self.token.key}') @@ -131,12 +132,13 @@ def test_import_project(self): project = query.first() self.assertIsNone(project.remote_repository) - self.assertEqual(project.name, 'Test Project') - self.assertEqual(project.slug, 'test-project') - self.assertEqual(project.repo, 'https://github.com/rtfd/template') - self.assertEqual(project.language, 'en') - self.assertEqual(project.programming_language, 'py') - self.assertEqual(project.project_url, 'http://template.readthedocs.io/') + self.assertEqual(project.name, "Test Project") + self.assertEqual(project.slug, "test-project") + self.assertEqual(project.repo, "https://github.com/rtfd/template") + self.assertEqual(project.language, "en") + self.assertEqual(project.programming_language, "py") + self.assertEqual(project.project_url, "http://template.readthedocs.io/") + self.assertEqual(project.tags, ["test tag", "template tag"]) self.assertIn(self.me, project.users.all()) self.assertEqual(project.builds.count(), 1) @@ -243,15 +245,16 @@ def test_update_project(self): 'url': 'https://bitbucket.com/rtfd/updated-repository', 'type': 'hg', }, - 'language': 'es', - 'programming_language': 'js', - 'homepage': 'https://updated-homepage.org', - 'default_version': 'stable', - 'default_branch': 'updated-default-branch', - 'analytics_code': 'UA-XXXXXX', - 'show_version_warning': False, - 'single_version': True, - "external_builds_enabled": True + "language": "es", + "programming_language": "js", + "homepage": "https://updated-homepage.org", + "tags": ["updated tag", "test tag"], + "default_version": "stable", + "default_branch": "updated-default-branch", + "analytics_code": "UA-XXXXXX", + "show_version_warning": False, + "single_version": True, + "external_builds_enabled": True, } self.client.credentials(HTTP_AUTHORIZATION=f'Token {self.token.key}') @@ -267,16 +270,19 @@ def test_update_project(self): self.assertEqual(response.status_code, 204) self.project.refresh_from_db() - self.assertEqual(self.project.name, 'Updated name') - self.assertEqual(self.project.slug, 'project') - self.assertEqual(self.project.repo, 'https://bitbucket.com/rtfd/updated-repository') - self.assertEqual(self.project.repo_type, 'hg') - self.assertEqual(self.project.language, 'es') - self.assertEqual(self.project.programming_language, 'js') - self.assertEqual(self.project.project_url, 'https://updated-homepage.org') - self.assertEqual(self.project.default_version, 'stable') - self.assertEqual(self.project.default_branch, 'updated-default-branch') - self.assertEqual(self.project.analytics_code, 'UA-XXXXXX') + self.assertEqual(self.project.name, "Updated name") + self.assertEqual(self.project.slug, "project") + self.assertEqual( + self.project.repo, "https://bitbucket.com/rtfd/updated-repository" + ) + self.assertEqual(self.project.repo_type, "hg") + self.assertEqual(self.project.language, "es") + self.assertEqual(self.project.programming_language, "js") + self.assertEqual(self.project.project_url, "https://updated-homepage.org") + self.assertEqual(self.project.tags, ["updated tag", "test tag"]) + self.assertEqual(self.project.default_version, "stable") + self.assertEqual(self.project.default_branch, "updated-default-branch") + self.assertEqual(self.project.analytics_code, "UA-XXXXXX") self.assertEqual(self.project.show_version_warning, False) self.assertEqual(self.project.single_version, True) self.assertEqual(self.project.external_builds_enabled, True) @@ -287,7 +293,8 @@ def test_partial_update_project(self): 'repository': { 'url': 'https://github.com/rtfd/updated-repository', }, - 'default_branch': 'updated-default-branch', + "default_branch": "updated-default-branch", + "tags": ["partial tags", "updated"], } self.client.credentials(HTTP_AUTHORIZATION=f'Token {self.token.key}') @@ -303,10 +310,13 @@ def test_partial_update_project(self): self.assertEqual(response.status_code, 204) self.project.refresh_from_db() - self.assertEqual(self.project.name, 'Updated name') - self.assertEqual(self.project.slug, 'project') - self.assertEqual(self.project.repo, 'https://github.com/rtfd/updated-repository') - self.assertNotEqual(self.project.default_version, 'updated-default-branch') + self.assertEqual(self.project.name, "Updated name") + self.assertEqual(self.project.slug, "project") + self.assertEqual( + self.project.repo, "https://github.com/rtfd/updated-repository" + ) + self.assertEqual(self.project.tags, ["partial tags", "updated"]) + self.assertNotEqual(self.project.default_version, "updated-default-branch") def test_partial_update_others_project(self): data = { From 3d15e8c35369b7a1bb17a227939d118e19cbff24 Mon Sep 17 00:00:00 2001 From: SyedMa3 Date: Sun, 4 Sep 2022 10:53:42 +0530 Subject: [PATCH 06/10] modified tag assretions --- readthedocs/api/v3/tests/test_projects.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/readthedocs/api/v3/tests/test_projects.py b/readthedocs/api/v3/tests/test_projects.py index c6fa515478f..9bea87fc407 100644 --- a/readthedocs/api/v3/tests/test_projects.py +++ b/readthedocs/api/v3/tests/test_projects.py @@ -138,7 +138,7 @@ def test_import_project(self): self.assertEqual(project.language, "en") self.assertEqual(project.programming_language, "py") self.assertEqual(project.project_url, "http://template.readthedocs.io/") - self.assertEqual(project.tags, ["test tag", "template tag"]) + self.assertEqual(list(project.tags.names()), ["template tag", "test tag"]) self.assertIn(self.me, project.users.all()) self.assertEqual(project.builds.count(), 1) @@ -279,7 +279,7 @@ def test_update_project(self): self.assertEqual(self.project.language, "es") self.assertEqual(self.project.programming_language, "js") self.assertEqual(self.project.project_url, "https://updated-homepage.org") - self.assertEqual(self.project.tags, ["updated tag", "test tag"]) + self.assertEqual(list(self.project.tags.names()), ["test tag", "updated tag"]) self.assertEqual(self.project.default_version, "stable") self.assertEqual(self.project.default_branch, "updated-default-branch") self.assertEqual(self.project.analytics_code, "UA-XXXXXX") @@ -315,7 +315,7 @@ def test_partial_update_project(self): self.assertEqual( self.project.repo, "https://github.com/rtfd/updated-repository" ) - self.assertEqual(self.project.tags, ["partial tags", "updated"]) + self.assertEqual(list(self.project.tags.names()), ["partial tags", "updated"]) self.assertNotEqual(self.project.default_version, "updated-default-branch") def test_partial_update_others_project(self): From eade72d228ca8b11c1228f3d1439c9b4e6389ba9 Mon Sep 17 00:00:00 2001 From: SyedMa3 Date: Mon, 24 Oct 2022 17:53:55 +0530 Subject: [PATCH 07/10] added ordering by name to Tag model --- readthedocs/projects/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readthedocs/projects/models.py b/readthedocs/projects/models.py index 24c10161d2d..cedaddf035a 100644 --- a/readthedocs/projects/models.py +++ b/readthedocs/projects/models.py @@ -442,7 +442,7 @@ class Project(models.Model): help_text=_('This project has been successfully cloned'), ) - tags = TaggableManager(blank=True) + tags = TaggableManager(blank=True, ordering=["name"]) history = ExtraHistoricalRecords() objects = ProjectQuerySet.as_manager() From d2d99f8d21513ffe43a382198c479ac2abcc96fe Mon Sep 17 00:00:00 2001 From: SyedMa3 Date: Mon, 24 Oct 2022 17:54:54 +0530 Subject: [PATCH 08/10] modified responses json for sorted tags --- readthedocs/api/v3/tests/responses/projects-detail.json | 2 +- readthedocs/api/v3/tests/responses/projects-list.json | 2 +- readthedocs/api/v3/tests/responses/projects-list_POST.json | 2 +- readthedocs/api/v3/tests/responses/projects-superproject.json | 2 +- .../v3/tests/responses/projects-versions-builds-list_POST.json | 2 +- readthedocs/api/v3/tests/responses/remoterepositories-list.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/readthedocs/api/v3/tests/responses/projects-detail.json b/readthedocs/api/v3/tests/responses/projects-detail.json index 9671b0ae874..a8d80fb55b0 100644 --- a/readthedocs/api/v3/tests/responses/projects-detail.json +++ b/readthedocs/api/v3/tests/responses/projects-detail.json @@ -89,8 +89,8 @@ "slug": "project", "subproject_of": null, "tags": [ - "tag", "project", + "tag", "test" ], "translation_of": null, diff --git a/readthedocs/api/v3/tests/responses/projects-list.json b/readthedocs/api/v3/tests/responses/projects-list.json index 134913eda1e..11d93dae76f 100644 --- a/readthedocs/api/v3/tests/responses/projects-list.json +++ b/readthedocs/api/v3/tests/responses/projects-list.json @@ -33,8 +33,8 @@ "versions": "https://readthedocs.org/projects/project/versions/" }, "tags": [ - "tag", "project", + "tag", "test" ], "users": [ diff --git a/readthedocs/api/v3/tests/responses/projects-list_POST.json b/readthedocs/api/v3/tests/responses/projects-list_POST.json index afa8282b32e..7ddd8ffdff9 100644 --- a/readthedocs/api/v3/tests/responses/projects-list_POST.json +++ b/readthedocs/api/v3/tests/responses/projects-list_POST.json @@ -30,7 +30,7 @@ }, "slug": "test-project", "subproject_of": null, - "tags": [], + "tags": ["template tag", "test tag"], "translation_of": null, "urls": { "builds": "https://readthedocs.org/projects/test-project/builds/", diff --git a/readthedocs/api/v3/tests/responses/projects-superproject.json b/readthedocs/api/v3/tests/responses/projects-superproject.json index be776d84810..3095afe6ed0 100644 --- a/readthedocs/api/v3/tests/responses/projects-superproject.json +++ b/readthedocs/api/v3/tests/responses/projects-superproject.json @@ -31,8 +31,8 @@ "slug": "project", "subproject_of": null, "tags": [ - "tag", "project", + "tag", "test" ], "translation_of": null, diff --git a/readthedocs/api/v3/tests/responses/projects-versions-builds-list_POST.json b/readthedocs/api/v3/tests/responses/projects-versions-builds-list_POST.json index 8563105bde5..ff9b068ff61 100644 --- a/readthedocs/api/v3/tests/responses/projects-versions-builds-list_POST.json +++ b/readthedocs/api/v3/tests/responses/projects-versions-builds-list_POST.json @@ -57,8 +57,8 @@ "slug": "project", "subproject_of": null, "tags": [ - "tag", "project", + "tag", "test" ], "translation_of": null, diff --git a/readthedocs/api/v3/tests/responses/remoterepositories-list.json b/readthedocs/api/v3/tests/responses/remoterepositories-list.json index 3112588c3a4..1ed9f6de63c 100644 --- a/readthedocs/api/v3/tests/responses/remoterepositories-list.json +++ b/readthedocs/api/v3/tests/responses/remoterepositories-list.json @@ -39,7 +39,7 @@ "repository": { "type": "git", "url": "https://github.com/rtfd/project" }, "slug": "project", "subproject_of": null, - "tags": ["tag", "project", "test"], + "tags": ["project", "tag", "test"], "translation_of": null, "urls": { "builds": "https://readthedocs.org/projects/project/builds/", From 6640c03e14fb3196a305e97c329647fe2e0c8641 Mon Sep 17 00:00:00 2001 From: SyedMa3 Date: Mon, 24 Oct 2022 23:37:14 +0530 Subject: [PATCH 09/10] trimmed trailing whitespace --- docs/user/api/v3.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/user/api/v3.rst b/docs/user/api/v3.rst index aef838d4259..6f3fea2bfe7 100644 --- a/docs/user/api/v3.rst +++ b/docs/user/api/v3.rst @@ -418,8 +418,10 @@ Project update "programming_language": "py", "homepage": "https://readthedocs.org/", "tags" : [ - "new tag", - "updated tag" + "adding a list here", + "will replace", + "all existing tags", + "with these tags" ] "default_version": "v0.27.0", "default_branch": "develop", @@ -430,6 +432,9 @@ Project update } + Adding ``tags`` will replace existing tags with the new list, + and if omitted won't change the tags. + :statuscode 204: Updated successfully From 5a82df3f007bef294376b6bcde948dbf4f2f279d Mon Sep 17 00:00:00 2001 From: SyedMa3 Date: Wed, 26 Oct 2022 21:12:03 +0530 Subject: [PATCH 10/10] used tags from real examples --- docs/user/api/v3.rst | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/user/api/v3.rst b/docs/user/api/v3.rst index 6f3fea2bfe7..9772927f387 100644 --- a/docs/user/api/v3.rst +++ b/docs/user/api/v3.rst @@ -349,8 +349,8 @@ Project create "programming_language": "py", "language": "es", "tags": [ - "generic tag", - "test tag" + "automation", + "sphinx" ] } @@ -418,10 +418,8 @@ Project update "programming_language": "py", "homepage": "https://readthedocs.org/", "tags" : [ - "adding a list here", - "will replace", - "all existing tags", - "with these tags" + "extension", + "mkdocs" ] "default_version": "v0.27.0", "default_branch": "develop", @@ -432,8 +430,10 @@ Project update } - Adding ``tags`` will replace existing tags with the new list, - and if omitted won't change the tags. + .. note:: + + Adding ``tags`` will replace existing tags with the new list, + and if omitted won't change the tags. :statuscode 204: Updated successfully