o
    -gn/                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlm	Z	 dd Z
dd	 ZG d
d dZG dd dZG dd dZG dd dZG dd deZG dd deZG dd deZdS )aK  
We perform uniqueness checks explicitly on the serializer class, rather
the using Django's `.full_clean()`.

This gives us better separation of concerns, allows us to use single-step
object creation, and makes it possible to switch between using the implicit
`ModelSerializer` class and an equivalent explicit `Serializer` class.
    )	DataError)gettext_lazy)ValidationError)
smart_reprc              
   C   s&   z|   W S  tttfy   Y dS w )NF)exists	TypeError
ValueErrorr   )queryset r
   Z/var/www/html/django-vendor/venv/lib/python3.10/site-packages/rest_framework/validators.py	qs_exists   s
   
r   c              
   K   s4   z	| j di |W S  tttfy   |   Y S w )Nr
   )filterr   r   r   none)r	   kwargsr
   r
   r   	qs_filter   s
   r   c                   @   sN   e Zd ZdZedZdZdddZdd	 Zd
d Z	dd Z
dd Zdd ZdS )UniqueValidatorz
    Validator that corresponds to `unique=True` on a model field.

    Should be applied to an individual field on the serializer.
    zThis field must be unique.TNexactc                 C   s   || _ |p| j| _|| _d S N)r	   messagelookup)selfr	   r   r   r
   r
   r   __init__*   s   
zUniqueValidator.__init__c                 C   s"   d|| j f |i}t|fi |S )zT
        Filter the queryset to all instances matching the given attribute.
        z%s__%s)r   r   )r   valuer	   
field_namefilter_kwargsr
   r
   r   filter_queryset/   s   zUniqueValidator.filter_querysetc                 C   s   |dur|j |jdS |S z}
        If an instance is being updated, then do not include
        that instance itself as a uniqueness conflict.
        N)pkexcluder   )r   r	   instancer
   r
   r   exclude_current_instance6      z(UniqueValidator.exclude_current_instancec                 C   sR   |j d }t|jdd }| j}| |||}| ||}t|r't| jddd S )Nr    uniquecode)	source_attrsgetattrparentr	   r   r!   r   r   r   )r   r   serializer_fieldr   r    r	   r
   r
   r   __call__?   s   
zUniqueValidator.__call__c                 C   s   d| j jt| jf S )Nz<%s(queryset=%s)>)	__class____name__r   r	   r   r
   r
   r   __repr__L   s   zUniqueValidator.__repr__c                 C   s@   t || jstS | j|jko| j|jko| j|jko| j|jkS r   )
isinstancer,   NotImplementedr   requires_contextr	   r   r   otherr
   r
   r   __eq__R   s   


zUniqueValidator.__eq__)Nr   )r-   
__module____qualname____doc___r   r2   r   r   r!   r+   r/   r5   r
   r
   r
   r   r   !   s    
	r   c                   @   s^   e Zd ZdZedZedZdZdddZdd	 Z	d
d Z
dd Zdd Zdd Zdd ZdS )UniqueTogetherValidatorz
    Validator that corresponds to `unique_together = (...)` on a model class.

    Should be applied to the serializer class, not to an individual field.
    z0The fields {field_names} must make a unique set.This field is required.TNc                 C   s   || _ || _|p
| j| _d S r   )r	   fieldsr   )r   r	   r<   r   r
   r
   r   r   f   s   z UniqueTogetherValidator.__init__c                    s:   j durdS  fddjD }|rt|dddS )z~
        The `UniqueTogetherValidator` always forces an implied 'required'
        state on the fields it applies to.
        Nc                    s$   i | ]}j | j vr|jqS r
   )r<   sourcemissing_message.0r   attrsr   
serializerr
   r   
<dictcomp>s   s
    zCUniqueTogetherValidator.enforce_required_fields.<locals>.<dictcomp>requiredr%   )r    r<   r   )r   rB   rC   missing_itemsr
   rA   r   enforce_required_fieldsk   s   
z/UniqueTogetherValidator.enforce_required_fieldsc                    sb   fdd| j D }jdur |D ]}| vrtj| |< q fdd|D }t|fi |S )zU
        Filter the queryset to all instances matching the given attributes.
        c                    s   g | ]} j | jqS r
   )r<   r=   r?   )rC   r
   r   
<listcomp>   s    
z;UniqueTogetherValidator.filter_queryset.<locals>.<listcomp>Nc                    s   i | ]}| | qS r
   r
   )r@   r=   )rB   r
   r   rD      s    z;UniqueTogetherValidator.filter_queryset.<locals>.<dictcomp>)r<   r    r(   r   )r   rB   r	   rC   sourcesr=   r   r
   )rB   rC   r   r   {   s   


z'UniqueTogetherValidator.filter_querysetc                 C      |dur|j |jdS |S r   r   r   rB   r	   r    r
   r
   r   r!      r"   z0UniqueTogetherValidator.exclude_current_instancec                    s     |  j} ||} ||j}jd u r) fdd| D }n fdd| D }|rRd |vrTt|rVd j} j	j
|d}t|ddd S d S d S )Nc                    s   g | ]\}}| j v r|qS r
   )r<   r@   fieldr   r.   r
   r   rH      s    z4UniqueTogetherValidator.__call__.<locals>.<listcomp>c                    s.   g | ]\}}| j v r|tj|kr|qS r
   )r<   r(   r    rL   r   rC   r
   r   rH      s
    z, )field_namesr$   r%   )rG   r	   r   r!   r    itemsr   joinr<   r   formatr   )r   rB   rC   r	   checked_valuesrO   r   r
   rN   r   r+      s    

z UniqueTogetherValidator.__call__c                 C   s   d| j jt| jt| jf S )Nz<%s(queryset=%s, fields=%s)>)r,   r-   r   r	   r<   r.   r
   r
   r   r/      s
   z UniqueTogetherValidator.__repr__c                 C   sL   t || jstS | j|jko%| j|jko%| j|jko%| j|jko%| j|jkS r   )r0   r,   r1   r   r2   r>   r	   r<   r3   r
   r
   r   r5      s   



zUniqueTogetherValidator.__eq__r   )r-   r6   r7   r8   r9   r   r>   r2   r   rG   r   r!   r+   r/   r5   r
   r
   r
   r   r:   \   s    
	r:   c                   @   s(   e Zd ZedZdZdd Zdd ZdS )$ProhibitSurrogateCharactersValidatorz7Surrogate characters are not allowed: U+{code_point:X}. surrogate_characters_not_allowedc                 C   s:   dd t |D D ]}| jjt|d}t|| jdd S )Nc                 s   s0    | ]}d t |  krdkrn n|V  qdS )i   i  N)ord)r@   chr
   r
   r   	<genexpr>   s    z@ProhibitSurrogateCharactersValidator.__call__.<locals>.<genexpr>)
code_pointr%   )strr   rR   rV   r   r&   )r   r   surrogate_characterr   r
   r
   r   r+      s   z-ProhibitSurrogateCharactersValidator.__call__c                 C   s(   t || jstS | j|jko| j|jkS r   )r0   r,   r1   r   r&   r3   r
   r
   r   r5      s
   
z+ProhibitSurrogateCharactersValidator.__eq__N)r-   r6   r7   r9   r   r&   r+   r5   r
   r
   r
   r   rT      s
    rT   c                   @   sV   e Zd ZdZedZdZdddZdd Zdd	 Z	d
d Z
dd Zdd Zdd ZdS )BaseUniqueForValidatorNr;   Tc                 C   s"   || _ || _|| _|p| j| _d S r   )r	   rM   
date_fieldr   )r   r	   rM   r]   r   r
   r
   r   r      s   zBaseUniqueForValidator.__init__c                    s0    fddj jfD }|rt|dddS )z
        The `UniqueFor<Range>Validator` classes always force an implied
        'required' state on the fields they are applied to.
        c                    s   i | ]
}| vr|j qS r
   )r>   r?   rB   r   r
   r   rD      s
    zBBaseUniqueForValidator.enforce_required_fields.<locals>.<dictcomp>rE   r%   N)rM   r]   r   )r   rB   rF   r
   r^   r   rG      s   
z.BaseUniqueForValidator.enforce_required_fieldsc                 C   s   t d)Nz&`filter_queryset` must be implemented.)NotImplementedError)r   rB   r	   r   date_field_namer
   r
   r   r      s   z&BaseUniqueForValidator.filter_querysetc                 C   rJ   r   r   rK   r
   r
   r   r!      r"   z/BaseUniqueForValidator.exclude_current_instancec                 C   s   |j | j jd }|j | j jd }| | | j}| ||||}| |||j}t	|r?| j
j| jd}t| j|iddd S )Nr#   )r]   r$   r%   )r<   rM   r'   r]   rG   r	   r   r!   r    r   r   rR   r   )r   rB   rC   r   r`   r	   r   r
   r
   r   r+      s   
zBaseUniqueForValidator.__call__c                 C   sX   t || jstS | j|jko+| j|jko+| j|jko+| j|jko+| j|jko+| j|jkS r   )	r0   r,   r1   r   r>   r2   r	   rM   r]   r3   r
   r
   r   r5     s   




zBaseUniqueForValidator.__eq__c                 C   s&   d| j jt| jt| jt| jf S )Nz*<%s(queryset=%s, field=%s, date_field=%s)>)r,   r-   r   r	   rM   r]   r.   r
   r
   r   r/     s   zBaseUniqueForValidator.__repr__r   )r-   r6   r7   r   r9   r>   r2   r   rG   r   r!   r+   r5   r/   r
   r
   r
   r   r\      s    
	r\   c                   @      e Zd ZedZdd ZdS )UniqueForDateValidatorz6This field must be unique for the "{date_field}" date.c                 C   sZ   || j  }|| j }i }|||< |j|d| < |j|d| < |j|d| < t|fi |S )Nz%s__day	%s__month%s__year)rM   r]   daymonthyearr   r   rB   r	   r   r`   r   dater   r
   r
   r   r   #  s   

z&UniqueForDateValidator.filter_querysetNr-   r6   r7   r9   r   r   r
   r
   r
   r   rb          rb   c                   @   ra   )UniqueForMonthValidatorz7This field must be unique for the "{date_field}" month.c                 C   >   || j  }|| j }i }|||< |j|d| < t|fi |S )Nrc   )rM   r]   rf   r   rh   r
   r
   r   r   2     

z'UniqueForMonthValidator.filter_querysetNrj   r
   r
   r
   r   rl   /  rk   rl   c                   @   ra   )UniqueForYearValidatorz6This field must be unique for the "{date_field}" year.c                 C   rm   )Nrd   )rM   r]   rg   r   rh   r
   r
   r   r   ?  rn   z&UniqueForYearValidator.filter_querysetNrj   r
   r
   r
   r   ro   <  rk   ro   N)r8   	django.dbr   django.utils.translationr   r9   rest_framework.exceptionsr   #rest_framework.utils.representationr   r   r   r   r:   rT   r\   rb   rl   ro   r
   r
   r
   r   <module>   s    ;jH