From b5fed8e65b783e9ce8cfdfd7b06de0e40b896dd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Tue, 1 Sep 2015 18:02:44 +0200 Subject: [PATCH] Change 'star/unstar project' to 'like/unlike project' --- taiga/permissions/permissions.py | 8 ----- taiga/projects/api.py | 4 +-- .../migrations/0025_auto_20150901_1600.py | 21 ++++++++++++ taiga/projects/permissions.py | 4 +-- taiga/projects/serializers.py | 8 ++--- taiga/projects/votes/mixins/serializers.py | 6 ++-- taiga/projects/votes/mixins/viewsets.py | 12 +++---- taiga/users/api.py | 1 - .../migrations/0013_auto_20150901_1600.py | 21 ++++++++++++ taiga/users/permissions.py | 1 - .../test_projects_resource.py | 16 ++++----- tests/integration/test_star_projects.py | 34 +++++++++---------- 12 files changed, 84 insertions(+), 52 deletions(-) create mode 100644 taiga/projects/migrations/0025_auto_20150901_1600.py create mode 100644 taiga/users/migrations/0013_auto_20150901_1600.py diff --git a/taiga/permissions/permissions.py b/taiga/permissions/permissions.py index e711c77a..37cd32de 100644 --- a/taiga/permissions/permissions.py +++ b/taiga/permissions/permissions.py @@ -45,15 +45,10 @@ USER_PERMISSIONS = [ ('modify_wiki_page', _('Modify wiki page')), ('add_wiki_link', _('Add wiki link')), ('modify_wiki_link', _('Modify wiki link')), - ('star_project', _('Star project')), - ('vote_us', _('Vote user story')), - ('vote_task', _('Vote task')), - ('vote_issue', _('Vote issue')), ] MEMBERS_PERMISSIONS = [ ('view_project', _('View project')), - ('star_project', _('Star project')), # Milestone permissions ('view_milestones', _('View milestones')), ('add_milestone', _('Add milestone')), @@ -64,19 +59,16 @@ MEMBERS_PERMISSIONS = [ ('add_us', _('Add user story')), ('modify_us', _('Modify user story')), ('delete_us', _('Delete user story')), - ('vote_us', _('Vote user story')), # Task permissions ('view_tasks', _('View tasks')), ('add_task', _('Add task')), ('modify_task', _('Modify task')), ('delete_task', _('Delete task')), - ('vote_task', _('Vote task')), # Issue permissions ('view_issues', _('View issues')), ('add_issue', _('Add issue')), ('modify_issue', _('Modify issue')), ('delete_issue', _('Delete issue')), - ('vote_issue', _('Vote issue')), # Wiki page permissions ('view_wiki_pages', _('View wiki pages')), ('add_wiki_page', _('Add wiki page')), diff --git a/taiga/projects/api.py b/taiga/projects/api.py index 43f78475..baaa0eb0 100644 --- a/taiga/projects/api.py +++ b/taiga/projects/api.py @@ -45,13 +45,13 @@ from . import models from . import permissions from . import services -from .votes.mixins.viewsets import StarredResourceMixin, VotersViewSetMixin +from .votes.mixins.viewsets import LikedResourceMixin, VotersViewSetMixin ###################################################### ## Project ###################################################### -class ProjectViewSet(StarredResourceMixin, HistoryResourceMixin, WatchedResourceMixin, ModelCrudViewSet): +class ProjectViewSet(LikedResourceMixin, HistoryResourceMixin, WatchedResourceMixin, ModelCrudViewSet): queryset = models.Project.objects.all() serializer_class = serializers.ProjectDetailSerializer admin_serializer_class = serializers.ProjectDetailAdminSerializer diff --git a/taiga/projects/migrations/0025_auto_20150901_1600.py b/taiga/projects/migrations/0025_auto_20150901_1600.py new file mode 100644 index 00000000..8859b14e --- /dev/null +++ b/taiga/projects/migrations/0025_auto_20150901_1600.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import djorm_pgarray.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0024_auto_20150810_1247'), + ] + + operations = [ + migrations.AlterField( + model_name='project', + name='public_permissions', + field=djorm_pgarray.fields.TextArrayField(default=[], choices=[('view_project', 'View project'), ('view_milestones', 'View milestones'), ('add_milestone', 'Add milestone'), ('modify_milestone', 'Modify milestone'), ('delete_milestone', 'Delete milestone'), ('view_us', 'View user story'), ('add_us', 'Add user story'), ('modify_us', 'Modify user story'), ('delete_us', 'Delete user story'), ('view_tasks', 'View tasks'), ('add_task', 'Add task'), ('modify_task', 'Modify task'), ('delete_task', 'Delete task'), ('view_issues', 'View issues'), ('add_issue', 'Add issue'), ('modify_issue', 'Modify issue'), ('delete_issue', 'Delete issue'), ('view_wiki_pages', 'View wiki pages'), ('add_wiki_page', 'Add wiki page'), ('modify_wiki_page', 'Modify wiki page'), ('delete_wiki_page', 'Delete wiki page'), ('view_wiki_links', 'View wiki links'), ('add_wiki_link', 'Add wiki link'), ('modify_wiki_link', 'Modify wiki link'), ('delete_wiki_link', 'Delete wiki link')], dbtype='text', verbose_name='user permissions'), + preserve_default=True, + ), + ] diff --git a/taiga/projects/permissions.py b/taiga/projects/permissions.py index 1ec6f984..140faddc 100644 --- a/taiga/projects/permissions.py +++ b/taiga/projects/permissions.py @@ -60,8 +60,8 @@ class ProjectPermission(TaigaResourcePermission): regenerate_tasks_csv_uuid_perms = IsProjectOwner() tags_perms = HasProjectPerm('view_project') tags_colors_perms = HasProjectPerm('view_project') - star_perms = IsAuthenticated() & HasProjectPerm('view_project') - unstar_perms = IsAuthenticated() & HasProjectPerm('view_project') + like_perms = IsAuthenticated() & HasProjectPerm('view_project') + unlike_perms = IsAuthenticated() & HasProjectPerm('view_project') watch_perms = IsAuthenticated() & HasProjectPerm('view_project') unwatch_perms = IsAuthenticated() & HasProjectPerm('view_project') create_template_perms = IsSuperUser() diff --git a/taiga/projects/serializers.py b/taiga/projects/serializers.py index 9a13c6e7..c4f5f506 100644 --- a/taiga/projects/serializers.py +++ b/taiga/projects/serializers.py @@ -43,7 +43,7 @@ from .custom_attributes.serializers import UserStoryCustomAttributeSerializer from .custom_attributes.serializers import TaskCustomAttributeSerializer from .custom_attributes.serializers import IssueCustomAttributeSerializer from .notifications.mixins import WatchedResourceModelSerializer -from .votes.mixins.serializers import StarredResourceSerializerMixin +from .votes.mixins.serializers import LikedResourceSerializerMixin ###################################################### ## Custom values for selectors @@ -308,7 +308,7 @@ class ProjectMemberSerializer(serializers.ModelSerializer): ## Projects ###################################################### -class ProjectSerializer(WatchersValidator, StarredResourceSerializerMixin, WatchedResourceModelSerializer, serializers.ModelSerializer): +class ProjectSerializer(WatchersValidator, LikedResourceSerializerMixin, WatchedResourceModelSerializer, serializers.ModelSerializer): tags = TagsField(default=[], required=False) anon_permissions = PgArrayField(required=False) public_permissions = PgArrayField(required=False) @@ -385,10 +385,10 @@ class ProjectDetailAdminSerializer(ProjectDetailSerializer): ###################################################### -## Starred +## Liked ###################################################### -class StarredSerializer(serializers.ModelSerializer): +class LikedSerializer(serializers.ModelSerializer): class Meta: model = models.Project fields = ['id', 'name', 'slug'] diff --git a/taiga/projects/votes/mixins/serializers.py b/taiga/projects/votes/mixins/serializers.py index 96028eaf..a9c95900 100644 --- a/taiga/projects/votes/mixins/serializers.py +++ b/taiga/projects/votes/mixins/serializers.py @@ -27,9 +27,9 @@ class BaseVotedResourceSerializer(serializers.ModelSerializer): return getattr(obj, "is_voted", False) or False -class StarredResourceSerializerMixin(BaseVotedResourceSerializer): - stars = serializers.SerializerMethodField("get_votes_counter") - is_starred = serializers.SerializerMethodField("get_is_voted") +class LikedResourceSerializerMixin(BaseVotedResourceSerializer): + likes = serializers.SerializerMethodField("get_votes_counter") + is_liked = serializers.SerializerMethodField("get_is_voted") class VotedResourceSerializerMixin(BaseVotedResourceSerializer): diff --git a/taiga/projects/votes/mixins/viewsets.py b/taiga/projects/votes/mixins/viewsets.py index 83bf25bd..3fbb5cdf 100644 --- a/taiga/projects/votes/mixins/viewsets.py +++ b/taiga/projects/votes/mixins/viewsets.py @@ -55,16 +55,16 @@ class BaseVotedResource: return response.Ok() -class StarredResourceMixin(BaseVotedResource): - # Note: objects nedd 'star' and 'unstar' permissions. +class LikedResourceMixin(BaseVotedResource): + # Note: objects nedd 'like' and 'unlike' permissions. @detail_route(methods=["POST"]) - def star(self, request, pk=None): - return self._add_voter("star", request, pk) + def like(self, request, pk=None): + return self._add_voter("like", request, pk) @detail_route(methods=["POST"]) - def unstar(self, request, pk=None): - return self._remove_vote("unstar", request, pk) + def unlike(self, request, pk=None): + return self._remove_vote("unlike", request, pk) class VotedResourceMixin(BaseVotedResource): diff --git a/taiga/users/api.py b/taiga/users/api.py index ea5e5bdc..508e707f 100644 --- a/taiga/users/api.py +++ b/taiga/users/api.py @@ -34,7 +34,6 @@ from taiga.base.filters import PermissionBasedFilterBackend from taiga.base.api.utils import get_object_or_404 from taiga.base.filters import MembersFilterBackend from taiga.projects.votes import services as votes_service -from taiga.projects.serializers import StarredSerializer from easy_thumbnails.source_generators import pil_image diff --git a/taiga/users/migrations/0013_auto_20150901_1600.py b/taiga/users/migrations/0013_auto_20150901_1600.py new file mode 100644 index 00000000..8d2e4143 --- /dev/null +++ b/taiga/users/migrations/0013_auto_20150901_1600.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import djorm_pgarray.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0012_auto_20150812_1142'), + ] + + operations = [ + migrations.AlterField( + model_name='role', + name='permissions', + field=djorm_pgarray.fields.TextArrayField(default=[], choices=[('view_project', 'View project'), ('view_milestones', 'View milestones'), ('add_milestone', 'Add milestone'), ('modify_milestone', 'Modify milestone'), ('delete_milestone', 'Delete milestone'), ('view_us', 'View user story'), ('add_us', 'Add user story'), ('modify_us', 'Modify user story'), ('delete_us', 'Delete user story'), ('view_tasks', 'View tasks'), ('add_task', 'Add task'), ('modify_task', 'Modify task'), ('delete_task', 'Delete task'), ('view_issues', 'View issues'), ('add_issue', 'Add issue'), ('modify_issue', 'Modify issue'), ('delete_issue', 'Delete issue'), ('view_wiki_pages', 'View wiki pages'), ('add_wiki_page', 'Add wiki page'), ('modify_wiki_page', 'Modify wiki page'), ('delete_wiki_page', 'Delete wiki page'), ('view_wiki_links', 'View wiki links'), ('add_wiki_link', 'Add wiki link'), ('modify_wiki_link', 'Modify wiki link'), ('delete_wiki_link', 'Delete wiki link')], dbtype='text', verbose_name='permissions'), + preserve_default=True, + ), + ] diff --git a/taiga/users/permissions.py b/taiga/users/permissions.py index 63c54751..dab7fe0f 100644 --- a/taiga/users/permissions.py +++ b/taiga/users/permissions.py @@ -44,7 +44,6 @@ class UserPermission(TaigaResourcePermission): change_avatar_perms = IsAuthenticated() me_perms = IsAuthenticated() remove_avatar_perms = IsAuthenticated() - starred_perms = AllowAny() change_email_perms = AllowAny() contacts_perms = AllowAny() favourites_perms = AllowAny() diff --git a/tests/integration/resources_permissions/test_projects_resource.py b/tests/integration/resources_permissions/test_projects_resource.py index 27c08d1f..c76fa68f 100644 --- a/tests/integration/resources_permissions/test_projects_resource.py +++ b/tests/integration/resources_permissions/test_projects_resource.py @@ -225,10 +225,10 @@ def test_project_action_issues_stats(client, data): assert results == [404, 404, 200, 200] -def test_project_action_star(client, data): - public_url = reverse('projects-star', kwargs={"pk": data.public_project.pk}) - private1_url = reverse('projects-star', kwargs={"pk": data.private_project1.pk}) - private2_url = reverse('projects-star', kwargs={"pk": data.private_project2.pk}) +def test_project_action_like(client, data): + public_url = reverse('projects-like', kwargs={"pk": data.public_project.pk}) + private1_url = reverse('projects-like', kwargs={"pk": data.private_project1.pk}) + private2_url = reverse('projects-like', kwargs={"pk": data.private_project2.pk}) users = [ None, @@ -244,10 +244,10 @@ def test_project_action_star(client, data): assert results == [404, 404, 200, 200] -def test_project_action_unstar(client, data): - public_url = reverse('projects-unstar', kwargs={"pk": data.public_project.pk}) - private1_url = reverse('projects-unstar', kwargs={"pk": data.private_project1.pk}) - private2_url = reverse('projects-unstar', kwargs={"pk": data.private_project2.pk}) +def test_project_action_unlike(client, data): + public_url = reverse('projects-unlike', kwargs={"pk": data.public_project.pk}) + private1_url = reverse('projects-unlike', kwargs={"pk": data.private_project1.pk}) + private2_url = reverse('projects-unlike', kwargs={"pk": data.private_project2.pk}) users = [ None, diff --git a/tests/integration/test_star_projects.py b/tests/integration/test_star_projects.py index ad8d8e08..2f2b87aa 100644 --- a/tests/integration/test_star_projects.py +++ b/tests/integration/test_star_projects.py @@ -23,11 +23,11 @@ from .. import factories as f pytestmark = pytest.mark.django_db -def test_star_project(client): +def test_like_project(client): user = f.UserFactory.create() project = f.create_project(owner=user) f.MembershipFactory.create(project=project, user=user, is_owner=True) - url = reverse("projects-star", args=(project.id,)) + url = reverse("projects-like", args=(project.id,)) client.login(user) response = client.post(url) @@ -35,11 +35,11 @@ def test_star_project(client): assert response.status_code == 200 -def test_unstar_project(client): +def test_unlike_project(client): user = f.UserFactory.create() project = f.create_project(owner=user) f.MembershipFactory.create(project=project, user=user, is_owner=True) - url = reverse("projects-unstar", args=(project.id,)) + url = reverse("projects-unlike", args=(project.id,)) client.login(user) response = client.post(url) @@ -75,7 +75,7 @@ def test_get_project_fan(client): assert response.data['id'] == vote.user.id -def test_get_project_stars(client): +def test_get_project_likes(client): user = f.UserFactory.create() project = f.create_project(owner=user) f.MembershipFactory.create(project=project, user=user, is_owner=True) @@ -87,37 +87,37 @@ def test_get_project_stars(client): response = client.get(url) assert response.status_code == 200 - assert response.data['stars'] == 5 + assert response.data['likes'] == 5 -def test_get_project_is_starred(client): +def test_get_project_is_liked(client): user = f.UserFactory.create() project = f.create_project(owner=user) f.MembershipFactory.create(project=project, user=user, is_owner=True) f.VotesFactory.create(content_object=project) url_detail = reverse("projects-detail", args=(project.id,)) - url_star = reverse("projects-star", args=(project.id,)) - url_unstar = reverse("projects-unstar", args=(project.id,)) + url_like = reverse("projects-like", args=(project.id,)) + url_unlike = reverse("projects-unlike", args=(project.id,)) client.login(user) response = client.get(url_detail) assert response.status_code == 200 - assert response.data['stars'] == 0 - assert response.data['is_starred'] == False + assert response.data['likes'] == 0 + assert response.data['is_liked'] == False - response = client.post(url_star) + response = client.post(url_like) assert response.status_code == 200 response = client.get(url_detail) assert response.status_code == 200 - assert response.data['stars'] == 1 - assert response.data['is_starred'] == True + assert response.data['likes'] == 1 + assert response.data['is_liked'] == True - response = client.post(url_unstar) + response = client.post(url_unlike) assert response.status_code == 200 response = client.get(url_detail) assert response.status_code == 200 - assert response.data['stars'] == 0 - assert response.data['is_starred'] == False + assert response.data['likes'] == 0 + assert response.data['is_liked'] == False