Ë
    •2Úiñ"  ã                   ó4  — 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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lmZ d dlmZ d dlmZ d dlmZ d dl m!Z!m"Z" d„ Z#d„ Z$d„ Z%d„ Z&d„ Z' G d„ de«      Z( G d„ de(«      Z) G d„ de(«      Z*y)é    N)Úunquote)Úapps)Úprepare_lookup_value)ÚPermissionDenied)ÚDjangoJSONEncoder)Ú
connectionÚmodels)Ú
LOOKUP_SEP)ÚHttpResponse)Úmethod_decorator)Ú	smart_str)ÚSafeText)Úgettext)Úngettext)Únever_cache)ÚView)ÚAUTOCOMPLETE_LIMITÚAUTOCOMPLETE_SEARCH_FIELDSc                 óR   — t        | dd «      r| j                  «       S t        | «      S )NÚrelated_label)Úgetattrr   r   ©Úfs    úN/var/www/html/acx/venv/lib/python3.12/site-packages/grappelli/views/related.pyÚ	get_labelr      s%   € Üˆq�/ 4Ô(Ø�‰Ó Ð Ü�Q‹<Ðó    c                 ó\   — t        | dd «      rt        | j                  «       t        «      ryy)Nr   TF)r   Ú
isinstancer   r   r   s    r   Úget_label_safer      s%   € Üˆq�/ 4Ô(Ü�a—o‘oÓ'¬Ô2ØØr   c                 ó6   — t        | |g¬«      } t        | |«      S )N)Úfromlist)Ú
__import__r   )ÚmoduleÚnames     r   Úimport_fromr%   %   s   € Ü˜¨$¨Ô0€FÜ�6˜4Ó Ð r   c                 óN   — t        t        j                  | t        ¬«      d¬«      S )N)Úclszapplication/javascript)Úcontent_type)r   ÚjsonÚdumpsr   )Údatas    r   Úajax_responser,   *   s   € ÜœŸ
™
 4Ô->Ô?ÐNfÔgÐgr   c                 óÂ   — t        | d«      r| j                  «       S 	 t        | j                  j                     | j                  j
                     S # t        $ r Y yw xY w)a?  
    Returns the fields to be used for autocomplete of the given model,
    first using the autocomplete_search_fields() static method when defined on
    the model.
    If the staticmethod is not declared, looks for the fields value in the
    GRAPPELLI_AUTOCOMPLETE_SEARCH_FIELDS setting for the given app/model.
    Úautocomplete_search_fieldsN)Úhasattrr.   r   Ú_metaÚ	app_labelÚ
model_nameÚKeyError)Úmodels    r   Úget_autocomplete_search_fieldsr5   .   sY   € ô ˆuÐ2Ô3Ø×/Ñ/Ó1Ð1ðÜ)¨%¯+©+×*?Ñ*?Ñ@ÀÇÁ×AWÑAWÑXÐXøÜò Ùðús   ž3A Á	AÁAc                   óV   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
 ee«      d	„ «       Zy
)ÚRelatedLookupzRelated Lookupc                 ó�   — | j                   j                  j                  r | j                   j                  j                  st        ‚y ©N)ÚrequestÚuserÚ	is_activeÚis_staffr   ©Úselfs    r   Úcheck_user_permissionz#RelatedLookup.check_user_permissionB   s3   € Ø—‘×!Ñ!×+Ò+°·±×0AÑ0A×0JÒ0JÜ"Ð"ð 1Kr   c                 ó^   — d| j                   v xr d| j                   v xr d| j                   v S )NÚ	object_idr1   r2   ©ÚGETr>   s    r   Úrequest_is_validzRelatedLookup.request_is_validF   s0   € Ø˜dŸh™hÐ&Ò_¨;¸$¿(¹(Ð+BÒ_À|ÐW[×W_ÑW_ÐG_Ð_r   c                 óÈ   — 	 t        j                  | j                  d   | j                  d   «      | _        | j                  S # t        $ r d | _        Y | j                  S w xY w)Nr1   r2   )r   Ú	get_modelrD   r4   ÚLookupErrorr>   s    r   rG   zRelatedLookup.get_modelI   sY   € ð	ÜŸ™¨¯©°Ñ(=¸t¿x¹xÈÑ?UÓVˆDŒJð �z‰zÐøô ò 	ØˆD�JØ�z‰zÐð	ús   ‚5A ÁA!Á A!c           	      ó,  — i }| j                   j                  dd «      }|rc|j                  d«      D ]O  }|j                  d«      \  }}|dk7  sŒt        t	        |«      t        t	        |«      «      «      |t	        |«      <   ŒQ  |j                  di |¤ŽS )NÚquery_stringú:ú=Ú	_to_field© )rD   ÚgetÚsplitr   r   r   Úfilter)r?   ÚqsÚfiltersrJ   ÚitemÚkÚvs          r   Úget_filtered_querysetz#RelatedLookup.get_filtered_querysetW   sŽ   € ØˆØ—x‘x—|‘| N°DÓ9ˆáØ$×*Ñ*¨3Ó/ò f�Ø—z‘z #“‘��1Ø˜Ó#Ü,@ÄÈ1ÃÌwÔW`ÐabÓWcÓOdÓ,e�GœI a›LÒ)ðfð ˆr�y‰yÑ#˜7Ñ#Ð#r   c                 óp   — | j                   j                  j                  «       }| j                  |«      }|S r9   )r4   Ú_default_managerÚget_querysetrW   )r?   rR   s     r   rZ   zRelatedLookup.get_querysetb   s1   € Ø�Z‰Z×(Ñ(×5Ñ5Ó7ˆð ×'Ñ'¨Ó+ˆØˆ	r   c                 ó¶   — | j                   j                  dd «      }|�:t        ||«      }t        |t        «      st        |t
        «      s|j                  }|S |S )NÚto_field)rD   rO   r   r   ÚstrÚintÚpk)r?   ÚobjÚobj_idr\   Úreturn_values        r   Úget_return_valuezRelatedLookup.get_return_valuej   sP   € Ø—8‘8—<‘< 
