You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
4.7 KiB
Python
125 lines
4.7 KiB
Python
# Copyright (C) 2021-2022 Intel Corporation
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
from django.contrib.auth import get_user_model
|
|
from django.core.exceptions import ObjectDoesNotExist
|
|
from rest_framework import serializers
|
|
from .models import Invitation, Membership, Organization
|
|
from cvat.apps.engine.serializers import BasicUserSerializer
|
|
|
|
class OrganizationReadSerializer(serializers.ModelSerializer):
|
|
owner = BasicUserSerializer()
|
|
class Meta:
|
|
model = Organization
|
|
fields = ['id', 'slug', 'name', 'description', 'created_date',
|
|
'updated_date', 'contact', 'owner']
|
|
read_only_fields = fields
|
|
|
|
class OrganizationWriteSerializer(serializers.ModelSerializer):
|
|
def to_representation(self, instance):
|
|
serializer = OrganizationReadSerializer(instance, context=self.context)
|
|
return serializer.data
|
|
|
|
class Meta:
|
|
model = Organization
|
|
fields = ['id', 'slug', 'name', 'description', 'created_date',
|
|
'updated_date', 'contact', 'owner']
|
|
|
|
# TODO: at the moment isn't possible to change the owner. It should
|
|
# be a separate feature. Need to change it together with corresponding
|
|
# Membership. Also such operation should be well protected.
|
|
read_only_fields = ['created_date', 'updated_date', 'owner']
|
|
|
|
def create(self, validated_data):
|
|
organization = super().create(validated_data)
|
|
Membership.objects.create(
|
|
user=organization.owner,
|
|
organization=organization,
|
|
is_active=True,
|
|
joined_date=organization.created_date,
|
|
role=Membership.OWNER)
|
|
|
|
return organization
|
|
|
|
class InvitationReadSerializer(serializers.ModelSerializer):
|
|
role = serializers.ChoiceField(Membership.role.field.choices,
|
|
source='membership.role')
|
|
user = BasicUserSerializer(source='membership.user')
|
|
organization = serializers.PrimaryKeyRelatedField(
|
|
queryset=Organization.objects.all(),
|
|
source='membership.organization')
|
|
owner = BasicUserSerializer()
|
|
|
|
class Meta:
|
|
model = Invitation
|
|
fields = ['key', 'created_date', 'owner', 'role', 'user', 'organization']
|
|
read_only_fields = fields
|
|
|
|
|
|
class InvitationWriteSerializer(serializers.ModelSerializer):
|
|
role = serializers.ChoiceField(Membership.role.field.choices,
|
|
source='membership.role')
|
|
email = serializers.EmailField(source='membership.user.email')
|
|
organization = serializers.PrimaryKeyRelatedField(
|
|
source='membership.organization', read_only=True)
|
|
|
|
def to_representation(self, instance):
|
|
serializer = InvitationReadSerializer(instance, context=self.context)
|
|
return serializer.data
|
|
|
|
class Meta:
|
|
model = Invitation
|
|
fields = ['key', 'created_date', 'owner', 'role', 'organization', 'email']
|
|
read_only_fields = ['key', 'created_date', 'owner', 'organization']
|
|
|
|
def create(self, validated_data):
|
|
membership_data = validated_data.pop('membership')
|
|
organization = validated_data.pop('organization')
|
|
try:
|
|
user = get_user_model().objects.get(
|
|
email__iexact=membership_data['user']['email'])
|
|
del membership_data['user']
|
|
except ObjectDoesNotExist:
|
|
raise serializers.ValidationError(f'You cannot invite an user '
|
|
f'with {membership_data["user"]["email"]} email. It is not '
|
|
f'a valid email in the system.')
|
|
|
|
membership, created = Membership.objects.get_or_create(
|
|
defaults=membership_data,
|
|
user=user, organization=organization)
|
|
if not created:
|
|
raise serializers.ValidationError('The user is a member of '
|
|
'the organization already.')
|
|
invitation = Invitation.objects.create(**validated_data,
|
|
membership=membership)
|
|
|
|
return invitation
|
|
|
|
def update(self, instance, validated_data):
|
|
return super().update(instance, {})
|
|
|
|
def save(self, **kwargs):
|
|
invitation = super().save(**kwargs)
|
|
invitation.send()
|
|
|
|
return invitation
|
|
|
|
class MembershipReadSerializer(serializers.ModelSerializer):
|
|
user = BasicUserSerializer()
|
|
class Meta:
|
|
model = Membership
|
|
fields = ['id', 'user', 'organization', 'is_active', 'joined_date', 'role',
|
|
'invitation']
|
|
read_only_fields = fields
|
|
|
|
class MembershipWriteSerializer(serializers.ModelSerializer):
|
|
def to_representation(self, instance):
|
|
serializer = MembershipReadSerializer(instance, context=self.context)
|
|
return serializer.data
|
|
|
|
class Meta:
|
|
model = Membership
|
|
fields = ['id', 'user', 'organization', 'is_active', 'joined_date', 'role']
|
|
read_only_fields = ['user', 'organization', 'is_active', 'joined_date']
|