Merge pull request #445 from taigaio/change_star_project_to_like_project
Change 'star/unstar project' to 'like/unlike project'remotes/origin/logger
commit
72e5d89fe6
|
@ -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')),
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
),
|
||||||
|
]
|
|
@ -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()
|
||||||
|
|
|
@ -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']
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
),
|
||||||
|
]
|
|
@ -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()
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue