
    R1i,                         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 ej                  ej                  ej                  ej                  fZ G d d	      Zd
 Zd Zd Zd Zd Zd Zd Zy)z
Helper functions for mapping model fields to a dictionary of default
keyword arguments that should be used for their equivalent serializer fields.
    N)
validators)models)capfirst)postgres_fields)UniqueValidatorc                   "    e Zd ZdZd Zd Zd Zy)ClassLookupDicta
  
    Takes a dictionary with classes as keys.
    Lookups against this object will traverses the object's inheritance
    hierarchy in method resolution order, and returns the first matching value
    from the dictionary or raises a KeyError if nothing matches.
    c                     || _         y Nmapping)selfr   s     f/home/cursorai/projects/iching/venv/lib/python3.12/site-packages/rest_framework/utils/field_mapping.py__init__zClassLookupDict.__init__   s	        c                     t        |d      r|j                  }n|j                  }t        j                  |      D ]!  }|| j
                  v s| j
                  |   c S  t        d|j                  z        )N_proxy_classzClass %s not found in lookup.)hasattrr   	__class__inspectgetmror   KeyError__name__)r   key
base_classclss       r   __getitem__zClassLookupDict.__getitem__   si    3' ))JJ>>*-Cdll"||C(( . 69L9LLMMr   c                 "    || j                   |<   y r   r   )r   r   values      r   __setitem__zClassLookupDict.__setitem__*   s    !Sr   N)r   
__module____qualname____doc__r   r   r     r   r   r	   r	      s    N"r   r	   c                 r    |j                  dd      j                         }t        | j                        |k7  S )z
    Returns `True` if the label based on the model's verbose name
    is not equal to the default label it would have based on it's field name.
    _ )replace
capitalizer   verbose_name)model_field
field_namedefault_labels      r   needs_labelr.   .   s5    
 &&sC0;;=MK,,->>r   c                 T    dd| j                   j                  j                         iz  S )zz
    Given a model class, return the view name to use for URL relationships
    that refer to instances of the model.
    z%(model_name)s-detail
model_name)_metaobject_namelower)models    r   get_detail_view_namer5   7   s.    
 #ekk--335&  r   c                    i }t        |j                        }||d<   |j                  r$t        ||       rt	        |j                        |d<   |j
                  r|j
                  |d<   t        |dd      }|||d<   t        |dd      }|||d<   t        |t        j                        r|j                  |d<   t        |t        j                        r|j                  rJt        rt        |t        j                        s*t        t        d      r!t        |t        j                        rd	d
i|d<   |j                   rd|d<   t        |t        j"                        s|j$                  sd|d<   |S |j'                         s|j(                  s|j                   rd|d<   |j(                  r/t        |t        j*                  t        j                  f      rd|d<   |j(                  s%t        rt        |t        j,                        rd|d<   t        |t        j.                        r|j0                  |d<   |j2                  |j2                  |d<   |j4                  dur|j4                  |d<   |j6                  dur|j6                  |d<   |j8                  dur|j8                  |d<   |j                  r|j                  |d<   nt;        d |D        d      }|>t        |t<              r.||d<   |D cg c]  }t        |t        j>                        s|  }}t;        d |D        d      }|>t        |t<              r.||d<   |D cg c]  }t        |t        j@                        s|  }}t        |t        jB                        r)|D cg c]  }t        |t        jD                        s|  }}t        |t        jF                        r!|D cg c]  }|t        jH                  ur| }}t        |t        j                        r!|D cg c]  }|t        jJ                  ur| }}t        |t        jL                        r!|D cg c]  }|t        jN                  ur| }}t        |t        jP                        r)|D cg c]  }t        |t        jR                        s|  }}t        |dd      }	|	gt        |t        j*                  t        j                  t        jT                  f      r.|	|d<   |D cg c]  }t        |t        jV                        s|  }}t;        d |D        d      }
|
Ht        |t        j*                        r.|
|d<   |D cg c]  }t        |t        jX                        s|  }}t        |d d      r;t[        |j\                  j^                  ta        |      !      }|jc                  |       |r||d"<   |S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )#zE
    Creates a default instance of a basic non-relational field.
    r+   label	help_text
