Merge pull request #634 from taigaio/adding-owner-info-to-project-serializer
Adding owner info to project serializerremotes/origin/issue/4795/notification_even_they_are_disabled
commit
e4ba94f67f
|
@ -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
|
||||||
|
|
|
@ -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")
|
||||||
|
|
|
@ -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")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue