o
    ѷ6i.                     @  s  d dl mZ d dl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 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 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' zd dl(Z(W n e)y   dZ(Y nw ee*ee
ej+ e
ej e
e, e
e- e
e* e
ej. ee*ee
ej+ e
ej e
e, e
e- e
e* e
ej. ee*ef f f f f Z/G dd deZ0e01e% G dd deZ2G dd dZ3dS )     )annotationsN)Any)Callable)Dict)Iterable)Type)Union)cast)checks)BaseDatabaseWrapper)	DateField)DateTimeField)
Expression)Field)
FloatField)IntegerField)	TextField)	TimeField)	Transform)SQLCompiler)gettext_lazy)mysql_connections)DynColHasKey)DeconstructResultc                      s   e Zd ZdZedZedddd@ fddZdA fddZdBddZ	dBddZ
dBddZ	dCdDddZdEd"d#ZdF fd&d'ZdGd)d*ZdHd-d.ZdG fd/d0Ze	dCdId3d4ZdJd5d6ZdKd8d9ZdL fd;d<ZdMd>d?Z  ZS )NDynamicFieldFMappingTN)defaultblankspecargsr   r   r   boolr   SpecDict | NonekwargsreturnNonec                  s2   |d u ri | _ n|| _ t j|||d| d S )N)r   r   )r   super__init__)selfr   r   r   r   r"   	__class__ g/var/www/hoanhtaovolam_webdjango/env/lib/python3.10/site-packages/django_mysql/models/fields/dynamic.pyr&   E   s   zDynamicField.__init__list[checks.CheckMessage]c                   sR   t  jdi |}||   ||   ||   || | j |S )Nr*   )r%   checkextend_check_mariadb_dyncol_check_mariadb_version_check_character_set_check_spec_recursivelyr   )r'   r"   errorsr(   r*   r+   r-   S   s   zDynamicField.checkc                 C  s(   g }t d u r|tjdd| dd |S )Nz0'mariadb_dyncol' is required to use DynamicFieldz/Install the 'mariadb_dyncol' library from 'pip'zdjango_mysql.E012hintobjid)mariadb_dyncolappendr
   Error)r'   r3   r*   r*   r+   r/   [   s   z"DynamicField._check_mariadb_dyncolc                 C  s8   g }t dd t D }|s|tjdd| dd |S )Nc                 s  s$    | ]\}}|j d ko|jV  qdS )mysqlN)vendormysql_is_mariadb).0_aliasconnr*   r*   r+   	<genexpr>k   s
    
z6DynamicField._check_mariadb_version.<locals>.<genexpr>z'MariaDB is required to use DynamicFieldz6At least one of your DB connections should be MariaDB.zdjango_mysql.E013r4   )anyr   r9   r
   r:   )r'   r3   any_conn_worksr*   r*   r+   r0   h   s   z#DynamicField._check_mariadb_versionc                 C  s   g }d }t  D ]\}}|jdkr|jr|} nq|d urN| }|d | d }W d    n1 s6w   Y  |dvrN|tjdd	|| dd |S )	Nr;   zSELECT @@character_set_clientr   )utf8utf8mb4zAThe MySQL charset must be 'utf8' or 'utf8mb4' to use DynamicFieldzYou are currently connecting with the '{}' character set. Add 'OPTIONS': {{'charset': 'utf8mb4'}}, to your DATABASES setting to fix thiszdjango_mysql.E014r4   )
r   r<   r=   cursorexecutefetchoner9   r
   r:   format)r'   r3   r@   r?   
check_connrF   charsetr*   r*   r+   r1   {   s.   

z!DynamicField._check_character_set pathstrc              
   C  s  g }t |ts|tjddt|j | dd |S | D ]b\}}t |tsE|tjdt|d| dd	|t|j| d	d qt |tr[| d
| }|
| || q|tjvrdtdd tj D }|tjd	||d| | dd q|S )Nz'spec' must be a dictzThe value passed is of type zdjango_mysql.E009r4   zThe key z	 in 'specz' is not a stringz3'spec' keys must be of type str, '{}' is of type {}zdjango_mysql.E010.z, c                 s  s    | ]}|j V  qd S N)__name__)r>   xr*   r*   r+   rA      s    z7DynamicField._check_spec_recursively.<locals>.<genexpr>z5The value for '{}' in 'spec{}' is not an allowed typez2'spec' values must be one of the following types: zdjango_mysql.E011)
isinstancedictr9   r
   r:   typerQ   itemsrN   rI   r.   r2   KeyTransformSPEC_MAPjoinsortedkeys)r'   r   rM   r3   keyvaluesubpathvalid_namesr*   r*   r+   r2      sX   

	

z$DynamicField._check_spec_recursively
connectionr   c                 C     dS )N
mediumblobr*   )r'   r`   r*   r*   r+   db_type      zDynamicField.db_typename1type[Transform] | Callable[..., Transform] | Nonec                   s   t  |}|d ur|S || jv r/| j| }t|tr'tjt }t|||dS t|tj| S |dd }|tj	v rRt
|t
|krRt|d t
| d  |dS d S )Nsubspec_   )key_name	data_type)r%   get_transformr   rS   rT   rW   rX   KeyTransformFactorysplitTYPE_MAPlen)r'   re   	transformtype_rm   endr(   r*   r+   rn      s   