max_digitsNdecimal_placesallow_unicode	JSONFieldbase_templateztextarea.htmlstyleT
allow_null	read_onlyFrequiredallow_blankallow_emptypathmatch	recursiveallow_filesallow_folderschoicesc              3   h   K   | ]*  }t        |t        j                        r|j                   , y wr   )
isinstancer   MaxValueValidatorlimit_value.0	validators     r   	<genexpr>z#get_field_kwargs.<locals>.<genexpr>   -      
3Bi)Z%A%AB !!?   02	max_valuec              3   h   K   | ]*  }t        |t        j                        r|j                   , y wr   )rK   r   MinValueValidatorrM   rN   s     r   rQ   z#get_field_kwargs.<locals>.<genexpr>   rR   rS   	min_value
max_lengthc              3   h   K   | ]*  }t        |t        j                        r|j                   , y wr   )rK   r   MinLengthValidatorrM   rN   s     r   rQ   z#get_field_kwargs.<locals>.<genexpr>   s-      />)i!>!>? 	rS   
min_lengthuniquequerysetmessager   )2listr   r*   r.   r   r8   getattrrK   r   	SlugFieldr;   	TextFieldrI   r   r<   r   null	AutoFieldeditablehas_defaultblank	CharField
ArrayFieldFilePathFieldrD   rE   rF   rG   rH   nextNUMERIC_FIELD_TYPESrL   rV   URLFieldURLValidator
EmailFieldvalidate_emailvalidate_slugGenericIPAddressFieldvalidate_ipv46_addressDecimalFieldDecimalValidator	FileFieldMaxLengthValidatorrZ   r   r4   _default_managerget_unique_error_messageappend)r,   r+   kwargsvalidator_kwargr9   r:   rT   rP   rW   rX   r[   s              r   get_field_kwargsr~   A   s    F;112O (F=KZ$H";#;#;<w)33{lD9J)|[*:DAN!#1 +v//0"-";";+v//09L9LK9R9R!SV[)jfFVFV.W*O<w#|+v//08L8L #{ K$5$59I9I"zjv7G7GIYIY6Z[ $}/joNhNh6i %}+v334$))v()//F7O  -"-"7"7F;""$.$/$;$;F=!$$E1&1&?&?F?#'//y  
3B
 	  Z=P%Q"+F;+:+:i!)Z-I-IJ ?    
3B
 	  Z=P%Q"+F;+:+:i!)Z-I-IJ ?   k6??3+:+:i!)Z-D-DE ?   k6#4#45+:+:iJ$=$== ?   k6#3#34+:+:iJ$<$<< ?   k6#?#?@+:+:iJ$E$EE ?  
 k6#6#67+:+:i!)Z-H-HI ?   lD9J:kF<L<LfN^N^`f`p`p;q#r)|'6
'6)i)F)FG  	 
  /> J *[&:J:J"K)|'6
'6)i)F)FG  	 

 {He,# &&77,[9;	 	y).|Mm

s6   -#W  #W#W
WW<W7#W-#W#
#W(c                    |\  }}}}}}|j                   t        |      d}|rd|d<   |r||d<   |xr |j                         }	|	rFt        |	t        j
                        st	        j
                  di |	}	|d   j                  |	      |d<   |rd|d<   |j                  dd       |r6|j                  r$t        ||       rt        |j                        |d<   |j                  }
|
r|
|d	<   |j                  sd|d<   |j                  dd       |j                  rd|d
<   |j                  dd      r|S |j                         s|j                   s|j                  rd|d<   |j"                  r|j"                  |d<   t%        |dd      rCt'        |j(                  j                   t+        |            }|j                  dg       |gz   |d<   |r|j                   sd|d<   |S )z@
    Creates a default instance of a flat relational field.
    )r^   	view_nameTmanyto_fieldr^   r@   Nr7   r8   r?   FrA   r   r\   r]   rC   r$   )ry   r5   get_limit_choices_torK   r   Qfilterpopr*   r.   r   r8   rf   rd   getrg   rh   r   ra   r   r4   rz   )r,   relation_infor+   related_modelto_manyr   has_through_modelreverser|   limit_choices_tor8   rP   s               r   get_relation_kwargsr      s    Q^MK3Dg!22)-8F
 v%z"I{'G'G'I*FHH5%xx;*:;#J/667GHz"{

:t$##K(L&{'?'?@F7O))	"+F;##"&F;JJz4(#'F< ::k5) M""$(9(9[=M=M!&F:!!#.#9#9F< ;%0'$**;;0=?I $*::lB#?9+#MF< ;,,$)F=!Mr   c                 0    ddi}| j                   rd|d<   |S )Nr@   Tr   )r   )r   r|   s     r   get_nested_relation_kwargsr      s#    4 FvMr   c                     dt        |       iS )Nr   )r5   )r+   s    r   get_url_kwargsr   '  s    )+6 r   c                     | j                   j                  dd       }|r0|| j                  j                  j                  | j                  dz  }|S )Nr\   )r0   field_label)error_messagesr   r4   r1   r*   )r+   unique_error_messages     r   rz   rz   -  sT    &5599(DI3%++11>>&337
  
  r   )r#   r   django.corer   	django.dbr   django.utils.textr   rest_framework.compatr   rest_framework.validatorsr   IntegerField
FloatFieldru   DurationFieldrm   r	   r.   r5   r~   r   r   r   rz   r$   r   r   <module>r      sy     "  & 1 5 **F,?,?AUAU 
" "6?cL6r r   