Adding owner info to project serializer

remotes/origin/issue/4795/notification_even_they_are_disabled
Alejandro Alonso 2016-02-25 15:55:31 +01:00
parent f0b27620e2
commit c92dda9ed0
4 changed files with 32 additions and 4 deletions

View File

@ -37,6 +37,20 @@ def _get_object_project(obj):
return project 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): def is_project_admin(user, obj):
if user.is_superuser: if user.is_superuser:
return True return True

View File

@ -104,6 +104,7 @@ class ProjectViewSet(LikedResourceMixin, HistoryResourceMixin,
def get_queryset(self): def get_queryset(self):
qs = super().get_queryset() 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) # Prefetch doesn"t work correctly if then if the field is filtered later (it generates more queries)
# so we add some custom prefetching # so we add some custom prefetching
qs = qs.prefetch_related("members") qs = qs.prefetch_related("members")

View File

@ -33,7 +33,7 @@ from taiga.users.serializers import ProjectRoleSerializer
from taiga.users.validators import RoleExistsValidator from taiga.users.validators import RoleExistsValidator
from taiga.permissions.service import get_user_project_permissions 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 taiga.projects.mixins.serializers import ValidateDuplicatedNameInProjectMixin
from . import models from . import models
@ -130,6 +130,7 @@ class MembershipSerializer(serializers.ModelSerializer):
project_name = serializers.SerializerMethodField("get_project_name") project_name = serializers.SerializerMethodField("get_project_name")
project_slug = serializers.SerializerMethodField("get_project_slug") project_slug = serializers.SerializerMethodField("get_project_slug")
invited_by = UserBasicInfoSerializer(read_only=True) invited_by = UserBasicInfoSerializer(read_only=True)
is_owner = serializers.SerializerMethodField("get_is_owner")
class Meta: class Meta:
model = models.Membership model = models.Membership
@ -147,6 +148,10 @@ class MembershipSerializer(serializers.ModelSerializer):
def get_project_slug(self, obj): def get_project_slug(self, obj):
return obj.project.slug if obj and obj.project else "" 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): def validate_email(self, attrs, source):
project = attrs.get("project", None) project = attrs.get("project", None)
if project is None: if project is None:
@ -241,6 +246,9 @@ class ProjectSerializer(FanResourceSerializerMixin, WatchedResourceModelSerializ
anon_permissions = PgArrayField(required=False) anon_permissions = PgArrayField(required=False)
public_permissions = PgArrayField(required=False) public_permissions = PgArrayField(required=False)
my_permissions = serializers.SerializerMethodField("get_my_permissions") 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_admin = serializers.SerializerMethodField("get_i_am_admin")
i_am_member = serializers.SerializerMethodField("get_i_am_member") i_am_member = serializers.SerializerMethodField("get_i_am_member")
@ -256,7 +264,7 @@ class ProjectSerializer(FanResourceSerializerMixin, WatchedResourceModelSerializ
class Meta: class Meta:
model = models.Project 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", exclude = ("logo", "last_us_ref", "last_task_ref", "last_issue_ref",
"issues_csv_uuid", "tasks_csv_uuid", "userstories_csv_uuid", "issues_csv_uuid", "tasks_csv_uuid", "userstories_csv_uuid",
"transfer_token") "transfer_token")
@ -266,6 +274,11 @@ class ProjectSerializer(FanResourceSerializerMixin, WatchedResourceModelSerializ
return get_user_project_permissions(self.context["request"].user, obj) return get_user_project_permissions(self.context["request"].user, obj)
return [] 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): def get_i_am_admin(self, obj):
if "request" in self.context: if "request" in self.context:
return is_project_admin(self.context["request"].user, obj) return is_project_admin(self.context["request"].user, obj)
@ -341,7 +354,7 @@ class ProjectDetailSerializer(ProjectSerializer):
class ProjectDetailAdminSerializer(ProjectDetailSerializer): class ProjectDetailAdminSerializer(ProjectDetailSerializer):
class Meta: class Meta:
model = models.Project 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") exclude = ("logo", "last_us_ref", "last_task_ref", "last_issue_ref")

View File

@ -133,7 +133,7 @@ class UserAdminSerializer(UserSerializer):
class UserBasicInfoSerializer(UserSerializer): class UserBasicInfoSerializer(UserSerializer):
class Meta: class Meta:
model = User 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): class RecoverySerializer(serializers.Serializer):