/muse/teams/serializers.py

https://gitlab.com/muse-genomics/muse-app · Python · 239 lines · 159 code · 62 blank · 18 comment · 6 complexity · 0fab2771245a4f54114df3c04240b9aa MD5 · raw file

  1. from django.db.models import Q
  2. from django.utils.translation import ugettext_lazy as _
  3. from rest_framework import serializers
  4. from django.core.exceptions import ValidationError
  5. from teams.models import Team, TeamMember, TeamMemberPermission, Project, \
  6. ProjectUser, ProjectUserPermission, ProjectTag, UserProjectInvite,\
  7. UserTeamInvite
  8. from accounts.models import User
  9. class UserTeamProjectSerializer(serializers.ModelSerializer):
  10. class Meta:
  11. model = User
  12. fields = ('id', 'first_name', 'last_name', 'email')
  13. read_only_fields = ('id', 'first_name', 'last_name', 'email')
  14. class TeamMemberPermissionSerializer(serializers.ModelSerializer):
  15. class Meta:
  16. model = TeamMemberPermission
  17. exclude = ()
  18. def __init__(self, *args, **kwargs):
  19. kwargs['partial'] = True
  20. super(self.__class__, self).__init__(*args, **kwargs)
  21. class TeamMemberDetailedSerializer(serializers.ModelSerializer):
  22. user = UserTeamProjectSerializer(required=False)
  23. permissions = TeamMemberPermissionSerializer(many=True, required=False)
  24. creator = serializers.PrimaryKeyRelatedField(
  25. read_only=True,
  26. default=serializers.CreateOnlyDefault(
  27. serializers.CurrentUserDefault()))
  28. class Meta:
  29. model = TeamMember
  30. exclude = ('id', )
  31. class TeamMemberSerializer(serializers.ModelSerializer):
  32. permissions = TeamMemberPermissionSerializer(many=True, required=False)
  33. creator = serializers.PrimaryKeyRelatedField(
  34. read_only=True,
  35. default=serializers.CreateOnlyDefault(
  36. serializers.CurrentUserDefault()))
  37. class Meta:
  38. model = TeamMember
  39. exclude = ('id', )
  40. def __init__(self, *args, **kwargs):
  41. kwargs['partial'] = True
  42. super(self.__class__, self).__init__(*args, **kwargs)
  43. def validate(self, data):
  44. # TODO: check if possible to add team member based on available
  45. # license users
  46. return data
  47. class TeamSerializer(serializers.ModelSerializer):
  48. owner = serializers.PrimaryKeyRelatedField(
  49. read_only=True,
  50. default=serializers.CreateOnlyDefault(
  51. serializers.CurrentUserDefault()))
  52. class Meta:
  53. model = Team
  54. exclude = ()
  55. read_only_fields = (
  56. 'account_number', 'payment_gateway_code', )
  57. def __init__(self, *args, **kwargs):
  58. kwargs['partial'] = True
  59. super(self.__class__, self).__init__(*args, **kwargs)
  60. # def create(self, validated_data):
  61. # instance = super().create(validated_data)
  62. # # Automatically add owner as team member
  63. # # try:
  64. # # team_member_serializer = TeamMemberSerializer(
  65. # # data={
  66. # # 'user': instance.owner.pk,
  67. # # 'creator': instance.owner.pk,
  68. # # 'team': instance.pk,
  69. # # 'accepted': True})
  70. # # if team_member_serializer.is_valid():
  71. # # team_member_serializer.save()
  72. # # except KeyError:
  73. # # instance.delete()
  74. # # raise
  75. # return instance
  76. class ProjectTagSerializer(serializers.ModelSerializer):
  77. class Meta:
  78. model = ProjectTag
  79. exclude = ('project',)
  80. def __init__(self, *args, **kwargs):
  81. kwargs['partial'] = True
  82. super(self.__class__, self).__init__(*args, **kwargs)
  83. class ProjectSerializer(serializers.ModelSerializer):
  84. tags = ProjectTagSerializer(many=True, required=False)
  85. owner = serializers.PrimaryKeyRelatedField(
  86. read_only=True,
  87. default=serializers.CreateOnlyDefault(
  88. serializers.CurrentUserDefault()))
  89. class Meta:
  90. model = Project
  91. exclude = ()
  92. def __init__(self, *args, **kwargs):
  93. print(kwargs)
  94. kwargs['partial'] = True
  95. super(self.__class__, self).__init__(*args, **kwargs)
  96. class ProjectPendingApprovalSerializer(serializers.ModelSerializer):
  97. tags = ProjectTagSerializer(many=True, required=False)
  98. owner = serializers.PrimaryKeyRelatedField(
  99. read_only=True,
  100. default=serializers.CreateOnlyDefault(
  101. serializers.CurrentUserDefault()))
  102. class Meta:
  103. model = Project
  104. exclude = ()
  105. class ProjectUserPermissionSerializer(serializers.ModelSerializer):
  106. class Meta:
  107. model = ProjectUserPermission
  108. exclude = ()
  109. def __init__(self, *args, **kwargs):
  110. kwargs['partial'] = True
  111. super(self.__class__, self).__init__(*args, **kwargs)
  112. class ProjectUserDetailedSerializer(serializers.ModelSerializer):
  113. user = UserTeamProjectSerializer(required=False)
  114. permissions = ProjectUserPermissionSerializer(many=True, required=False)
  115. creator = serializers.PrimaryKeyRelatedField(
  116. read_only=True,
  117. default=serializers.CreateOnlyDefault(
  118. serializers.CurrentUserDefault()))
  119. class Meta:
  120. model = ProjectUser
  121. exclude = ()
  122. class ProjectUserSerializer(serializers.ModelSerializer):
  123. permissions = ProjectUserPermissionSerializer(many=True, required=False)
  124. creator = serializers.PrimaryKeyRelatedField(
  125. read_only=True,
  126. default=serializers.CreateOnlyDefault(
  127. serializers.CurrentUserDefault()))
  128. class Meta:
  129. model = ProjectUser
  130. exclude = ()
  131. def __init__(self, *args, **kwargs):
  132. kwargs['partial'] = True
  133. super(self.__class__, self).__init__(*args, **kwargs)
  134. class UserProjectInviteSerializer(serializers.ModelSerializer):
  135. creator = serializers.PrimaryKeyRelatedField(
  136. read_only=True,
  137. default=serializers.CreateOnlyDefault(
  138. serializers.CurrentUserDefault()))
  139. class Meta:
  140. model = UserProjectInvite
  141. exclude = ()
  142. def __init__(self, *args, **kwargs):
  143. kwargs['partial'] = True
  144. super(self.__class__, self).__init__(*args, **kwargs)
  145. def validate(self, data):
  146. if data.get('email', '').strip() == '':
  147. raise ValidationError(_('email field may not be empty'))
  148. if User.objects.filter(email=data.get('email')).exists():
  149. raise ValidationError(
  150. _('Cannot invite an already registered email'))
  151. if self.Meta.model.objects.filter(
  152. email=data.get('email')).exists():
  153. raise ValidationError(
  154. _('There is a pending invite for this email'))
  155. return data
  156. class UserTeamInviteSerializer(serializers.ModelSerializer):
  157. creator = serializers.PrimaryKeyRelatedField(
  158. read_only=True,
  159. default=serializers.CreateOnlyDefault(
  160. serializers.CurrentUserDefault()))
  161. class Meta:
  162. model = UserTeamInvite
  163. exclude = ()
  164. def __init__(self, *args, **kwargs):
  165. kwargs['partial'] = True
  166. super(self.__class__, self).__init__(*args, **kwargs)
  167. def validate(self, data):
  168. if data.get('email', '').strip() == '':
  169. raise ValidationError(_('email field may not be empty'))
  170. if User.objects.filter(email=data.get('email')).exists():
  171. raise ValidationError(
  172. _('Cannot invite an already registered email'))
  173. if self.Meta.model.objects.filter(
  174. email=data.get('email')).exists():
  175. raise ValidationError(
  176. _('There is a pending invite for this email'))
  177. return data