Skip to content

Commit

Permalink
Merge pull request #634 from taigaio/adding-owner-info-to-project-ser…
Browse files Browse the repository at this point in the history
…ializer

Adding owner info to project serializer
  • Loading branch information
superalex committed Feb 29, 2016
2 parents f0b2762 + c92dda9 commit e4ba94f
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 4 deletions.
14 changes: 14 additions & 0 deletions taiga/permissions/service.py
Expand Up @@ -37,6 +37,20 @@ def _get_object_project(obj):
return project


def is_project_owner(user, obj):
if user.is_superuser:
return True

project = _get_object_project(obj)
if project is None:
return False

if user.id == project.owner.id:
return True

return False


def is_project_admin(user, obj):
if user.is_superuser:
return True
Expand Down
1 change: 1 addition & 0 deletions taiga/projects/api.py
Expand Up @@ -104,6 +104,7 @@ def _get_order_by_field_name(self):
def get_queryset(self):
qs = super().get_queryset()

qs = qs.select_related("owner")
# 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")
Expand Down
19 changes: 16 additions & 3 deletions taiga/projects/serializers.py
Expand Up @@ -33,7 +33,7 @@
from taiga.users.validators import RoleExistsValidator

from taiga.permissions.service import get_user_project_permissions
from taiga.permissions.service import is_project_admin
from taiga.permissions.service import is_project_admin, is_project_owner
from taiga.projects.mixins.serializers import ValidateDuplicatedNameInProjectMixin

from . import models
Expand Down Expand Up @@ -130,6 +130,7 @@ class MembershipSerializer(serializers.ModelSerializer):
project_name = serializers.SerializerMethodField("get_project_name")
project_slug = serializers.SerializerMethodField("get_project_slug")
invited_by = UserBasicInfoSerializer(read_only=True)
is_owner = serializers.SerializerMethodField("get_is_owner")

class Meta:
model = models.Membership
Expand All @@ -147,6 +148,10 @@ def get_project_name(self, obj):
def get_project_slug(self, obj):
return obj.project.slug if obj and obj.project else ""

def get_is_owner(self, obj):
return (obj and obj.user_id and obj.project_id and obj.project.owner_id and
obj.user_id == obj.project.owner_id)

def validate_email(self, attrs, source):
project = attrs.get("project", None)
if project is None:
Expand Down Expand Up @@ -241,6 +246,9 @@ class ProjectSerializer(FanResourceSerializerMixin, WatchedResourceModelSerializ
anon_permissions = PgArrayField(required=False)
public_permissions = PgArrayField(required=False)
my_permissions = serializers.SerializerMethodField("get_my_permissions")

owner = UserBasicInfoSerializer(read_only=True)
i_am_owner = serializers.SerializerMethodField("get_i_am_owner")
i_am_admin = serializers.SerializerMethodField("get_i_am_admin")
i_am_member = serializers.SerializerMethodField("get_i_am_member")

Expand All @@ -256,7 +264,7 @@ class ProjectSerializer(FanResourceSerializerMixin, WatchedResourceModelSerializ

class Meta:
model = models.Project
read_only_fields = ("created_date", "modified_date", "owner", "slug", "blocked_code")
read_only_fields = ("created_date", "modified_date", "slug", "blocked_code")
exclude = ("logo", "last_us_ref", "last_task_ref", "last_issue_ref",
"issues_csv_uuid", "tasks_csv_uuid", "userstories_csv_uuid",
"transfer_token")
Expand All @@ -266,6 +274,11 @@ def get_my_permissions(self, obj):
return get_user_project_permissions(self.context["request"].user, obj)
return []

def get_i_am_owner(self, obj):
if "request" in self.context:
return is_project_owner(self.context["request"].user, obj)
return False

def get_i_am_admin(self, obj):
if "request" in self.context:
return is_project_admin(self.context["request"].user, obj)
Expand Down Expand Up @@ -341,7 +354,7 @@ def get_members(self, obj):
class ProjectDetailAdminSerializer(ProjectDetailSerializer):
class Meta:
model = models.Project
read_only_fields = ("created_date", "modified_date", "owner", "slug", "blocked_code")
read_only_fields = ("created_date", "modified_date", "slug", "blocked_code")
exclude = ("logo", "last_us_ref", "last_task_ref", "last_issue_ref")


Expand Down
2 changes: 1 addition & 1 deletion taiga/users/serializers.py
Expand Up @@ -133,7 +133,7 @@ def get_total_public_projects(self, user):
class UserBasicInfoSerializer(UserSerializer):
class Meta:
model = User
fields = ("username", "full_name_display","photo", "big_photo", "is_active")
fields = ("username", "full_name_display","photo", "big_photo", "is_active", "id")


class RecoverySerializer(serializers.Serializer):
Expand Down

0 comments on commit e4ba94f

Please sign in to comment.