B
    ©0H[M+  ã               @   s°   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 G dd„ deƒZG dd„ dƒZG dd„ dƒZdZdS )é    N)Úimport_module)Úget_version)Úapps)Ú
migrations)ÚMigrationLoader)Úserializer_factory)Úget_func_args)Ú
module_dir)Únowc               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚSettingsReferencezÀ
    Special subclass of string which actually references a current settings
    value. It's treated as the value in memory, but serializes out to a
    settings.NAME attribute reference.
    c             C   s   t  | |¡S )N)ÚstrÚ__new__)ÚselfÚvalueÚsetting_name© r   ú_C:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\db\migrations\writer.pyr      s    zSettingsReference.__new__c             C   s
   || _ d S )N)r   )r   r   r   r   r   r   Ú__init__   s    zSettingsReference.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r      s   r   c               @   s>   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚOperationWriteré   c             C   s   || _ g | _|| _d S )N)Ú	operationÚbuffÚindentation)r   r   r   r   r   r   r      s    zOperationWriter.__init__c       
         s
  ‡ ‡fdd„}t ƒ ‰ ˆj ¡ \}}}tˆjjƒ}tt|d ƒˆjjkrTˆ d| ¡ n,ˆ  	dˆjjj
 ¡ ˆ dˆjjj
|f ¡ ˆ ¡  x*t|ƒD ]\}}|}|| }	||	|ƒ q’W t|ƒ}x.||d … D ]}	|	|krÊ||	 }||	|ƒ qÊW ˆ ¡  ˆ d¡ ˆ ¡ ˆ fS )Nc                sH  | ˆj jk�r¸t|tttfƒ�r¸t|tƒ�rˆ d|  ¡ ˆ ¡  x´| ¡ D ]¨\}}t	 
|¡\}}t	 
|¡\}}| ¡ }t|ƒdkrÎˆ d||d f ¡ x|dd… D ]}	ˆ |	¡ q¨W ˆ d|d  ¡ nˆ d||f ¡ ˆ  |¡ ˆ  |¡ qLW ˆ ¡  ˆ d¡ nªˆ d	|  ¡ ˆ ¡  x€|D ]x}
t	 
|
¡\}}| ¡ }t|ƒdk�r†x |d d… D ]}	ˆ |	¡ �q^W ˆ d|d  ¡ nˆ d| ¡ ˆ  |¡ �q(W ˆ ¡  ˆ d
¡ nŒt	 
|¡\}}| ¡ }t|ƒdk�r(ˆ d| |d f ¡ x |dd… D ]}	ˆ |	¡ �q W ˆ d|d  ¡ nˆ d| |f ¡ ˆ  |¡ d S )Nz%s={é   z%s: %sr   éÿÿÿÿz%s,z%s: %s,z},z%s=[z],z%s=%sz%s=%s,)r   Zserialization_expand_argsÚ
isinstanceÚlistÚtupleÚdictÚfeedÚindentÚitemsÚMigrationWriterÚ	serializeÚ
splitlinesÚlenÚupdateÚunindent)Z	_arg_nameZ
_arg_valueÚkeyr   Z
key_stringZkey_importsZ
arg_stringZarg_importsÚargsÚargÚitem)Úimportsr   r   r   Ú_write%   sR    

z)OperationWriter.serialize.<locals>._writezmigrations.%s(z	import %sz%s.%s(z),)Úsetr   Zdeconstructr   r   Úgetattrr   Ú	__class__r#   Úaddr   r$   Ú	enumerater)   r+   Úrender)
r   r1   Únamer-   ÚkwargsZoperation_argsÚir.   Ú	arg_valueZarg_namer   )r0   r   r   r'   #   s*    0
zOperationWriter.serializec             C   s   |  j d7  _ d S )Nr   )r   )r   r   r   r   r$   t   s    zOperationWriter.indentc             C   s   |  j d8  _ d S )Nr   )r   )r   r   r   r   r+   w   s    zOperationWriter.unindentc             C   s   | j  d| jd  | ¡ d S )Nú é   )r   Úappendr   )r   Úliner   r   r   r#   z   s    zOperationWriter.feedc             C   s   d  | j¡S )NÚ
)Újoinr   )r   r   r   r   r7   }   s    zOperationWriter.renderN)r   )	r   r   r   r   r'   r$   r+   r#   r7   r   r   r   r   r      s   
Qr   c               @   sP   e Zd ZdZdd„ Zdd„ Zedd„ ƒZedd	„ ƒZed
d„ ƒZ	e
dd„ ƒZdS )r&   zj
    Take a Migration instance and is able to produce the contents
    of the migration file from it.
    c             C   s   || _ d| _d S )NF)Ú	migrationÚneeds_manual_porting)r   rB   r   r   r   r   ‡   s    zMigrationWriter.__init__c             C   sò  dddœ}t ƒ }g }x4| jjD ](}t|ƒ ¡ \}}| |¡ | |¡ qW |r\d |¡d nd|d< g }xR| jjD ]F}|d dkr | d|d  ¡ | 	d	¡ qr| d
|  |¡d  ¡ qrW |rÎd |¡d nd|d< t ƒ }	xDt
|ƒD ]8}
t d|
¡ræ|	 	|
 d¡d  ¡ ¡ | |
¡ d| _qæW d|k�rB| d¡ | 	d¡ n
| 	d¡ t|dd„ d�}|�rpd |¡d nd|d< |	�rœ|d  dd t|	ƒ¡ 7  < | jj�rÀd|  | jj¡d  |d< |jtƒ tƒ  d¡d� | jj�rêd|d< t| S )z%Return a string of the file contents.Ú )Úreplaces_strÚinitial_strr@   Ú
operationsr   Z__setting__z5        migrations.swappable_dependency(settings.%s),r   z from django.conf import settingsz        %s,Údependenciesz^import (.*)\.\d+[^\s]*$ÚimportTzfrom django.db import modelsz(from django.db import migrations, modelsz from django.db import migrationsc             S   s   |   ¡ d S )Nr   )Úsplit)r:   r   r   r   Ú<lambda>¹   s    z+MigrationWriter.as_string.<locals>.<lambda>)r,   r0   z½

# Functions from the following migrations need manual copying.
# Move them and any dependencies into this file, then update the
# RunPython operations to refer to the local versions:
# %sz
# z
    replaces = %s
rE   z%Y-%m-%d %H:%M)ÚversionÚ	timestampz
    initial = True
rF   )r2   rB   rG   r   r'   r*   r>   rA   rH   r5   r    ÚreÚmatchrJ   ÚstripÚremoverC   ÚdiscardÚsortedZreplacesr   r
   ÚstrftimeÚinitialÚMIGRATION_TEMPLATE)r   r%   r0   rG   r   Zoperation_stringZoperation_importsrH   Ú
dependencyZmigration_importsr?   Zsorted_importsr   r   r   Ú	as_string‹   sP    







zMigrationWriter.as_stringc          
   C   sš  t  | jj¡\}}|d kr*td| jj ƒ‚yt|ƒ}W n tk
rJ   Y n X yt|ƒS  tk
rh   Y nX t 	| jj¡}| 
d¡\}}}|j|kr¢tj |j|¡S | d¡g  }}xz|�r | d| d¡¡ ytd |¡ƒ}	W n tk
rô   w´Y q´X yt|	ƒ}
W n tk
�r   w´Y q´X P q´W td| ƒ‚tjj|
f|žŽ }tj |¡�sXt |¡ x<|D ]4}tj |
|¡}
ttj |
d¡dƒ� W d Q R X �q^W |S )NztDjango can't create migrations for app '%s' because migrations have been disabled via the MIGRATION_MODULES setting.Ú.r   r   z„Could not locate an appropriate location to create migrations package %s. Make sure the toplevel package exists and can be imported.z__init__.pyÚw)r   Úmigrations_modulerB   Z	app_labelÚ
ValueErrorr   ÚImportErrorr	   r   Zget_app_configÚ
rpartitionr8   ÚosÚpathrA   rJ   ÚinsertÚpopÚisdirÚmakedirsÚopen)r   Zmigrations_package_nameÚ_r[   Z
app_configZmaybe_app_nameZmigrations_package_basenameZexisting_dirsZmissing_dirsÚbase_moduleÚbase_dirZ	final_dirZmissing_dirr   r   r   ÚbasedirÐ   sP    


zMigrationWriter.basedirc             C   s   d| j j S )Nz%s.py)rB   r8   )r   r   r   r   Úfilename  s    zMigrationWriter.filenamec             C   s   t j | j| j¡S )N)r_   r`   rA   ri   rj   )r   r   r   r   r`     s    zMigrationWriter.pathc             C   s   t |ƒ ¡ S )N)r   r'   )Úclsr   r   r   r   r'     s    zMigrationWriter.serializeN)r   r   r   r   r   rX   Úpropertyri   rj   r`   Úclassmethodr'   r   r   r   r   r&   �   s   E=r&   zÛ# Generated by Django %(version)s on %(timestamp)s

%(imports)s

class Migration(migrations.Migration):
%(replaces_str)s%(initial_str)s
    dependencies = [
%(dependencies)s    ]

    operations = [
%(operations)s    ]
)r_   rN   Ú	importlibr   Zdjangor   Zdjango.appsr   Z	django.dbr   Zdjango.db.migrations.loaderr   Zdjango.db.migrations.serializerr   Zdjango.utils.inspectr   Zdjango.utils.module_loadingr	   Zdjango.utils.timezoner
   r   r   r   r&   rV   r   r   r   r   Ú<module>   s   d (