B
    CVvg‡2  ã               @   s„  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
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mZ d dlmZmZ d dlmZ d dlmZ G d	d
„ d
ƒ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!G dd„ deƒ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&G dd„ deƒ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+G d'd(„ d(e$ƒZ,G d)d*„ d*e$ƒZ-G d+d,„ d,eƒZ.G d-d.„ d.eƒZ/G d/d0„ d0eƒZ0G d1d2„ d2eƒZ1G d3d4„ d4eƒZ2G d5d6„ d6eƒZ3G d7d8„ d8eƒZ4G d9d:„ d:eƒZ5G d;d<„ d<eƒZ6G d=d>„ d>eƒZ7G d?d@„ d@ƒZ8dAdB„ Z9dS )Cé    N)ÚSettingsReference)Úmodels)Ú	Operation)ÚCOMPILED_REGEX_TYPEÚRegexObject)Ú
LazyObjectÚPromise)Úutc)Úget_docs_versionc               @   s   e Zd Zdd„ Zdd„ ZdS )ÚBaseSerializerc             C   s
   || _ d S )N)Úvalue)Úselfr   © r   úC/tmp/pip-install-o3oxmrkh/Django/django/db/migrations/serializer.pyÚ__init__   s    zBaseSerializer.__init__c             C   s   t dƒ‚d S )NzCSubclasses of BaseSerializer must implement the serialize() method.)ÚNotImplementedError)r   r   r   r   Ú	serialize   s    zBaseSerializer.serializeN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r      s   r   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚBaseSequenceSerializerc             C   s   t dƒ‚d S )NzISubclasses of BaseSequenceSerializer must implement the _format() method.)r   )r   r   r   r   Ú_format    s    zBaseSequenceSerializer._formatc             C   sX   t ƒ }g }x2| jD ](}t|ƒ ¡ \}}| |¡ | |¡ qW |  ¡ }|d |¡ |fS )Nz, )Úsetr   Úserializer_factoryr   ÚupdateÚappendr   Újoin)r   ÚimportsÚstringsÚitemÚitem_stringÚitem_importsr   r   r   r   r   #   s    
z BaseSequenceSerializer.serializeN)r   r   r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd Zdd„ ZdS )ÚBaseSimpleSerializerc             C   s   t | jƒtƒ fS )N)Úreprr   r   )r   r   r   r   r   /   s    zBaseSimpleSerializer.serializeN)r   r   r   r   r   r   r   r   r"   .   s   r"   c               @   s   e Zd Zdd„ ZdS )ÚChoicesSerializerc             C   s   t | jjƒ ¡ S )N)r   r   r   )r   r   r   r   r   4   s    zChoicesSerializer.serializeN)r   r   r   r   r   r   r   r   r$   3   s   r$   c               @   s   e Zd ZdZdd„ ZdS )ÚDateTimeSerializerz)For datetime.*, except datetime.datetime.c             C   s   t | jƒdhfS )Nzimport datetime)r#   r   )r   r   r   r   r   :   s    zDateTimeSerializer.serializeN)r   r   r   Ú__doc__r   r   r   r   r   r%   8   s   r%   c               @   s   e Zd ZdZdd„ ZdS )ÚDatetimeDatetimeSerializerzFor datetime.datetime.c             C   s\   | j jd k	r&| j jtkr&| j  t¡| _ dg}| j jd k	rB| d¡ t| j ƒ dd¡t|ƒfS )Nzimport datetimez%from django.utils.timezone import utcz<UTC>r	   )r   Útzinfor	   Ú
astimezoner   r#   Úreplacer   )r   r   r   r   r   r   @   s    
z$DatetimeDatetimeSerializer.serializeN)r   r   r   r&   r   r   r   r   r   r'   >   s   r'   c               @   s   e Zd Zdd„ ZdS )ÚDecimalSerializerc             C   s   t | jƒdhfS )Nzfrom decimal import Decimal)r#   r   )r   r   r   r   r   J   s    zDecimalSerializer.serializeN)r   r   r   r   r   r   r   r   r+   I   s   r+   c               @   s,   e Zd Zedd„ ƒZedd„ ƒZdd„ ZdS )ÚDeconstructableSerializerc       
      C   s    t  | ¡\}}g }x0|D ](}t|ƒ ¡ \}}| |¡ | |¡ qW xDt| ¡ ƒD ]4\}	}t|ƒ ¡ \}}| |¡ | d|	|f ¡ qRW d|d |¡f |fS )Nz%s=%sz%s(%s)z, )	r,   Ú_serialize_pathr   r   r   r   ÚsortedÚitemsr   )
ÚpathÚargsÚkwargsÚnamer   r   ÚargÚ
arg_stringZarg_importsÚkwr   r   r   Úserialize_deconstructedO   s    


z1DeconstructableSerializer.serialize_deconstructedc             C   s>   |   dd¡\}}|dkr(dh}d| }nd| h}| }||fS )NÚ.é   zdjango.db.modelszfrom django.db import modelsz	models.%sz	import %s)Úrsplit)r0   Úmoduler3   r   r   r   r   r-   ]   s    

z)DeconstructableSerializer._serialize_pathc             C   s   | j | j ¡ Ž S )N)r7   r   Údeconstruct)r   r   r   r   r   h   s    z#DeconstructableSerializer.serializeN)r   r   r   Ústaticmethodr7   r-   r   r   r   r   r   r,   N   s   r,   c               @   s   e Zd Zdd„ ZdS )ÚDictionarySerializerc       	      C   s„   t ƒ }g }x\t| j ¡ ƒD ]J\}}t|ƒ ¡ \}}t|ƒ ¡ \}}| |¡ | |¡ | ||f¡ qW dd dd„ |D ƒ¡ |fS )Nz{%s}z, c             s   s   | ]\}}d ||f V  qdS )z%s: %sNr   )Ú.0ÚkÚvr   r   r   ú	<genexpr>v   s    z1DictionarySerializer.serialize.<locals>.<genexpr>)	r   r.   r   r/   r   r   r   r   r   )	r   r   r   r@   rA   Zk_stringZ	k_importsZv_stringZ	v_importsr   r   r   r   m   s    

