o
    54g                     @   s  d dl mZmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZ ddlmZmZ ddlmZmZmZmZ dd	lmZ G d
d deZG dd deZG dd deZG dd de	ZG dd deeZG dd deeZG dd deeZG dd dejZ G dd dZ!G dd dZ"G dd de!eZ#G d d! d!e"e#Z$G d"d# d#e!eZ%G d$d% d%e"e%Z&G d&d' d'e!eZ'G d(d) d)e"e'Z(G d*d+ d+e!eZ)G d,d- d-e"e)Z*d.S )/    )permissionsstatus)IntegerField)Response)ModelSerializer
SerializerValidationError)ModelViewSet   )UNSIGNED_64BIT_INT_MAX_VALUEhex_re)
APNSDevice	GCMDeviceWebPushDevice	WNSDevice)PUSH_NOTIFICATIONS_SETTINGSc                       s(   e Zd ZdZ fddZdd Z  ZS )HexIntegerFieldz@
	Store an integer represented as a hex string of form "0x01".
	c                    sB   zt |tkrt|dn|}W n ty   tdw t |S )N   z#Device ID is not a valid hex number)typeint
ValueErrorr   superto_internal_value)selfdata	__class__ k/var/www/html/notificationserver/venv/lib/python3.10/site-packages/push_notifications/api/rest_framework.pyr      s   z!HexIntegerField.to_internal_valuec                 C   s   |S Nr   r   valuer   r   r   to_representation   s   z!HexIntegerField.to_representation)__name__
__module____qualname____doc__r   r"   __classcell__r   r   r   r   r      s    	r   c                   @   s   e Zd ZG dd dZdS )DeviceSerializerMixinc                   @   s    e Zd ZdZdZdddiiZdS )zDeviceSerializerMixin.Meta)idnameapplication_idregistration_id	device_idactivedate_created)r/   r.   defaultTN)r#   r$   r%   fieldsread_only_fieldsextra_kwargsr   r   r   r   Meta!   s    r4   N)r#   r$   r%   r4   r   r   r   r   r(       s    r(   c                   @   s&   e Zd ZG dd dejZdd ZdS )APNSDeviceSerializerc                   @      e Zd ZeZdS )zAPNSDeviceSerializer.MetaN)r#   r$   r%   r   modelr   r   r   r   r4   -       r4   c                 C   s   t |d u rtd|S )Nz)Registration ID (device token) is invalid)r   matchr   r    r   r   r   validate_registration_id0   s   z-APNSDeviceSerializer.validate_registration_idN)r#   r$   r%   r(   r4   r:   r   r   r   r   r5   ,   s    r5   c                   @      e Zd Zdd ZdS )!UniqueRegistrationSerializerMixinc                 C   s   d }d }d }| j dd r| jrd}| jj}nd}n| jd jdv r)d}| jj}n
| jd jdkr3d}| jj}|dkrO|d| jj}|j	j
|dj|d}n|dkr\|j	j
|d d}|rdtdd	i|S )
Nr,   updatecreaterequest)PUTPATCHPOSTr,   )r)   zThis field must be unique.)initial_datagetinstancer)   contextmethodr4   r7   r,   objectsfilterexcluder   )r   attrsdevicesprimary_keyrequest_methodDevicereg_idr   r   r   validate;   s0   

z*UniqueRegistrationSerializerMixin.validateN)r#   r$   r%   rR   r   r   r   r   r<   :       r<   c                   @   s:   e Zd ZedddidddZG dd dejZd	d
 ZdS )GCMDeviceSerializerz7ANDROID_ID / TelephonyManager.getDeviceId() (e.g: 0x01)
