33from rest_framework .response import Response
44from rest_framework .serializers import ModelSerializer , Serializer , ValidationError
55from rest_framework .viewsets import ModelViewSet
6-
7- from ..fields import UNSIGNED_64BIT_INT_MAX_VALUE , hex_re
8- from ..models import APNSDevice , GCMDevice , WebPushDevice , WNSDevice
9- from ..settings import PUSH_NOTIFICATIONS_SETTINGS as SETTINGS
6+ from typing import Any
7+ from push_notifications .fields import UNSIGNED_64BIT_INT_MAX_VALUE , hex_re
8+ from push_notifications .models import APNSDevice , GCMDevice , WebPushDevice , WNSDevice
9+ from push_notifications .settings import PUSH_NOTIFICATIONS_SETTINGS as SETTINGS
10+ from django .db .models import QuerySet
1011
1112
1213# Fields
@@ -15,16 +16,16 @@ class HexIntegerField(IntegerField):
1516 Store an integer represented as a hex string of form "0x01".
1617 """
1718
18- def to_internal_value (self , data ) :
19+ def to_internal_value (self , data : str | int ) -> int :
1920 # validate hex string and convert it to the unsigned
2021 # integer representation for internal use
2122 try :
22- data = int (data , 16 ) if type (data ) != int else data
23+ data = int (data , 16 ) if not isinstance (data , int ) else data
2324 except ValueError :
2425 raise ValidationError ("Device ID is not a valid hex number" )
2526 return super ().to_internal_value (data )
2627
27- def to_representation (self , value ) :
28+ def to_representation (self , value : int ) -> int :
2829 return value
2930
3031
@@ -45,7 +46,7 @@ class APNSDeviceSerializer(ModelSerializer):
4546 class Meta (DeviceSerializerMixin .Meta ):
4647 model = APNSDevice
4748
48- def validate_registration_id (self , value ) :
49+ def validate_registration_id (self , value : str ) -> str :
4950
5051 # https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622958-application
5152 # As of 02/2023 APNS tokens (registration_id) "are of variable length. Do not hard-code their size."
@@ -56,7 +57,7 @@ def validate_registration_id(self, value):
5657
5758
5859class UniqueRegistrationSerializerMixin (Serializer ):
59- def validate (self , attrs ) :
60+ def validate (self , attrs : dict [ str , Any ]) -> dict [ str , Any ] :
6061 devices = None
6162 primary_key = None
6263 request_method = None
@@ -103,7 +104,7 @@ class Meta(DeviceSerializerMixin.Meta):
103104 )
104105 extra_kwargs = {"id" : {"read_only" : False , "required" : False }}
105106
106- def validate_device_id (self , value ) :
107+ def validate_device_id (self , value : int ) -> int :
107108 # device ids are 64 bit unsigned values
108109 if value > UNSIGNED_64BIT_INT_MAX_VALUE :
109110 raise ValidationError ("Device ID is out of range" )
@@ -126,7 +127,7 @@ class Meta(DeviceSerializerMixin.Meta):
126127
127128# Permissions
128129class IsOwner (permissions .BasePermission ):
129- def has_object_permission (self , request , view , obj ) :
130+ def has_object_permission (self , request : Any , view : Any , obj : Any ) -> bool :
130131 # must be the owner to view the object
131132 return obj .user == request .user
132133
@@ -135,7 +136,7 @@ def has_object_permission(self, request, view, obj):
135136class DeviceViewSetMixin :
136137 lookup_field = "registration_id"
137138
138- def create (self , request , * args , ** kwargs ) :
139+ def create (self , request : Any , * args : Any , ** kwargs : Any ) -> Response :
139140 serializer = None
140141 is_update = False
141142 if SETTINGS .get ("UPDATE_ON_DUPLICATE_REG_ID" ) and self .lookup_field in request .data :
@@ -157,12 +158,12 @@ def create(self, request, *args, **kwargs):
157158 headers = self .get_success_headers (serializer .data )
158159 return Response (serializer .data , status = status .HTTP_201_CREATED , headers = headers )
159160
160- def perform_create (self , serializer ) :
161+ def perform_create (self , serializer : ModelSerializer ) -> None :
161162 if self .request .user .is_authenticated :
162163 serializer .save (user = self .request .user )
163164 return super ().perform_create (serializer )
164165
165- def perform_update (self , serializer ) :
166+ def perform_update (self , serializer : ModelSerializer ) -> None :
166167 if self .request .user .is_authenticated :
167168 serializer .save (user = self .request .user )
168169 return super ().perform_update (serializer )
@@ -171,7 +172,7 @@ def perform_update(self, serializer):
171172class AuthorizedMixin :
172173 permission_classes = (permissions .IsAuthenticated , IsOwner )
173174
174- def get_queryset (self ):
175+ def get_queryset (self ) -> QuerySet :
175176 # filter all devices to only those belonging to the current user
176177 return self .queryset .filter (user = self .request .user )
177178
0 commit comments