
    >Tf                         d dl Z d dlmZmZmZ d dlmZ d dlmZ d dl	m
Z dZ G d dej                  Z G d	 d
eej                  ZdS )    N)DictListTuple)forms)settings)gettext_lazy)	APISelectAPISelectMultiplec                        e Zd ZU dZdZdZeeef         ed<   eee	e         f         ed<   d fd	Z
 fd	ZddZd Zd Zd Zd Zd ZddZ xZS )r	   z
    A select widget populated via an API call

    :param api_url: API endpoint URL. Required if not set automatically by the parent field.
    zwidgets/apiselect.htmlzwidgets/select_option.htmldynamic_paramsstatic_paramsNFc                      t                      j        |i | d| j        d<   i | _        i | _        |r=d                    t          j        |                    d                    | j        d<   d S d S )Nz
api-selectclassz/{}{}/zdata-url)	super__init__attrsr   r   formatr   	BASE_PATHlstrip)selfapi_urlfullargskwargs	__class__s        F/var/www/html/netbox-4.1.3/netbox/utilities/forms/widgets/apiselect.pyr   zAPISelect.__init__   s    $)&)))*
74635 	]%,^^H4FWZH[H[%\%\DJz"""	] 	]    c                 f    t                                          |          }i |_        i |_        |S )zHReset `static_params` and `dynamic_params` when APISelect is deepcopied.)r   __deepcopy__r   r   )r   memoresultr   s      r   r    zAPISelect.__deepcopy__#   s/    %%d++ "!r   returnc                 ^   t          |t                    r:|                                dk    rd}n|                                dk    rd}n|d}t          |t                    r|                    d          r!|                    d          }|| j        |<   dS || j        v r4| j        |         }d t          g ||          D             | j        |<   dS |g| j        |<   dS || j        v r4| j        |         }d	 t          g ||          D             | j        |<   dS |g| j        |<   dS )
zg
        Based on query param value's type and value, update instance's dynamic/static params.
        trueTfalseFNnull$c                     g | ]}|S  r*   .0vs     r   
<listcomp>z2APISelect._process_query_param.<locals>.<listcomp>H   s    .Q.Q.QQq.Q.Q.Qr   c                     g | ]}|S r*   r*   r+   s     r   r.   z2APISelect._process_query_param.<locals>.<listcomp>Q   s    *M*M*M1*M*M*Mr   )
isinstancestrlower
startswithstripr   r   set)r   keyvalue
field_namecurrents        r   _process_query_paramzAPISelect._process_query_param*   sr    eS!! 
	{{}}&&'))  eS!! 	2$$ 6 #[[--
25#J///
 $,,,"05G.Q.Q#>O>O>O:P:P.Q.Q.QD&s+++/4gD&s+++
 d(((,S1*M*Mc:KG:KU:K6L6L*M*M*M"3'''+0'"3'''r   c                     |                                 D ]S\  }}t          |t          t          f          r|D ]}|                     ||           =|                     ||           TdS )za
        Process an entire query_params dictionary, and handle primitive or list values.
        N)itemsr0   r   r   r:   )r   query_paramsr6   r7   items        r   _process_query_paramszAPISelect._process_query_paramsU   s     ',,.. 	6 	6JC%$// 6! 9 9D--c488889 ))#u5555	6 	6r   c                     t          j        | j                            |d                    }t          j        g ||d          | j        |<   dS )z
        Serialize dynamic or static query params to JSON and add the serialized value to
        the widget attributes by `key`.
        z[]),:)
separatorsN)jsonloadsr   getdumps)r   r6   paramsr9   s       r   _serialize_paramszAPISelect._serialize_paramsa   sN     *TZ^^C6677 *%8w%8%8ZPPP
3r   c                 B   d}t          | j                  dk    r	 d | j                                        D             }|                     ||           dS # t          $ r;}t          t          d                              | j                            |d}~ww xY wdS )z
        Convert post-processed dynamic query params to data structure expected by front-
        end, serialize the value to JSON, and add it to the widget attributes.
        zdata-dynamic-paramsr   c                     g | ]
\  }}||d S ))	fieldName
queryParamr*   )r,   fqs      r   r.   z1APISelect._add_dynamic_params.<locals>.<listcomp>x   s$    fffA;;fffr   zBMissing required value for dynamic query param: '{dynamic_params}')r   N)lenr   r<   rI   
IndexErrorRuntimeError_r   r   r6   updateerrors       r   _add_dynamic_paramszAPISelect._add_dynamic_paramsp   s    
 $t"##a''ff$J]JcJcJeJefff&&sF33333   "Z[[bb'+': c    		 ('   9A 
B!6BBc                 B   d}t          | j                  dk    r	 d | j                                        D             }|                     ||           dS # t          $ r;}t          t          d                              | j                            |d}~ww xY wdS )z
        Convert post-processed static query params to data structure expected by front-
        end, serialize the value to JSON, and add it to the widget attributes.
        zdata-static-paramsr   c                     g | ]
\  }}||d S ))rM   
queryValuer*   )r,   kr-   s      r   r.   z0APISelect._add_static_params.<locals>.<listcomp>   s$    fff!Q!<<fffr   z@Missing required value for static query param: '{static_params}')r   N)rP   r   r<   rI   rQ   rR   rS   r   rT   s       r   _add_static_paramszAPISelect._add_static_params   s    
 #t!""Q&&ff4K]KcKcKeKefff&&sF33333   "XYY``&*&8 a    		 '&rX   c                     |                      |           |                                  |                                  dS )z_
        Proccess & add a dictionary of URL query parameters to the widget attributes.
        N)r?   rW   r]   )r   r=   s     r   add_query_paramszAPISelect.add_query_params   sB    
 	""<000  """!!!!!r   c                 4    |                      ||i           dS )zb
        Process & add a key/value pair of URL query parameters to the widget attributes.
        N)r_   )r   r6   r7   s      r   add_query_paramzAPISelect.add_query_param   s"     	sEl+++++r   )NF)r#   N)__name__
__module____qualname____doc__template_nameoption_template_namer   r1   __annotations__r   r   r    r:   r?   rI   rW   r]   r_   ra   __classcell__)r   s   @r   r	   r	      s         
 -M7cN"""T#Y''''] ] ] ] ] ]    )2 )2 )2 )2V
6 
6 
6Q Q Q  "  "	" 	" 	", , , , , , , ,r   r	   c                       e Zd ZdS )r
   N)rb   rc   rd   r*   r   r   r
   r
      s        Dr   r
   )rD   typingr   r   r   djangor   django.confr   django.utils.translationr   rS   __all__Selectr	   SelectMultipler
   r*   r   r   <module>rr      s     $ $ $ $ $ $ $ $ $ $                   6 6 6 6 6 6S, S, S, S, S, S, S, S,l	 	 	 	 		5#7 	 	 	 	 	r   