idempotent push device token
[wolnelektury.git] / src / push / api / views.py
1 from rest_framework import serializers
2 from rest_framework.generics import ListCreateAPIView
3 from rest_framework.permissions import IsAuthenticated
4 from api.utils import never_cache
5 from api.fields import AbsoluteURLField
6 from push import models
7
8
9 class DeviceTokenSerializer(serializers.ModelSerializer):
10     deleted = serializers.BooleanField(default=False, write_only=True)
11     # Explicit definition to disable unique validator.
12     token = serializers.CharField()
13
14     class Meta:
15         model = models.DeviceToken
16         fields = ['token', 'created_at', 'updated_at', 'deleted']
17         read_only_fields = ['created_at', 'updated_at']
18
19     def save(self):
20         if self.validated_data['deleted']:
21             self.destroy(self.validated_data)
22         else:
23             return self.create(self.validated_data)
24
25     def create(self, validated_data):
26         obj, created = models.DeviceToken.objects.get_or_create(
27             user=self.context['request'].user,
28             token=validated_data['token'],
29         )
30         return obj
31
32     def destroy(self, validated_data):
33         models.DeviceToken.objects.filter(
34             user=self.context['request'].user,
35             token=validated_data['token']
36         ).delete()
37
38 @never_cache
39 class DeviceTokensView(ListCreateAPIView):
40     permission_classes = [IsAuthenticated]
41     serializer_class = DeviceTokenSerializer
42
43     def get_queryset(self):
44         return models.DeviceToken.objects.filter(user=self.request.user)