zDictionarySerializer.serializeN)r   r   r   r   r   r   r   r   r>   l   s   r>   c               @   s   e Zd Zdd„ ZdS )ÚEnumSerializerc             C   s,   | j j}|j}d||j| j jf d| hfS )Nz	%s.%s[%r]z	import %s)r   Ú	__class__r   r   r3   )r   Ú
enum_classr;   r   r   r   r   z   s    zEnumSerializer.serializeN)r   r   r   r   r   r   r   r   rC   y   s   rC   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚFloatSerializerc                s4   t  | j¡st  | j¡r*d | j¡tƒ fS tƒ  ¡ S )Nzfloat("{}"))ÚmathÚisnanr   ÚisinfÚformatr   Úsuperr   )r   )rD   r   r   r   „   s    zFloatSerializer.serialize)r   r   r   r   Ú__classcell__r   r   )rD   r   rF   ƒ   s   rF   c               @   s   e Zd Zdd„ ZdS )ÚFrozensetSerializerc             C   s   dS )Nzfrozenset([%s])r   )r   r   r   r   r   ‹   s    zFrozensetSerializer._formatN)r   r   r   r   r   r   r   r   rM   Š   s   rM   c               @   s   e Zd Zdd„ ZdS )ÚFunctionTypeSerializerc             C   sÀ   t | jdd ƒrHt| jjtƒrH| jj}|j}d||j| jjf d| hfS | jjdkr\tdƒ‚| jjd krvtd| j ƒ‚| jj}d| jjkr¨d|| jjf d| jj hfS td	| jj|f ƒ‚d S )
NÚ__self__z%s.%s.%sz	import %sz<lambda>z!Cannot serialize function: lambdaz'Cannot serialize function %r: No moduleú<z%s.%sz"Could not find function %s in %s.
)	Úgetattrr   Ú
isinstancerO   Útyper   r   Ú
ValueErrorr   )r   Úklassr;   Úmodule_namer   r   r   r   �   s    z FunctionTypeSerializer.serializeN)r   r   r   r   r   r   r   r   rN   �   s   rN   c               @   s   e Zd Zdd„ ZdS )ÚFunctoolsPartialSerializerc             C   sd   t | jjƒ ¡ \}}t | jjƒ ¡ \}}t | jjƒ ¡ \}}dh|||™}d| jjj|||f |fS )Nzimport functoolszfunctools.%s(%s, *%s, **%s))r   r   Úfuncr   r1   ÚkeywordsrD   r   )r   Zfunc_stringZfunc_importsÚargs_stringZargs_importsZkeywords_stringZkeywords_importsr   r   r   r   r   ¦   s    z$FunctoolsPartialSerializer.serializeN)r   r   r   r   r   r   r   r   rW   ¥   s   rW   c               @   s   e Zd Zdd„ ZdS )ÚIterableSerializerc             C   sd   t ƒ }g }x2| jD ](}t|ƒ ¡ \}}| |¡ | |¡ qW t|ƒdkrNdnd}|d |¡ |fS )Nr9   z(%s)z(%s,)z, )r   r   r   r   r   r   Úlenr   )r   r   r   r   r    r!   r   r   r   r   r   ¹   s    
zIterableSerializer.serializeN)r   r   r   r   r   r   r   r   r[   ¸   s   r[   c               @   s   e Zd Zdd„ ZdS )ÚModelFieldSerializerc             C   s    | j  ¡ \}}}}|  |||¡S )N)r   r<   r7   )r   Ú	attr_namer0   r1   r2   r   r   r   r   Ç   s    zModelFieldSerializer.serializeN)r   r   r   r   r   r   r   r   r]   Æ   s   r]   c               @   s   e Zd Zdd„ ZdS )ÚModelManagerSerializerc             C   sD   | j  ¡ \}}}}}|r2|  |¡\}}d| |fS |  |||¡S d S )Nz%s.as_manager())r   r<   r-   r7   )r   Z
as_managerZmanager_pathZqs_pathr1   r2   r3   r   r   r   r   r   Í   s
    z ModelManagerSerializer.serializeN)r   r   r   r   r   r   r   r   r_   Ì   s   r_   c               @   s   e Zd Zdd„ ZdS )ÚOperationSerializerc             C   s0   ddl m} || jdd� ¡ \}}| d¡|fS )Nr   )ÚOperationWriter)Úindentationú,)Zdjango.db.migrations.writerra   r   r   Úrstrip)r   ra   Ústringr   r   r   r   r   ×   s    zOperationSerializer.serializeN)r   r   r   r   r   r   r   r   r`   Ö   s   r`   c               @   s   e Zd Zdd„ ZdS )ÚPathLikeSerializerc             C   s   t t | j¡ƒi fS )N)r#   ÚosÚfspathr   )r   r   r   r   r   ß   s    zPathLikeSerializer.serializeN)r   r   r   r   r   r   r   r   rf   Þ   s   rf   c               @   s   e Zd Zdd„ ZdS )ÚPathSerializerc             C   s*   t | jtjƒrdnd}d|| jf dhfS )NZPureÚ zpathlib.%s%rzimport pathlib)rR   r   ÚpathlibÚPath)r   Úprefixr   r   r   r   ä   s    zPathSerializer.serializeN)r   r   r   r   r   r   r   r   ri   ã   s   ri   c               @   s   e Zd Zdd„ ZdS )ÚRegexSerializerc             C   sj   t | jjƒ ¡ \}}| jjt d¡jA }t |ƒ ¡ \}}dh||™}|g}|rX| |¡ dd |¡ |fS )Nrj   z	import rezre.compile(%s)z, )	r   r   Úpatternr   ÚflagsÚreÚcompiler   r   )r   Zregex_patternZpattern_importsrp   Zregex_flagsZflag_importsr   r1   r   r   r   r   ì   s    
zRegexSerializer.serializeN)r   r   r   r   r   r   r   r   rn   ë   s   rn   c               @   s   e Zd Zdd„ ZdS )ÚSequenceSerializerc             C   s   dS )Nz[%s]r   )r   r   r   r   r   ú   s    zSequenceSerializer._formatN)r   r   r   r   r   r   r   r   rs   ù   s   rs   c               @   s   e Zd Zdd„ ZdS )ÚSetSerializerc             C   s   | j r
dS dS )Nz{%s}zset(%s))r   )r   r   r   r   r   ÿ   s    zSetSerializer._formatN)r   r   r   r   r   r   r   r   rt   þ   s   rt   c               @   s   e Zd Zdd„ ZdS )ÚSettingsReferenceSerializerc             C   s   d| j j dhfS )Nzsettings.%sz from django.conf import settings)r   Zsetting_name)r   r   r   r   r     s    z%SettingsReferenceSerializer.serializeN)r   r   r   r   r   r   r   r   ru     s   ru   c               @   s   e Zd Zdd„ ZdS )ÚTupleSerializerc             C   s   t | jƒdkrdS dS )Nr9   z(%s)z(%s,))r\   r   )r   r   r   r   r     s    zTupleSerializer._formatN)r   r   r   r   r   r   r   r   rv   
  s   rv   c               @   s   e Zd Zdd„ ZdS )ÚTypeSerializerc             C   sŽ   t jdg ftd ƒdg fg}x(|D ] \}}}|| jkr |t|ƒfS q W t| jdƒrŠ| jj}|tjkrp| jjtƒ fS d|| jj	f d| hfS d S )Nzmodels.Modelz
