o
    `Zh%2                     @   s   d Z ddl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 G d
d deZG dd deZG dd deZG dd deZdS )al  
"Rel objects" for related fields.

"Rel objects" (for lack of a better name) carry information about the relation
modeled by a related field and provide some utility functions. They're stored
in the ``remote_field`` attribute of the field.

They also act as reverse fields for the purposes of the Meta API because
they're the closest concept currently available.
    N)
exceptions)RemovedInDjango60Warning)cached_property)make_hashable   )BLANK_CHOICE_DASH)FieldCacheMixinc                   @   sb  e Zd ZdZdZdZdZdZdZdZ						dBddZ
edd Zed	d
 Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zdd Zdd Zdd Zdd  Zed!d" Zd#d$ Zed%d& Zd'd( Zd)d* Zd+d, Zde dd-fd.d/Z!d0d1 Z"d2d3 Z#d4d5 Z$d6d7 Z%d8d9 Z&dCd:d;Z'dCd<d=Z(ed>d? Z)d@dA Z*dS )DForeignObjectRelz
    Used by ForeignObject to store information about the relation.

    ``_meta.get_fields()`` returns this class to provide access to the field
    flags for the reverse relation.
    TFNc                 C   sF   || _ || _|| _|| _|d u ri n|| _|| _|| _d| _d| _d S )NFT)	fieldmodelrelated_namerelated_query_namelimit_choices_toparent_link	on_deletesymmetricalmultiple)selfr
   tor   r   r   r   r    r   ^/var/www/html/lang_env/lib/python3.10/site-packages/django/db/models/fields/reverse_related.py__init__)   s   

zForeignObjectRel.__init__c                 C      |   S N)	is_hiddenr   r   r   r   hiddenB      zForeignObjectRel.hiddenc                 C   
   | j  S r   )r
   r   r   r   r   r   nameF   s   
zForeignObjectRel.namec                 C   s   | j S r   )r
   r   r   r   r   remote_fieldJ   s   zForeignObjectRel.remote_fieldc                 C   s*   | j d j}t|dkrtd|d S )z
        When filtering against this relation, return the field on the remote
        model against which the filtering should happen.
        r   z1Can't use target_field for multicolumn relations.r   )
path_infostarget_fieldslenr   Z
FieldError)r   r#   r   r   r   target_fieldN   s   zForeignObjectRel.target_fieldc                 C   s   | j jstd| j jS )NzVThis property can't be accessed before self.field.contribute_to_class has been called.)r
   r   AttributeErrorr   r   r   r   related_model[   s
   zForeignObjectRel.related_modelc                 C      | j jS r   )r
   many_to_manyr   r   r   r   r)   d   r   zForeignObjectRel.many_to_manyc                 C   r(   r   )r
   one_to_manyr   r   r   r   many_to_oneh   r   zForeignObjectRel.many_to_onec                 C   r(   r   )r
   r+   r   r   r   r   r*   l   r   zForeignObjectRel.one_to_manyc                 C   r(   r   )r
   
one_to_oner   r   r   r   r,   p   r   zForeignObjectRel.one_to_onec                 C      | j |S r   )r
   
get_lookup)r   lookup_namer   r   r   r.   t      zForeignObjectRel.get_lookupc                 C   r   r   )r
   get_lookupsr   r   r   r   r1   w      
zForeignObjectRel.get_lookupsc                 C   r-   r   )r
   get_transform)r   r   r   r   r   r3   z   r0   zForeignObjectRel.get_transformc                 C   r   r   )r
   get_internal_typer   r   r   r   r4   }   r2   z"ForeignObjectRel.get_internal_typec                 C   r(   r   )r
   db_typer   r   r   r   r5      r   zForeignObjectRel.db_typec                 C   s    dt | j| jjj| jjjf S )Nz<%s: %s.%s>)type__name__r'   _metaZ	app_label
model_namer   r   r   r   __repr__   s
   zForeignObjectRel.__repr__c              	   C   s,   | j | j| j| jt| j| j| j| j| j	f	S r   )
r
   r   r   r   r   r   r   r   r   r   r   r   r   r   identity   s   zForeignObjectRel.identityc                 C   s   t || jstS | j|jkS r   )
isinstance	__class__NotImplementedr;   )r   otherr   r   r   __eq__   s   zForeignObjectRel.__eq__c                 C   s
   t | jS r   )hashr;   r   r   r   r   __hash__   r2   zForeignObjectRel.__hash__c                 C   s   | j  }|dd  |S )Nr"   )__dict__copypopr   stater   r   r   __getstate__   s   
zForeignObjectRel.__getstate__r   c                 C   s@   |p| j }| jj|}|r|j| }|r|ng dd |D  S )a  
        Return choices with a default blank choices included, for use
        as <select> choices for this field.

        Analog of django.db.models.fields.Field.get_choices(), provided
        initially for utilization by RelatedFieldListFilter.
        c                 S   s   g | ]	}|j t|fqS r   )pkstr).0xr   r   r   
<listcomp>   s    z0ForeignObjectRel.get_choices.<locals>.<listcomp>)r   r'   Z_default_managerZcomplex_filterZorder_by)r   Zinclude_blankZblank_choicer   Zorderingqsr   r   r   get_choices   s
   

zForeignObjectRel.get_choicesc                 C   s   t | jo| jd dkS )z$Should the related object be hidden?r!   +)boolr   r   r   r   r   r      s   zForeignObjectRel.is_hiddenc                 C   s   t dt | j S )NzWForeignObjectRel.get_joining_columns() is deprecated. Use get_joining_fields() instead.)warningswarnr   r
   Zget_reverse_joining_columnsr   r   r   r   get_joining_columns   s
   
z$ForeignObjectRel.get_joining_columnsc                 C   r   r   )r
   Zget_reverse_joining_fieldsr   r   r   r   get_joining_fields   r2   z#ForeignObjectRel.get_joining_fieldsc                 C   s   | j ||S r   )r
   get_extra_restriction)r   aliasZrelated_aliasr   r   r   rV      s   z&ForeignObjectRel.get_extra_restrictionc                 C   s
   d| _ dS )z
        Set the related field's name, this is not available until later stages
        of app loading, so set_field_name is called from
        set_attributes_from_rel()
        N)
field_namer   r   r   r   set_field_name   s   
zForeignObjectRel.set_field_namec                 C   sX   |r|j n| jj }|p| j}| jr| jr|| jkrd S | jr!| jS |j| jr)d S d S )N_set )r8   r'   r   r   r   r   r9   )r   r   optsr   r   r   get_accessor_name   s   
z"ForeignObjectRel.get_accessor_namec                 C   s   |r| j |S | j jS r   )r
   Zget_reverse_path_infoZreverse_path_infos)r   Zfiltered_relationr   r   r   get_path_info   s   zForeignObjectRel.get_path_infoc                 C   r   r   )r^   r   r   r   r   r"      r   zForeignObjectRel.path_infosc                 C   r   )z
        Return the name of the cache key to use for storing an instance of the
        forward model on the reverse model.
        )r]   r   r   r   r   get_cache_name   s   zForeignObjectRel.get_cache_nameNNNFNr   )+r7   
__module____qualname____doc__Zauto_createdconcreteeditableZis_relationnullZempty_strings_allowedr   r   r   r   propertyr    r%   r'   r)   r+   r*   r,   r.   r1   r3   r4   r5   r:   r;   r@   rB   rH   r   rO   r   rT   rU   rV   rY   r]   r^   r"   r_   r   r   r   r   r	      sv    
















r	   c                       sX   e Zd ZdZ					d fdd	Z fddZe fdd	Zd
d Zdd Z	  Z
S )ManyToOneRela+  
    Used by the ForeignKey field to store information about the relation.

    ``_meta.get_fields()`` returns this class to provide access to the field
    flags for the reverse relation.

    Note: Because we somewhat abuse the Rel objects by using them as reverse
    fields we get the funny situation where
    ``ManyToOneRel.many_to_one == False`` and
    ``ManyToOneRel.one_to_many == True``. This is unfortunate but the actual
    ManyToOneRel class is a private API and there is work underway to turn
    reverse relations into actual fields.
    NFc	           	   	      s$   t  j|||||||d || _d S )Nr   r   r   r   r   )superr   rX   	r   r
   r   rX   r   r   r   r   r   r=   r   r   r     s   

zManyToOneRel.__init__c                    s   t   }|dd  |S )Nr'   )rj   rH   rE   rF   rl   r   r   rH   '  s   
zManyToOneRel.__getstate__c                    s   t  j| jf S r   )rj   r;   rX   r   rl   r   r   r;   ,  s   zManyToOneRel.identityc                 C   s*   | j j| j}|jstd| j |S )zY
        Return the Field in the 'to' object to which this relationship is tied.
        zNo related field named '%s')r   r8   	get_fieldrX   rd   r   ZFieldDoesNotExist)r   r
   r   r   r   get_related_field0  s   zManyToOneRel.get_related_fieldc                 C   s   | j p| jjjj| _ d S r   )rX   r   r8   rI   r   r   r   r   r   rY   ;  s   zManyToOneRel.set_field_namer`   )r7   ra   rb   rc   r   rH   rg   r;   rn   rY   __classcell__r   r   rl   r   rh     s    rh   c                       s,   e Zd ZdZ					d fdd	Z  ZS )OneToOneRelz
    Used by OneToOneField to store information about the relation.

    ``_meta.get_fields()`` returns this class to provide access to the field
    flags for the reverse relation.
    NFc	           	   
      s&   t  j||||||||d d| _d S )Nri   F)rj   r   r   rk   rl   r   r   r   G  s   
