Incoming invitations: implement incoming invitations and accepting them

This commit is contained in:
Tom Hacohen
2020-05-20 15:15:24 +03:00
parent 8d1c02dcb9
commit 47e1eec122
3 changed files with 63 additions and 6 deletions

View File

@@ -268,18 +268,20 @@ class CollectionInvitationSerializer(serializers.ModelSerializer):
slug_field=User.USERNAME_FIELD,
queryset=User.objects
)
collection = serializers.SlugRelatedField(
source='fromMember__collection',
slug_field='uid',
read_only=True,
)
fromPubkey = BinaryBase64Field(source='fromMember__user__userinfo__pubkey', read_only=True)
collection = serializers.SerializerMethodField('get_collection')
fromPubkey = serializers.SerializerMethodField('get_from_pubkey')
signedEncryptionKey = BinaryBase64Field()
class Meta:
model = models.CollectionInvitation
fields = ('username', 'uid', 'collection', 'signedEncryptionKey', 'accessLevel', 'fromPubkey', 'version')
def get_collection(self, obj):
return obj.collection.uid
def get_from_pubkey(self, obj):
return b64encode(obj.fromMember.user.userinfo.pubkey)
def create(self, validated_data):
collection = self.context['collection']
request = self.context['request']
@@ -301,6 +303,30 @@ class CollectionInvitationSerializer(serializers.ModelSerializer):
return instance
class InvitationAcceptSerializer(serializers.Serializer):
encryptionKey = BinaryBase64Field()
def create(self, validated_data):
with transaction.atomic():
invitation = self.context['invitation']
encryption_key = validated_data.get('encryptionKey')
member = models.CollectionMember.objects.create(
collection=invitation.collection,
user=invitation.user,
accessLevel=invitation.accessLevel,
encryptionKey=encryption_key,
)
invitation.delete()
return member
def update(self, instance, validated_data):
raise NotImplementedError()
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User