a
    ‘ÐOc*0  ã                   @   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
 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.
é    )Ú
exceptions)Úcached_property)Úmake_hashableé   )ÚBLANK_CHOICE_DASH)ÚFieldCacheMixinc                   @   s@  e Zd ZdZdZdZdZdZdZdZ	d<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e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d,d-„ Z d.d/„ Z!d0d1„ Z"d2d3„ Z#d=d4d5„Z$d>d6d7„Z%ed8d9„ ƒZ&d:d;„ Z'dS )?Ú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/gsl.tools/lib/python3.9/site-packages/django/db/models/fields/reverse_related.pyÚ__init__'   s    
zForeignObjectRel.__init__c                 C   s   |   ¡ S ©N)Ú	is_hidden©r   r   r   r   Úhidden@   s    zForeignObjectRel.hiddenc                 C   s
   | j  ¡ S r   )r	   r   r   r   r   r   ÚnameD   s    zForeignObjectRel.namec                 C   s   | j S r   )r	   r   r   r   r   Úremote_fieldH   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_fieldL   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_modelY   s
    ÿzForeignObjectRel.related_modelc                 C   s   | j jS r   )r	   Úmany_to_manyr   r   r   r   r$   b   s    zForeignObjectRel.many_to_manyc                 C   s   | j jS r   )r	   Úone_to_manyr   r   r   r   Úmany_to_onef   s    zForeignObjectRel.many_to_onec                 C   s   | j jS r   )r	   r&   r   r   r   r   r%   j   s    zForeignObjectRel.one_to_manyc                 C   s   | j jS r   )r	   Ú
one_to_oner   r   r   r   r'   n   s    zForeignObjectRel.one_to_onec                 C   s   | j  |¡S r   )r	   Ú
get_lookup)r   Úlookup_namer   r   r   r(   r   s    zForeignObjectRel.get_lookupc                 C   s
   | j  ¡ S r   )r	   Úget_internal_typer   r   r   r   r*   u   s    z"ForeignObjectRel.get_internal_typec                 C   s   | j jS r   )r	   Údb_typer   r   r   r   r+   x   s    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__ÚNotImplementedr1   )r   Úotherr   r   r   Ú__eq__‘   s    zForeignObjectRel.__eq__c                 C   s
   t | jƒS r   )Úhashr1   r   r   r   r   Ú__hash__–   s    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>·   ó    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
   | j  ¡ S r   )r	   Zget_reverse_joining_columnsr   r   r   r   Úget_joining_columns½   s    z$ForeignObjectRel.get_joining_columnsc                 C   s   | j  ||¡S r   )r	   Úget_extra_restriction)r   ÚaliasZrelated_aliasr   r   r   rJ   À   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   sV   |r
|j n| jj }|p| j}| jr6| jr6|| jkr6d S | jrB| jS |j| jrPdnd S )NZ_setÚ )r.   r#   r   r   r
   r   r/   )r   r
   Úoptsr   r   r   Úget_accessor_nameÍ   s    
z"ForeignObjectRel.get_accessor_namec                 C   s   |r| j  |¡S | j jS d 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   s   |   ¡ S r   )rQ   r   r   r   r   r   å   s    zForeignObjectRel.path_infosc                 C   s   |   ¡ S )z„
        Return the name of the cache key to use for storing an instance of the
        forward model on the reverse model.
        )rP   r   r   r   r   Úget_cache_nameé   s    zForeignObjectRel.get_cache_name)NNNFN)N)N)(r-   Ú
__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(   r*   r+   r0   r1   r6   r8   r>   r   rF   r   rI   rJ   rM   rP   rQ   r   rR   r   r   r   r   r      sn        ø











û




r   c                       sN   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   rL   ©	r   r	   r   rL   r   r   r   r   r   ©r3   r   r   r      s    ù
zManyToOneRel.__init__c                    s   t ƒ  ¡ }| dd ¡ |S )Nr#   )r\   r>   r;   r<   r^   r   r   r>     s    
zManyToOneRel.__getstate__c                    s   t ƒ j| jf S r   )r\   r1   rL   r   r^   r   r   r1     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
   r.   Ú	get_fieldrL   rV   r   ZFieldDoesNotExist)r   r	   r   r   r   Úget_related_field   s    ÿzManyToOneRel.get_related_fieldc                 C   s   | j p| jjjj| _ d S r   )rL   r
   r.   r?   r   r   r   r   r   rM   +  s    zManyToOneRel.set_field_name)NNNFN)r-   rS   rT   rU   r   r>   rY   r1   r`   rM   Ú__classcell__r   r   r^   r   rZ   ñ   s        ÷rZ   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 )Nr[   F)r\   r   r   r]   r^   r   r   r   7  s    øzOneToOneRel.__init__)NNNFN)r-   rS   rT   rU   r   ra   r   r   r^   r   rb   /  s        ÷rb   c                       s:   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)r\   r   Ú
ValueErrorÚthroughÚthrough_fieldsr   Údb_constraint)
r   r	   r   r   r   r   r   re   rf   rg   r^   r   r   r   X  s    ûzManyToManyRel.__init__c                    s   t ƒ j| jt| jƒ| jf S r   )r\   r1   re   r   rf   rg   r   r^   r   r   r1   w  s
    ýzManyToManyRel.identityc                 C   sV   | j j}| jr | | jd ¡}n,|jD ]$}t|ddƒ}|r&|j| jkr& qLq&|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)re   r.   rf   r_   ÚfieldsÚgetattrr
   Zforeign_related_fields)r   rO   r	   Úrelr   r   r   r`     s    
zManyToManyRel.get_related_field)NNNTNNT)	r-   rS   rT   rU   r   rY   r1   r`   ra   r   r   r^   r   rc   P  s          örc   N)rU   Zdjango.corer   Zdjango.utils.functionalr   Zdjango.utils.hashabler   rN   r   Zmixinsr   r   rZ   rb   rc   r   r   r   r   Ú<module>   s    ^>!