zOneToOneRel.__init__r`   )r7   ra   rb   rc   r   ro   r   r   rl   r   rp   ?  s    rp   c                       sH   e Zd ZdZ							d
 fdd	Ze fddZdd	 Z  ZS )ManyToManyRelz
    Used by ManyToManyField to store information about the relation.

    ``_meta.get_fields()`` returns this class to provide access to the field
    flags for the reverse relation.
    NTc
           
         sR   t  j|||||d |r|	std|| _|r|std|| _|| _|	| _d S )N)r   r   r   z4Can't supply a through model and db_constraint=Falsez5Cannot specify through_fields without a through model)rj   r   
ValueErrorthroughthrough_fieldsr   db_constraint)
r   r
   r   r   r   r   r   rs   rt   ru   rl   r   r   r   h  s   
zManyToManyRel.__init__c                    s   t  j| jt| j| jf S r   )rj   r;   rs   r   rt   ru   r   rl   r   r   r;     s
   zManyToManyRel.identityc                 C   sV   | j j}| jr|| jd }n|jD ]}t|dd}|r%|j| jkr% nq|jd S )z
        Return the field in the 'to' object to which this relationship is tied.
        Provided for symmetry with ManyToOneRel.
        r   r    N)rs   r8   rt   rm   fieldsgetattrr   Zforeign_related_fields)r   r\   r
   relr   r   r   rn     s   

zManyToManyRel.get_related_field)NNNTNNT)	r7   ra   rb   rc   r   rg   r;   rn   ro   r   r   rl   r   rq   `  s    rq   )rc   rR   Zdjango.corer   Zdjango.utils.deprecationr   Zdjango.utils.functionalr   Zdjango.utils.hashabler   r[   r   mixinsr   r	   rh   rp   rq   r   r   r   r   <module>   s    
 l>!