diff --git a/taiga/projects/api.py b/taiga/projects/api.py index fbeefb7e..2e344680 100644 --- a/taiga/projects/api.py +++ b/taiga/projects/api.py @@ -69,12 +69,13 @@ class ProjectViewSet(LikedResourceMixin, HistoryResourceMixin, ModelCrudViewSet) permission_classes = (permissions.ProjectPermission, ) filter_backends = (filters.CanViewProjectObjFilterBackend,) - filter_fields = (('member', 'members'), - 'is_looking_for_people', - 'is_featured', - 'is_backlog_activated', - 'is_kanban_activated') + filter_fields = (("member", "members"), + "is_looking_for_people", + "is_featured", + "is_backlog_activated", + "is_kanban_activated") + ordering = ("name", "id") order_by_fields = ("memberships__user_order", "total_fans", "total_fans_last_week", @@ -94,7 +95,7 @@ class ProjectViewSet(LikedResourceMixin, HistoryResourceMixin, ModelCrudViewSet) def get_queryset(self): qs = super().get_queryset() - # Prefetch doesn't work correctly if then if the field is filtered later (it generates more queries) + # Prefetch doesn"t work correctly if then if the field is filtered later (it generates more queries) # so we add some custom prefetching qs = qs.prefetch_related("members") qs = qs.prefetch_related(Prefetch("notify_policies", diff --git a/taiga/projects/migrations/0032_auto_20151202_1151.py b/taiga/projects/migrations/0032_auto_20151202_1151.py new file mode 100644 index 00000000..62fbb6cf --- /dev/null +++ b/taiga/projects/migrations/0032_auto_20151202_1151.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0031_project_logo'), + ] + + operations = [ + migrations.AlterModelOptions( + name='project', + options={'permissions': (('view_project', 'Can view project'),), 'ordering': ['name', 'id'], 'verbose_name': 'project', 'verbose_name_plural': 'projects'}, + ), + migrations.AlterIndexTogether( + name='project', + index_together=set([('name', 'id')]), + ), + ] diff --git a/taiga/projects/models.py b/taiga/projects/models.py index 592224b2..f3367b78 100644 --- a/taiga/projects/models.py +++ b/taiga/projects/models.py @@ -266,7 +266,11 @@ class Project(ProjectDefaults, TaggedMixin, models.Model): class Meta: verbose_name = "project" verbose_name_plural = "projects" - ordering = ["name"] + ordering = ["name", "id"] + index_together = [ + ["name", "id"], + ] + permissions = ( ("view_project", "Can view project"), ) diff --git a/tests/integration/test_projects.py b/tests/integration/test_projects.py index 99757620..011b4856 100644 --- a/tests/integration/test_projects.py +++ b/tests/integration/test_projects.py @@ -492,3 +492,20 @@ def test_remove_project_with_logo(client): response = client.delete(url) assert response.status_code == 204 assert not any(list(map(os.path.exists, original_photo_paths))) + + +def test_project_list_without_search_query_order_by_name(client): + user = f.UserFactory.create(is_superuser=True) + project3 = f.create_project(name="test 3 - word", description="description 3", tags=["tag3"]) + project1 = f.create_project(name="test 1", description="description 1 - word", tags=["tag1"]) + project2 = f.create_project(name="test 2", description="description 2", tags=["word", "tag2"]) + + url = reverse("projects-list") + + client.login(user) + response = client.json.get(url) + + assert response.status_code == 200 + assert response.data[0]["id"] == project1.id + assert response.data[1]["id"] == project2.id + assert response.data[2]["id"] == project3.id