¨DÓ1ˆØÐÜ" 3¨Ó1ˆLÜ˜l¬CÔ0¼ÀLÔRUÔ9VØ"Ÿv™v�ØÐØˆr   c                 óð  — | j                   d   }| j                   j                  dd «      }g }|r‚	 |�# | j                  «       j                  di ||i¤Ž}n | j                  «       j                  |¬«      }|j                  d| j	                  ||«      z  t        |«      t        |«      dœ«       |S |S # | j                  j                  t        f$ r" |j                  |t        d«      ddœ«       Y |S w xY w)	NrB   r\   ©r_   z%s©ÚvalueÚlabelÚsafeú?FrN   )rD   rO   rZ   Úappendrc   r   r   r4   ÚDoesNotExistÚ
ValueErrorÚ_)r?   ra   r\   r+   r`   s        r   Úget_datazRelatedLookup.get_datas   s  € Ø—‘˜+Ñ&ˆØ—8‘8—<‘< 
¨DÓ1ˆØˆÙðOØÐ'Ø1˜$×+Ñ+Ó-×1Ñ1ÑG°X¸vÐ4FÑG‘Cà×+Ñ+Ó-×1Ñ1°VÐ1Ó<�CØ—‘ d¨T×-BÑ-BÀ3ÈÓ-OÑ&OÔZcÐdgÓZhô  sAð  BEó  sFñ  Gô  Hð ˆˆtˆøð —J‘J×+Ñ+¬ZÐ8ò OØ—‘ f´q¸³vÀuÑMÕNØˆðOús   ±A?B4 Â4=C5Ã4C5c                 ó  — | j                  «        | j                  j                  | _        | j                  «       r9| j	                  «        | j
                  �| j                  «       }|rt        |«      S d ddœg}t        |«      S )NÚ ©rg   rh   )r@   r:   rD   rE   rG   r4   ro   r,   )r?   r:   ÚargsÚkwargsr+   s        r   rO   zRelatedLookup.get‚   sp   € à×"Ñ"Ô$Ø—<‘<×#Ñ#ˆŒà× Ñ Ô"Ø�N‰NÔØ�z‰zÐ%Ø—}‘}“�ÙÜ(¨Ó.Ð.à¨Ñ,Ð-ˆÜ˜TÓ"Ð"r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r@   rE   rG   rW   rZ   rc   ro   r   r   rO   rN   r   r   r7   r7   ?   sB   „ Ùò#ò`òò	$òòòñ �kÓ"ñ#ó #ñ#r   r7   c                   ó   — e Zd ZdZd„ Zy)Ú	M2MLookupz
M2M Lookupc                 óx  — | j                   d   j                  d«      }g }d„ |D «       D ]J  }	 | j                  «       j                  |¬«      }|j	                  |t        |«      t        |«      dœ«       ŒL |S # | j                  j                  t        f$ r! |j	                  |t        d«      ddœ«       Y ŒŽw xY w)NrB   ú,c              3   ó&   K  — | ]	  }|sŒ|–— Œ y ­wr9   rN   )Ú.0Úis     r   ú	<genexpr>z%M2MLookup.get_data.<locals>.<genexpr>˜   s   è ø€ Ò/˜QªQ”qÑ/ùs   ‚Šre   rf   rj   F)rD   rP   rZ   rO   rk   r   r   r4   rl   rm   rn   )r?   Úobj_idsr+   ra   r`   s        r   ro   zM2MLookup.get_data•   sµ   € Ø—(‘(˜;Ñ'×-Ñ-¨cÓ2ˆØˆÙ/ 'Ô/ò 	OˆFðOØ×'Ñ'Ó)×-Ñ-°Ð-Ó8�Ø—‘ f´yÀ³~Ì~Ð^aÓObÑcÕdð	Oð ˆøð —J‘J×+Ñ+¬ZÐ8ò OØ—‘ f´q¸³vÀuÑMÖNðOús   ®AA9Á9=B9Â8B9N)ru   rv   rw   rx   ro   rN   r   r   rz   rz   ’   s
   „ Ùó	r   rz   c                   óX   ‡ — e Zd Zd Zd„ Zd„ Zdd„Zˆ fd„Zd„ Z e	e
«      d„ «       Zˆ xZS )ÚAutocompleteLookupc                 ó^   — d| j                   v xr d| j                   v xr d| j                   v S )NÚtermr1   r2   rC   r>   s    r   rE   z#AutocompleteLookup.request_is_valid¤   s0   € Ø˜Ÿ™Ð!ÒZ k°T·X±XÐ&=ÒZÀ,ÐRV×RZÑRZÐBZÐZr   c                 óð  — | j                   }| j                  d   }	 |j                  |«      }t	        | j                   «      }|rˆt        j                  «       }|j                  «       D ]N  }t        j                  «       }|D ].  }|t        j                  di t        |«      t        |«      i¤Žz  }Œ0 ||z  }ŒP |j                  |«      }|S |j                  j                  «       }|S # t        $ r Y ŒÆw xY w)Nr…   rN   )r4   rD   Úautocomplete_term_adjustÚAttributeErrorr5   r	   ÚQrP   r   rQ   ÚobjectsÚnone)	r?   rR   r4   r…   Úsearch_fieldsÚsearchÚwordÚ
term_queryÚsearch_fields	            r   Úget_searched_querysetz(AutocompleteLookup.get_searched_queryset§   sö   € Ø—
‘
ˆØ�x‰x˜Ñˆð	Ø×1Ñ1°$Ó7ˆDô 7°t·z±zÓBˆÙÜ—X‘X“ZˆFØŸ
™
›ò %�Ü#ŸX™X›Z�
Ø$1ò �LØ¤&§(¡(ñ #Ü$ \Ó2´I¸d³OÐDñ#ñ ‘Jðð ˜*Ñ$‘ð%ð —‘˜6Ó"ˆBð ˆ	ð —‘×#Ñ#Ó%ˆBØˆ	øô! ò 	Ùð	ús   �C) Ã)	C5Ã4C5c                 óÀ  — g }|j                   j                  D ]Â  }|j                   }|j                  d«      j                  t        «      D ]6  }|j                  |«      }|j                  sŒ!|j                  j                   }Œ8 |�|t        z   |z   }j                  r,|j                  | j                  |j                  |«      «       Œ²|j                  |«       ŒÄ |S )a   
        This recursive function returns the final lookups
        for the default ordering of a model.

        Considering the models below, `get_final_ordering(Book)` will return
        `['-type__name', 'name']` instead of the simple `['-type', 'name']`
        one would get using `Book._meta.ordering`.

            class BookType(Model):
                name = CharField(max_length=50)

                class Meta:
                    ordering = ['name']

            class Book(Model):
                name = CharField(max_length=50)
                type = ForeignKey(BookType)

                class Meta:
                    ordering = ['-type', 'name']
        ú-)r0   ÚorderingÚlstriprP   r
   Ú	get_fieldÚis_relationÚrelated_modelÚextendÚget_final_orderingr4   rk   )r?   r4   Úprevious_lookup_partsr”   ÚlookupÚoptsÚpartÚfields           r   rš   z%AutocompleteLookup.get_final_ordering¿   sÆ   € ð, ˆØ—k‘k×*Ñ*ò 	(ˆFØ—;‘;ˆDØŸ™ cÓ*×0Ñ0´Ó<ò 5�ØŸ™ tÓ,�Ø×$Ó$Ø ×.Ñ.×4Ñ4‘Dð5ð %Ð0Ø.´Ñ;¸fÑD�Ø× Ò Ø—‘ × 7Ñ 7¸¿
¹
ÀFÓ KÕLà—‘ Õ'ð	(ð ˆr   c                 óÂ  •— t         t        | �  «       }| j                  |«      }t        j
                  dk(  r”| j                  | j                  «      }|D �cg c]  }|j                  d«      ‘Œ }}| j                  j                  j                  j                  }||vr|j                  |«         |j                  |Ž j                  |Ž S |j                  «       S c c}w )NÚ
