serializers.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. from rest_framework import serializers, status
  2. from rest_framework.exceptions import APIException
  3. from projects.serializers.base_serializers import ProjectReferenceWithMemberSerializer
  4. from users.serializers import UserSerializer
  5. from teams.serializers import TeamSerializer
  6. from teams.models import Team
  7. from .base_serializers import OrganizationReferenceSerializer
  8. from ..models import OrganizationUser, OrganizationUserRole, ROLES
  9. class OrganizationSerializer(OrganizationReferenceSerializer):
  10. pass
  11. class OrganizationDetailSerializer(OrganizationSerializer):
  12. projects = ProjectReferenceWithMemberSerializer(many=True)
  13. teams = TeamSerializer(many=True)
  14. openMembership = serializers.BooleanField(source="open_membership")
  15. class Meta(OrganizationSerializer.Meta):
  16. fields = OrganizationSerializer.Meta.fields + (
  17. "projects",
  18. "openMembership",
  19. "teams",
  20. )
  21. class HTTP409APIException(APIException):
  22. status_code = status.HTTP_409_CONFLICT
  23. class OrganizationUserSerializer(serializers.ModelSerializer):
  24. user = UserSerializer(required=False, read_only=True)
  25. role = serializers.CharField(source="get_role")
  26. roleName = serializers.CharField(source="get_role_display", read_only=True)
  27. dateCreated = serializers.DateTimeField(source="created", read_only=True)
  28. teams = serializers.SlugRelatedField(
  29. many=True, write_only=True, slug_field="slug", queryset=Team.objects.none()
  30. )
  31. class Meta:
  32. model = OrganizationUser
  33. fields = (
  34. "role",
  35. "id",
  36. "user",
  37. "roleName",
  38. "dateCreated",
  39. "email",
  40. "teams",
  41. "pending",
  42. )
  43. def __init__(self, *args, request_user=None, **kwargs):
  44. super().__init__(*args, **kwargs)
  45. if "request" in self.context:
  46. organization_slug = self.context["view"].kwargs.get("organization_slug")
  47. self.fields["teams"].child_relation.queryset = Team.objects.filter(
  48. organization__slug=organization_slug
  49. )
  50. def get_extra_kwargs(self):
  51. """ email should be read only when updating """
  52. extra_kwargs = super().get_extra_kwargs()
  53. if self.instance is not None:
  54. extra_kwargs["email"] = {"read_only": True}
  55. extra_kwargs["user"] = {"read_only": True}
  56. return extra_kwargs
  57. def create(self, validated_data):
  58. role = OrganizationUserRole.from_string(validated_data.get("get_role"))
  59. email = validated_data.get("email")
  60. organization = validated_data.get("organization")
  61. teams = validated_data.get("teams")
  62. if organization.organization_users.filter(email=email).exists():
  63. raise HTTP409APIException(f"The user {email} is already invited", "email")
  64. if organization.organization_users.filter(user__email=email).exists():
  65. raise HTTP409APIException(f"The user {email} is already a member", "email")
  66. org_user = super().create(
  67. {"role": role, "email": email, "organization": organization}
  68. )
  69. org_user.team_set.add(*teams)
  70. return org_user
  71. def update(self, instance, validated_data):
  72. get_role = validated_data.pop("get_role", None)
  73. if get_role:
  74. role = OrganizationUserRole.from_string(get_role)
  75. validated_data["role"] = role
  76. return super().update(instance, validated_data)
  77. def to_representation(self, obj):
  78. """ Override email for representation to potientially show user's email """
  79. self.fields["email"] = serializers.SerializerMethodField()
  80. return super().to_representation(obj)
  81. def get_email(self, obj):
  82. """ Prefer user primary email over org user email (which is only for invites) """
  83. if obj.user:
  84. return obj.user.email
  85. return obj.email
  86. class OrganizationUserDetailSerializer(OrganizationUserSerializer):
  87. teams = serializers.SlugRelatedField(
  88. source="team_set", slug_field="slug", read_only=True, many=True
  89. )
  90. roles = serializers.SerializerMethodField()
  91. class Meta(OrganizationUserSerializer.Meta):
  92. fields = OrganizationUserSerializer.Meta.fields + ("roles",)
  93. def get_roles(self, obj):
  94. return ROLES
  95. class OrganizationUserProjectsSerializer(OrganizationUserSerializer):
  96. projects = serializers.SerializerMethodField()
  97. class Meta(OrganizationUserSerializer.Meta):
  98. fields = OrganizationUserSerializer.Meta.fields + ("projects",)
  99. def get_projects(self, obj):
  100. return obj.organization.projects.filter(team__members=obj).values_list(
  101. "slug", flat=True
  102. )
  103. class ReinviteSerializer(serializers.Serializer):
  104. reinvite = serializers.IntegerField()
  105. def update(self, instance, validated_data):
  106. if validated_data.get("reinvite"):
  107. pass
  108. # Send email
  109. return instance
  110. class OrganizationUserOrganizationSerializer(OrganizationUserSerializer):
  111. """ Organization User Serializer with Organization info """
  112. organization = OrganizationSerializer()
  113. class Meta(OrganizationUserSerializer.Meta):
  114. fields = OrganizationUserSerializer.Meta.fields + ("organization",)
  115. class AcceptInviteSerializer(serializers.Serializer):
  116. accept_invite = serializers.BooleanField()
  117. org_user = OrganizationUserOrganizationSerializer(read_only=True)