type(None)r   z%s.%sz	import %s)
r   ZModelrS   r   r   Úhasattrr   Úbuiltinsr   r   )r   Zspecial_casesZcasere   r   r;   r   r   r   r     s    


zTypeSerializer.serializeN)r   r   r   r   r   r   r   r   rw     s   rw   c               @   s   e Zd Zdd„ ZdS )ÚUUIDSerializerc             C   s   dt | jƒ dhfS )Nzuuid.%szimport uuid)r#   r   )r   r   r   r   r   #  s    zUUIDSerializer.serializeN)r   r   r   r   r   r   r   r   rz   "  s   rz   c            (   @   s¾   e Zd Zeeeeeee	e
eeejeejeejeejejejfeeeeeeeedƒe e!e"fe#e$j%e&e'j(e'j)fe*e+j,e+j-e+j.fe/e0j1j2e3e4e5fe6e7j8e9e:j;e<e=j>e?iZ@eAdd„ ƒZBeAdd„ ƒZCdS )Ú
SerializerNc             C   s&   t |tƒstd|j ƒ‚|| j|< d S )Nz('%s' must inherit from 'BaseSerializer'.)Ú
issubclassr   rT   r   Ú	_registry)ÚclsÚtype_Ú
serializerr   r   r   Úregister@  s    
zSerializer.registerc             C   s   | j  |¡ d S )N)r}   Úpop)r~   r   r   r   r   Ú
unregisterF  s    zSerializer.unregister)Dr   r   r   Ú	frozensetrM   Úlistrs   r   rt   Útuplerv   Údictr>   r   ZChoicesr$   ÚenumÚEnumrC   Údatetimer'   ÚdateÚ	timedeltaÚtimer%   r   ru   ÚfloatrF   ÚboolÚintrS   ÚbytesÚstrÚranger"   ÚdecimalÚDecimalr+   Ú	functoolsÚpartialÚpartialmethodrW   ÚtypesÚFunctionTypeÚBuiltinFunctionTypeÚ
MethodTyperN   ÚcollectionsÚabcÚIterabler[   r   r   rn   ÚuuidÚUUIDrz   rk   ZPurePathri   rg   ÚPathLikerf   r}   Úclassmethodr�   rƒ   r   r   r   r   r{   '  s,   
r{   c             C   sÎ   t | tƒrt| ƒ} nt | tƒr.|  ¡ d d } t | tjƒrBt| ƒS t | tjj	ƒrXt
| ƒS t | tƒrjt| ƒS t | tƒr|t| ƒS t| dƒrŽt| ƒS x(tj ¡ D ]\}}t | |ƒrš|| ƒS qšW td| tƒ f ƒ‚d S )Nr9   r   r<   z´Cannot serialize: %r
There are some values Django cannot serialize into migration files.
For more, see https://docs.djangoproject.com/en/%s/topics/migrations/#migration-serializing)rR   r   r’   r   Ú
__reduce__r   ZFieldr]   ÚmanagerZBaseManagerr_   r   r`   rS   rw   rx   r,   r{   r}   r/   rT   r
   )r   r   Zserializer_clsr   r   r   r   K  s(    






r   ):ry   Úcollections.abcr�   rŠ   r”   rˆ   r–   rG   rg   rk   rq   r™   r    Zdjango.confr   Z	django.dbr   Z$django.db.migrations.operations.baser   Zdjango.db.migrations.utilsr   r   Zdjango.utils.functionalr   r   Zdjango.utils.timezoner	   Zdjango.utils.versionr
   r   r   r"   r$   r%   r'   r+   r,   r>   rC   rF   rM   rN   rW   r[   r]   r_   r`   rf   ri   rn   rs   rt   ru   rv   rw   rz   r{   r   r   r   r   r   Ú<module>   s^   

$