input_typetextFT)	help_textstylerequired
allow_nullc                   @   s"   e Zd ZeZdZddddiZdS )zGCMDeviceSerializer.Meta)r)   r*   r,   r-   r.   r/   cloud_message_typer+   r)   F)	read_onlyrY   N)r#   r$   r%   r   r7   r1   r3   r   r   r   r   r4   b   s    r4   c                 C   s   |t krtd|S )NzDevice ID is out of range)r   r   r    r   r   r   validate_device_idj   s   z&GCMDeviceSerializer.validate_device_idN)r#   r$   r%   r   r-   r(   r4   r]   r   r   r   r   rT   Z   s    rT   c                   @      e Zd ZG dd dejZdS )WNSDeviceSerializerc                   @   r6   )zWNSDeviceSerializer.MetaN)r#   r$   r%   r   r7   r   r   r   r   r4   r   r8   r4   Nr#   r$   r%   r(   r4   r   r   r   r   r_   q       r_   c                   @   r^   )WebPushDeviceSerializerc                   @   s   e Zd ZeZdZdS )zWebPushDeviceSerializer.Meta)	r)   r*   r,   r.   r/   p256dhauthbrowserr+   N)r#   r$   r%   r   r7   r1   r   r   r   r   r4   w   s    r4   Nr`   r   r   r   r   rb   v   ra   rb   c                   @   r;   )IsOwnerc                 C   s   |j |j kS r   user)r   r?   viewobjr   r   r   has_object_permission   s   zIsOwner.has_object_permissionN)r#   r$   r%   rk   r   r   r   r   rf      rS   rf   c                       s4   e Zd ZdZdd Z fddZ fddZ  ZS )DeviceViewSetMixinr,   c                 O   s   d }d}t dr*| j|jv r*| jjjj|j| j d }|r*| j	||jd}d}|s3| j	|jd}|j
dd |rE| | t|jS | | | |j}t|jtj|dS )NFUPDATE_ON_DUPLICATE_REG_IDrC   )r   T)raise_exception)r   headers)SETTINGSrE   lookup_fieldr   querysetr7   rI   rJ   firstget_serializeris_validperform_updater   perform_createget_success_headersr   HTTP_201_CREATED)r   r?   argskwargs
serializer	is_updaterF   ro   r   r   r   r>      s(   




zDeviceViewSetMixin.createc                    &   | j jjr|j| j jd t |S Nrg   )r?   rh   is_authenticatedsaver   rw   r   r|   r   r   r   rw         
z!DeviceViewSetMixin.perform_createc                    r~   r   )r?   rh   r   r   r   rv   r   r   r   r   rv      r   z!DeviceViewSetMixin.perform_update)r#   r$   r%   rq   r>   rw   rv   r'   r   r   r   r   rl      s
    rl   c                   @   s   e Zd ZejefZdd ZdS )AuthorizedMixinc                 C   s   | j j| jjdS r   )rr   rJ   r?   rh   )r   r   r   r   get_queryset   s   zAuthorizedMixin.get_querysetN)r#   r$   r%   r   IsAuthenticatedrf   permission_classesr   r   r   r   r   r      s    
r   c                   @      e Zd Zej ZeZdS )APNSDeviceViewSetN)	r#   r$   r%   r   rI   allrr   r5   serializer_classr   r   r   r   r          
r   c                   @      e Zd ZdS )APNSDeviceAuthorizedViewSetNr#   r$   r%   r   r   r   r   r          r   c                   @   r   )GCMDeviceViewSetN)	r#   r$   r%   r   rI   r   rr   rT   r   r   r   r   r   r      r   r   c                   @   r   )GCMDeviceAuthorizedViewSetNr   r   r   r   r   r      r   r   c                   @   r   )WNSDeviceViewSetN)	r#   r$   r%   r   rI   r   rr   r_   r   r   r   r   r   r      r   r   c                   @   r   )WNSDeviceAuthorizedViewSetNr   r   r   r   r   r      r   r   c                   @   r   )WebPushDeviceViewSetN)	r#   r$   r%   r   rI   r   rr   rb   r   r   r   r   r   r      r   r   c                   @   r   )WebPushDeviceAuthorizedViewSetNr   r   r   r   r   r      r   r   N)+rest_frameworkr   r   rest_framework.fieldsr   rest_framework.responser   rest_framework.serializersr   r   r   rest_framework.viewsetsr	   r1   r   r   modelsr   r   r   r   settingsr   rp   r   r(   r5   r<   rT   r_   rb   BasePermissionrf   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s4     
$	