zDynamicField.get_transformr]   c                 C  s,   t |tr
t|S t |trt|S |S rP   )rS   bytesr8   unpackrN   jsonloadsr'   r]   r*   r*   r+   	to_python   s
   



zDynamicField.to_python
expressionr   c                 C  s
   |  |S rP   )r{   )r'   r]   r|   r`   r*   r*   r+   from_db_value   s   
zDynamicField.from_db_valuec                   s2   t  |}t|tr| | j| t|S |S rP   )r%   get_prep_valuerS   rT   validate_specr   r8   packrz   r(   r*   r+   r~      s
   

zDynamicField.get_prep_valuedict[str, Any]prefixc                 C  sv   |  D ]4\}}||v r8t|trtn|}t|| |s&td|||jt|tr8| ||| || d  qd S )NzKey '{}{}' should be of type {}rO   )rV   rS   rT   	TypeErrorrI   rQ   r   )clsr   r]   r   r\   rh   expected_typer*   r*   r+   r      s   
zDynamicField.validate_specc                 C  ra   )NBinaryFieldr*   )r'   r*   r*   r+   get_internal_type  rd   zDynamicField.get_internal_typer6   c                 C  s   t | |S rP   )rx   dumpsvalue_from_object)r'   r6   r*   r*   r+   value_to_string  s   zDynamicField.value_to_stringr   c                   sh   t tt  \}}}}d}||v rd}d|v r!|d tu r!|d= | jr*|d nd|d< ||||fS )N)z/django_mysql.models.fields.dynamic.DynamicFieldz'django_mysql.models.fields.DynamicFieldz django_mysql.models.DynamicFieldr   r   F)r	   r   r%   deconstructrT   r   pop)r'   re   rM   r   r"   	bad_pathsr(   r*   r+   r     s   zDynamicField.deconstructFormField | Nonec                 O  ra   )zN
        Disabled in forms - there is no sensible way of editing this
        Nr*   r'   r   r"   r*   r*   r+   	formfield'  s   zDynamicField.formfield)r   r   r   r   r   r    r   r!   r"   r   r#   r$   )r"   r   r#   r,   )r#   r,   )rL   )r   r   rM   rN   r#   r,   )r`   r   r#   rN   )re   rN   r#   rf   )r]   r   r#   r   )r]   r   r|   r   r`   r   r#   r   )r   r   r]   r   r   rN   r#   r$   )r#   rN   )r6   r   r#   rN   )r#   r   )r   r   r"   r   r#   r   )rQ   
__module____qualname__empty_strings_allowedri   descriptionrT   r&   r-   r/   r0   r1   r2   rc   rn   r{   r}   r~   classmethodr   r   r   r   r   __classcell__r*   r*   r(   r+   r   A   s2    



4



r   c                      s|   e Zd ZU ejdejdedededej	de
diZe e e e e e dZd	ed
< ddd fddZd ddZ  ZS )!rW   DATEDATETIMEDOUBLEINTEGERCHARTIMEBINARY)r   r   r   r   r   r   zdict[str, Field[Any, Any]]rq   Nrg   rl   rN   rm   expressionsr   rh   r!   r#   r$   c                  sb   |dkr
t |d}nz| j| }W n ty   td|w t j|d|i || _|| _d S )Nr   )r   zInvalid data_type output_field)r   rq   KeyError
ValueErrorr%   r&   rl   rm   )r'   rl   rm   rh   r   r   r(   r*   r+   r&   F  s   
zKeyTransform.__init__compilerr   r`   r   tuple[str, Iterable[Any]]c                 C  s4   | | j\}}d| d| j dt|| jf fS )NzCOLUMN_GET(z, %s AS ))compilelhsrm   tuplerl   )r'   r   r`   r   paramsr*   r*   r+   as_sql[  s   zKeyTransform.as_sql)
rl   rN   rm   rN   r   r   rh   r!   r#   r$   )r   r   r`   r   r#   r   )rQ   r   r   dtdatedatetimefloatintrN   timerT   rX   r   r   r   r   r   r   rq   __annotations__r&   r   r   r*   r*   r(   r+   rW   1  s&   
 rW   c                   @  s$   e Zd Z	ddd	d
ZdddZdS )ro   Nrl   rN   rm   rh   r!   r#   r$   c                 C  s   || _ || _|| _d S rP   )rl   rm   rh   )r'   rl   rm   rh   r*   r*   r+   r&   f  s   
zKeyTransformFactory.__init__r   r   r"   r   c                 O  s0   | j d ur
| j |d< t| j| jg|R i |S )Nrh   )rh   rW   rl   rm   r   r*   r*   r+   __call__m  s   

zKeyTransformFactory.__call__rP   )rl   rN   rm   rN   rh   r!   r#   r$   )r   r   r"   r   r#   r   )rQ   r   r   r&   r   r*   r*   r*   r+   ro   e  s    ro   )4
__future__r   r   r   rx   typingr   r   r   r   r   r   r	   django.corer
   django.db.backends.base.baser   django.db.modelsr   r   r   r   r   r   r   r   r   django.db.models.sql.compilerr   django.forms	FormFielddjango.utils.translationr   ri   django_mysql.checksr   django_mysql.models.lookupsr   django_mysql.typingr   r8   ImportErrorrN   r   r   r   r   SpecDictr   register_lookuprW   ro   r*   r*   r*   r+   <module>   s    
 
n4