postgresqlr“   )Úsuperrƒ   rZ   r‘   r   Úvendorrš   r4   r•   r0   r_   r$   rk   Úorder_byÚdistinct)r?   rR   r”   ÚoÚdistinct_columnsÚpk_nameÚ	__class__s         €r   rZ   zAutocompleteLookup.get_querysetä   sÄ   ø€ ÜÔ% tÑ9Ó;ˆØ×'Ñ'¨Ó+ˆä×Ñ Ò,Ø×.Ñ.¨t¯z©zÓ:ˆHØ7?Ö@°! §¡¨¥Ð@ÐÐ@Ø—j‘j×&Ñ&×)Ñ)×.Ñ.ˆGØÐ.Ñ.Ø ×'Ñ'¨Ô0Ø2�;�2—;‘; Ð)×2Ñ2Ð4DÐEÐEà�{‰{‹}Ðùò  As   ÁCc                 ó¢   — | j                  «       d t         D �cg c]*  }| j                  ||j                  «      t	        |«      dœ‘Œ, c}S c c}w )Nrr   )rZ   r   rc   r_   r   )r?   r   s     r   ro   zAutocompleteLookup.get_dataò   s[   € ØZ^×ZkÑZkÓZmð  oBô  pBð  [Cö  DÐUV˜$×/Ñ/°°1·4±4Ó8Ä9ÈQÃ<ÓPò  Dð  	Dùò  Ds   š/Ac                 ó  — | j                  «        | j                  j                  | _        | j                  «       r-| j	                  «        | j                  «       }|rt        |«      S t        ddd«      ddiz  }d |dœg}t        |«      S )Nz%(counter)s resultz%(counter)s resultsr   Úcounterrr   )r@   r:   rD   rE   rG   ro   r,   r   )r?   r:   rs   rt   r+   rh   s         r   rO   zAutocompleteLookup.getõ   s‚   € à×"Ñ"Ô$Ø—<‘<×#Ñ#ˆŒà× Ñ Ô"Ø�N‰NÔØ—=‘=“?ˆDÙÜ$ TÓ*Ð*ô Ð-Ð/DÀaÓHÈIÐWXÈ>ÑYˆØ¨Ñ/Ð0ˆÜ˜TÓ"Ð"r   r9   )ru   rv   rw   rx   rE   r‘   rš   rZ   ro   r   r   rO   Ú__classcell__)r©   s   @r   rƒ   rƒ   ¡   s;   ø„ Ùò[òó0#ôJòDñ �kÓ"ñ#ó #ô#r   rƒ   )+r)   Úurllib.parser   Údjango.appsr   Údjango.contrib.admin.utilsr   Údjango.core.exceptionsr   Údjango.core.serializers.jsonr   Ú	django.dbr   r	   Údjango.db.models.constantsr
   Údjango.httpr   Údjango.utils.decoratorsr   Údjango.utils.encodingr   Údjango.utils.safestringr   Údjango.utils.translationr   rn   r   Údjango.views.decorators.cacher   Údjango.views.genericr   Úgrappelli.settingsr   r   r   r   r%   r,   r5   r7   rz   rƒ   rN   r   r   ú<module>r½      s}   ðó Ý  å Ý ;Ý 3Ý :ß (Ý 1Ý $Ý 4Ý +Ý ,Ý 1Ý -Ý 5Ý %ç Mòòò!ò
hòô"P#�Dô P#ôf�ô ôb#˜õ b#r   