Merge pull request #445 from taigaio/change_star_project_to_like_project

Change 'star/unstar project' to 'like/unlike project'
remotes/origin/logger
Alejandro 2015-09-02 09:22:24 +02:00
commit 72e5d89fe6
12 changed files with 84 additions and 52 deletions

View File

@ -45,15 +45,10 @@ USER_PERMISSIONS = [
('modify_wiki_page', _('Modify wiki page')), ('modify_wiki_page', _('Modify wiki page')),
('add_wiki_link', _('Add wiki link')), ('add_wiki_link', _('Add wiki link')),
('modify_wiki_link', _('Modify 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 = [ MEMBERS_PERMISSIONS = [
('view_project', _('View project')), ('view_project', _('View project')),
('star_project', _('Star project')),
# Milestone permissions # Milestone permissions
('view_milestones', _('View milestones')), ('view_milestones', _('View milestones')),
('add_milestone', _('Add milestone')), ('add_milestone', _('Add milestone')),
@ -64,19 +59,16 @@ MEMBERS_PERMISSIONS = [
('add_us', _('Add user story')), ('add_us', _('Add user story')),
('modify_us', _('Modify user story')), ('modify_us', _('Modify user story')),
('delete_us', _('Delete user story')), ('delete_us', _('Delete user story')),
('vote_us', _('Vote user story')),
# Task permissions # Task permissions
('view_tasks', _('View tasks')), ('view_tasks', _('View tasks')),
('add_task', _('Add task')), ('add_task', _('Add task')),
('modify_task', _('Modify task')), ('modify_task', _('Modify task')),
('delete_task', _('Delete task')), ('delete_task', _('Delete task')),
('vote_task', _('Vote task')),
# Issue permissions # Issue permissions
('view_issues', _('View issues')), ('view_issues', _('View issues')),
('add_issue', _('Add issue')), ('add_issue', _('Add issue')),
('modify_issue', _('Modify issue')), ('modify_issue', _('Modify issue')),
('delete_issue', _('Delete issue')), ('delete_issue', _('Delete issue')),
('vote_issue', _('Vote issue')),
# Wiki page permissions # Wiki page permissions
('view_wiki_pages', _('View wiki pages')), ('view_wiki_pages', _('View wiki pages')),
('add_wiki_page', _('Add wiki page')), ('add_wiki_page', _('Add wiki page')),

View File

@ -45,13 +45,13 @@ from . import models
from . import permissions from . import permissions
from . import services from . import services
from .votes.mixins.viewsets import StarredResourceMixin, VotersViewSetMixin from .votes.mixins.viewsets import LikedResourceMixin, VotersViewSetMixin
###################################################### ######################################################
## Project ## Project
###################################################### ######################################################
class ProjectViewSet(StarredResourceMixin, HistoryResourceMixin, WatchedResourceMixin, ModelCrudViewSet): class ProjectViewSet(LikedResourceMixin, HistoryResourceMixin, WatchedResourceMixin, ModelCrudViewSet):
queryset = models.Project.objects.all() queryset = models.Project.objects.all()
serializer_class = serializers.ProjectDetailSerializer serializer_class = serializers.ProjectDetailSerializer
admin_serializer_class = serializers.ProjectDetailAdminSerializer admin_serializer_class = serializers.ProjectDetailAdminSerializer

View File

@ -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,
),
]

View File

@ -60,8 +60,8 @@ class ProjectPermission(TaigaResourcePermission):
regenerate_tasks_csv_uuid_perms = IsProjectOwner() regenerate_tasks_csv_uuid_perms = IsProjectOwner()
tags_perms = HasProjectPerm('view_project') tags_perms = HasProjectPerm('view_project')
tags_colors_perms = HasProjectPerm('view_project') tags_colors_perms = HasProjectPerm('view_project')
star_perms = IsAuthenticated() & HasProjectPerm('view_project') like_perms = IsAuthenticated() & HasProjectPerm('view_project')
unstar_perms = IsAuthenticated() & HasProjectPerm('view_project') unlike_perms = IsAuthenticated() & HasProjectPerm('view_project')
watch_perms = IsAuthenticated() & HasProjectPerm('view_project') watch_perms = IsAuthenticated() & HasProjectPerm('view_project')
unwatch_perms = IsAuthenticated() & HasProjectPerm('view_project') unwatch_perms = IsAuthenticated() & HasProjectPerm('view_project')
create_template_perms = IsSuperUser() create_template_perms = IsSuperUser()

View File

@ -43,7 +43,7 @@ from .custom_attributes.serializers import UserStoryCustomAttributeSerializer
from .custom_attributes.serializers import TaskCustomAttributeSerializer from .custom_attributes.serializers import TaskCustomAttributeSerializer
from .custom_attributes.serializers import IssueCustomAttributeSerializer from .custom_attributes.serializers import IssueCustomAttributeSerializer
from .notifications.mixins import WatchedResourceModelSerializer from .notifications.mixins import WatchedResourceModelSerializer
from .votes.mixins.serializers import StarredResourceSerializerMixin from .votes.mixins.serializers import LikedResourceSerializerMixin
###################################################### ######################################################
## Custom values for selectors ## Custom values for selectors
@ -308,7 +308,7 @@ class ProjectMemberSerializer(serializers.ModelSerializer):
## Projects ## Projects
###################################################### ######################################################
class ProjectSerializer(WatchersValidator, StarredResourceSerializerMixin, WatchedResourceModelSerializer, serializers.ModelSerializer): class ProjectSerializer(WatchersValidator, LikedResourceSerializerMixin, WatchedResourceModelSerializer, serializers.ModelSerializer):
tags = TagsField(default=[], required=False) tags = TagsField(default=[], required=False)
anon_permissions = PgArrayField(required=False) anon_permissions = PgArrayField(required=False)
public_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: class Meta:
model = models.Project model = models.Project
fields = ['id', 'name', 'slug'] fields = ['id', 'name', 'slug']

View File

@ -27,9 +27,9 @@ class BaseVotedResourceSerializer(serializers.ModelSerializer):
return getattr(obj, "is_voted", False) or False return getattr(obj, "is_voted", False) or False
class StarredResourceSerializerMixin(BaseVotedResourceSerializer): class LikedResourceSerializerMixin(BaseVotedResourceSerializer):
stars = serializers.SerializerMethodField("get_votes_counter") likes = serializers.SerializerMethodField("get_votes_counter")
is_starred = serializers.SerializerMethodField("get_is_voted") is_liked = serializers.SerializerMethodField("get_is_voted")
class VotedResourceSerializerMixin(BaseVotedResourceSerializer): class VotedResourceSerializerMixin(BaseVotedResourceSerializer):

View File

@ -55,16 +55,16 @@ class BaseVotedResource:
return response.Ok() return response.Ok()
class StarredResourceMixin(BaseVotedResource): class LikedResourceMixin(BaseVotedResource):
# Note: objects nedd 'star' and 'unstar' permissions. # Note: objects nedd 'like' and 'unlike' permissions.
@detail_route(methods=["POST"]) @detail_route(methods=["POST"])
def star(self, request, pk=None): def like(self, request, pk=None):
return self._add_voter("star", request, pk) return self._add_voter("like", request, pk)
@detail_route(methods=["POST"]) @detail_route(methods=["POST"])
def unstar(self, request, pk=None): def unlike(self, request, pk=None):
return self._remove_vote("unstar", request, pk) return self._remove_vote("unlike", request, pk)
class VotedResourceMixin(BaseVotedResource): class VotedResourceMixin(BaseVotedResource):

View File

@ -34,7 +34,6 @@ from taiga.base.filters import PermissionBasedFilterBackend
from taiga.base.api.utils import get_object_or_404 from taiga.base.api.utils import get_object_or_404
from taiga.base.filters import MembersFilterBackend from taiga.base.filters import MembersFilterBackend
from taiga.projects.votes import services as votes_service from taiga.projects.votes import services as votes_service
from taiga.projects.serializers import StarredSerializer
from easy_thumbnails.source_generators import pil_image from easy_thumbnails.source_generators import pil_image

View File

@ -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,
),
]

View File

@ -44,7 +44,6 @@ class UserPermission(TaigaResourcePermission):
change_avatar_perms = IsAuthenticated() change_avatar_perms = IsAuthenticated()
me_perms = IsAuthenticated() me_perms = IsAuthenticated()
remove_avatar_perms = IsAuthenticated() remove_avatar_perms = IsAuthenticated()
starred_perms = AllowAny()
change_email_perms = AllowAny() change_email_perms = AllowAny()
contacts_perms = AllowAny() contacts_perms = AllowAny()
favourites_perms = AllowAny() favourites_perms = AllowAny()

View File

@ -225,10 +225,10 @@ def test_project_action_issues_stats(client, data):
assert results == [404, 404, 200, 200] assert results == [404, 404, 200, 200]
def test_project_action_star(client, data): def test_project_action_like(client, data):
public_url = reverse('projects-star', kwargs={"pk": data.public_project.pk}) public_url = reverse('projects-like', kwargs={"pk": data.public_project.pk})
private1_url = reverse('projects-star', kwargs={"pk": data.private_project1.pk}) private1_url = reverse('projects-like', kwargs={"pk": data.private_project1.pk})
private2_url = reverse('projects-star', kwargs={"pk": data.private_project2.pk}) private2_url = reverse('projects-like', kwargs={"pk": data.private_project2.pk})
users = [ users = [
None, None,
@ -244,10 +244,10 @@ def test_project_action_star(client, data):
assert results == [404, 404, 200, 200] assert results == [404, 404, 200, 200]
def test_project_action_unstar(client, data): def test_project_action_unlike(client, data):
public_url = reverse('projects-unstar', kwargs={"pk": data.public_project.pk}) public_url = reverse('projects-unlike', kwargs={"pk": data.public_project.pk})
private1_url = reverse('projects-unstar', kwargs={"pk": data.private_project1.pk}) private1_url = reverse('projects-unlike', kwargs={"pk": data.private_project1.pk})
private2_url = reverse('projects-unstar', kwargs={"pk": data.private_project2.pk}) private2_url = reverse('projects-unlike', kwargs={"pk": data.private_project2.pk})
users = [ users = [
None, None,

View File

@ -23,11 +23,11 @@ from .. import factories as f
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
def test_star_project(client): def test_like_project(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.create_project(owner=user) project = f.create_project(owner=user)
f.MembershipFactory.create(project=project, user=user, is_owner=True) 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) client.login(user)
response = client.post(url) response = client.post(url)
@ -35,11 +35,11 @@ def test_star_project(client):
assert response.status_code == 200 assert response.status_code == 200
def test_unstar_project(client): def test_unlike_project(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.create_project(owner=user) project = f.create_project(owner=user)
f.MembershipFactory.create(project=project, user=user, is_owner=True) 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) client.login(user)
response = client.post(url) response = client.post(url)
@ -75,7 +75,7 @@ def test_get_project_fan(client):
assert response.data['id'] == vote.user.id assert response.data['id'] == vote.user.id
def test_get_project_stars(client): def test_get_project_likes(client):
user = f.UserFactory.create() user = f.UserFactory.create()
project = f.create_project(owner=user) project = f.create_project(owner=user)
f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
@ -87,37 +87,37 @@ def test_get_project_stars(client):
response = client.get(url) response = client.get(url)
assert response.status_code == 200 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() user = f.UserFactory.create()
project = f.create_project(owner=user) project = f.create_project(owner=user)
f.MembershipFactory.create(project=project, user=user, is_owner=True) f.MembershipFactory.create(project=project, user=user, is_owner=True)
f.VotesFactory.create(content_object=project) f.VotesFactory.create(content_object=project)
url_detail = reverse("projects-detail", args=(project.id,)) url_detail = reverse("projects-detail", args=(project.id,))
url_star = reverse("projects-star", args=(project.id,)) url_like = reverse("projects-like", args=(project.id,))
url_unstar = reverse("projects-unstar", args=(project.id,)) url_unlike = reverse("projects-unlike", args=(project.id,))
client.login(user) client.login(user)
response = client.get(url_detail) response = client.get(url_detail)
assert response.status_code == 200 assert response.status_code == 200
assert response.data['stars'] == 0 assert response.data['likes'] == 0
assert response.data['is_starred'] == False assert response.data['is_liked'] == False
response = client.post(url_star) response = client.post(url_like)
assert response.status_code == 200 assert response.status_code == 200
response = client.get(url_detail) response = client.get(url_detail)
assert response.status_code == 200 assert response.status_code == 200
assert response.data['stars'] == 1 assert response.data['likes'] == 1
assert response.data['is_starred'] == True assert response.data['is_liked'] == True
response = client.post(url_unstar) response = client.post(url_unlike)
assert response.status_code == 200 assert response.status_code == 200
response = client.get(url_detail) response = client.get(url_detail)
assert response.status_code == 200 assert response.status_code == 200
assert response.data['stars'] == 0 assert response.data['likes'] == 0
assert response.data['is_starred'] == False assert response.data['is_liked'] == False