o
    =h3                     @   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l
mZ ddlmZ dd	 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.
    )
FieldError)	DataError)Exists)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   Q/var/www/ecommerce/venv/lib/python3.10/site-packages/rest_framework/validators.py	qs_exists   s
   
r   c                 C   sH   |d u rt | S z|t| |@ |W S  ttttfy#   Y dS w r   )r   r   filtercheckr
   r   r   r   )r   	conditionagainstr   r   r   qs_exists_with_condition   s   r   c              
   K   s4   z	| j di |W S  tttfy   |   Y S w )Nr   )r   r
   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__7   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_instanceC      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__L   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__Y   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   )
isinstancer3   NotImplementedr   requires_contextr   r   r   otherr   r   r   __eq___   s   


zUniqueValidator.__eq__)Nr   )r4   
__module____qualname____doc___r   r9   r   r"   r(   r2   r6   r<   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   s4   || _ || _|p
| j| _|d u rg n|| _|| _d S r   )r   fieldsr   condition_fieldsr   )r   r   rC   r   rD   r   r   r   r   r   s   s
   
z UniqueTogetherValidator.__init__c                    sF   j durdS  fddg jjR 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   )rC   sourcemissing_message.0r    attrsr   
serializerr   r   
<dictcomp>   s
    zCUniqueTogetherValidator.enforce_required_fields.<locals>.<dictcomp>requiredr,   )r'   rC   rD   r   )r   rJ   rK   missing_itemsr   rI   r   enforce_required_fieldsz   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                       g | ]} j | jqS r   rC   rE   rG   rK   r   r   
<listcomp>   s    
z;UniqueTogetherValidator.filter_queryset.<locals>.<listcomp>Nc                       i | ]}| | qS r   r   rH   rE   rJ   r   r   rL      s    z;UniqueTogetherValidator.filter_queryset.<locals>.<dictcomp>)rC   r'   r/   r   )r   rJ   r   rK   sourcesrE   r!   r   rJ   rK   r   r"      s   


z'UniqueTogetherValidator.filter_querysetc                 C      |dur|j |jdS |S r#   r%   r   rJ   r   r'   r   r   r   r(      r)   z0UniqueTogetherValidator.exclude_current_instancec           	         s   |    | j}|  |}|  |j}fdd| jD }jd u r1 fdd|D }n
 fdd|D } fdd| jD }|red |vrgt|| j|rid	| j}| j
j|d}t|d	d
d S d S d S )Nc                    rP   r   rQ   rG   rR   r   r   rS      s    z4UniqueTogetherValidator.__call__.<locals>.<listcomp>c                    s   g | ]} | qS r   r   rG   rV   r   r   rS      s    c                    s(   g | ]} | t j|kr | qS r   )r/   r'   rG   rX   r   r   rS      s
    c                    rT   r   r   rU   rV   r   r   rL      s    z4UniqueTogetherValidator.__call__.<locals>.<dictcomp>, )field_namesr+   r,   )rO   r   r"   r(   r'   rC   rD   r   r   joinr   formatr   )	r   rJ   rK   r   checked_nameschecked_valuescondition_kwargsr\   r   r   rX   r   r2      s$   

z UniqueTogetherValidator.__call__c                    s$   d  jjd fdddD S )Nz<{}({})>r[   c                 3   s6    | ]}t  |d ur| dtt  | V  qd S )N=)r/   r   )rH   attrr5   r   r   	<genexpr>   s    z3UniqueTogetherValidator.__repr__.<locals>.<genexpr>)r   rC   r   )r^   r3   r4   r]   r5   r   r5   r   r6      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   )r7   r3   r8   r   r9   rF   r   rC   r:   r   r   r   r<      s   



zUniqueTogetherValidator.__eq__)NNN)r4   r=   r>   r?   r@   r   rF   r9   r   rO   r"   r(   r2   r6   r<   r   r   r   r   rA   i   s    
		rA   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)rH   chr   r   r   rd      s    z@ProhibitSurrogateCharactersValidator.__call__.<locals>.<genexpr>)
code_pointr,   )strr   r^   rg   r   r-   )r   r   surrogate_characterr   r   r   r   r2      s   z-ProhibitSurrogateCharactersValidator.__call__c                 C   s(   t || jstS | j|jko| j|jkS r   )r7   r3   r8   r   r-   r:   r   r   r   r<      s
   
z+ProhibitSurrogateCharactersValidator.__eq__N)r4   r=   r>   r@   r   r-   r2   r<   r   r   r   r   re      s
    re   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 )BaseUniqueForValidatorNrB   Tc                 C   s"   || _ || _|| _|p| j| _d S r   )r   field
date_fieldr   )r   r   rm   rn   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   )rF   rG   rJ   r   r   r   rL      s
    zBBaseUniqueForValidator.enforce_required_fields.<locals>.<dictcomp>rM   r,   N)rm   rn   r   )r   rJ   rN   r   ro   r   rO      s   
z.BaseUniqueForValidator.enforce_required_fieldsc                 C   s   t d)Nz&`filter_queryset` must be implemented.)NotImplementedError)r   rJ   r   r    date_field_namer   r   r   r"     s   z&BaseUniqueForValidator.filter_querysetc                 C   rY   r#   r%   rZ   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*   )rn   r+   r,   )rC   rm   r.   rn   rO   r   r"   r(   r'   r   r   r^   r   )r   rJ   rK   r    rq   r   r   r   r   r   r2     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   )	r7   r3   r8   r   rF   r9   r   rm   rn   r:   r   r   r   r<     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)>)r3   r4   r   r   rm   rn   r5   r   r   r   r6   *  s   zBaseUniqueForValidator.__repr__r   )r4   r=   r>   r   r@   rF   r9   r   rO   r"   r(   r2   r<   r6   r   r   r   r   rl      s    
	rl   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   rn   daymonthyearr   r   rJ   r   r    rq   r   dater!   r   r   r   r"   6  s   

z&UniqueForDateValidator.filter_querysetNr4   r=   r>   r@   r   r"   r   r   r   r   rs   3      rs   c                   @   rr   )UniqueForMonthValidatorz7This field must be unique for the "{date_field}" month.c                 C   >   || j  }|| j }i }|||< |j|d| < t|fi |S )Nrt   )rm   rn   rw   r   ry   r   r   r   r"   E     

z'UniqueForMonthValidator.filter_querysetNr{   r   r   r   r   r}   B  r|   r}   c                   @   rr   )UniqueForYearValidatorz6This field must be unique for the "{date_field}" year.c                 C   r~   )Nru   )rm   rn   rx   r   ry   r   r   r   r"   R  r   z&UniqueForYearValidator.filter_querysetNr{   r   r   r   r   r   O  r|   r   N)r?   django.core.exceptionsr   	django.dbr   django.db.modelsr   django.utils.translationr   r@   rest_framework.exceptionsr   #rest_framework.utils.representationr   r   r   r   r   rA   re   rl   rs   r}   r   r   r   r   r   <module>   s"    ;pH