3
gU5                 @   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mZ d dl	m
Z
 d dlZd dlmZ d dlmZmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ G d
d deZdS )    N)import_module)urlretrieve)settings)BaseCommandCommandError)handle_extensions)ContextEngine)archive)get_docs_versionc               @   sn   e Zd ZdZg ZdddgZdZdd Zdd
dZdd Z	dddZ
dd Zdd Zdd Zdd Zdd Zd	S )TemplateCommanda  
    Copy either a Django application layout template or a Django project
    layout template into the specified directory.

    :param style: A color style object (see django.core.management.color).
    :param app_or_project: The string 'app' or 'project'.
    :param name: The name of the application or project.
    :param directory: The directory to which the template should be copied.
    :param options: The additional variables passed to project or app templates
    httphttpsftp.py-tpl.pyc             C   s^   |j ddd |j dddd |j dd	d |j d
ddddgdd |j ddddg dd d S )Nnamez#Name of the application or project.)help	directory?zOptional destination directory)nargsr   z
--templatez*The path or URL to load the template from.z--extensionz-e
extensionsappendpyztThe file extension(s) to render (default: "py"). Separate multiple extensions with commas, or use -e multiple times.)destactiondefaultr   z--namez-nfilesz_The file name(s) to render. Separate multiple file names with commas, or use -n multiple times.)add_argument)selfparser r!   ^/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/core/management/templates.pyadd_arguments(   s    zTemplateCommand.add_argumentsNc       #   )   K   sx  || _ |dkrdnd| _g | _|d | _| j| |d krtjjtj |}ytj	| W q t
k
rz   td| Y q tk
r } zt|W Y d d }~X qX nH|dkr| jtjj|d tjjtjj|}tjj|std| tt|d }g }x,|d	 D ] }	|jtd
d |	jd qW | jdkrp| jjd|dj|f  | jjd|dj|f  d| }
d| }d| }d| }djdd |j D }t||
|||||dt dtjidd}tjstj  tj   | j!|d |}t"|d }xtj#|D ]\}}}||d  }|j$|
|}|rXtjj||}tj	|dd x6|d d  D ]&}|j%d s|d!krf|j&| qfW x|D ]z}|j'd,rqtjj||}tjj|||j$|
|}x8| j(D ].\}}|j'|r|d t"|  | }P qW tjj|r0td%|| j|f |j'|sF||krt)|d&d'}|j* }W d Q R X t+ j,|} | j-|}t)|d(d&d'}!|!j| W d Q R X nt.j/|| | jdkr| jjd)|  yt.j0|| | j1| W n, tk
r   | j2jd*| | j3j4 Y nX qW qW | jrt| jdkr>| jjd+ x4| jD ]*}"tjj5|"rdtj&|" n
t.j6|" qFW d S )-Nappana	verbosityz'%s' already existsr   zBDestination directory '%s' does not exist, please create it first.r   r   c             S   s   | j  S )N)strip)xr!   r!   r"   <lambda>V   s    z(TemplateCommand.handle.<locals>.<lambda>,   z/Rendering %s template files with extensions: %sz, z.Rendering %s template files with filenames: %sz%s_namez%s_templatez%s_directoryzcamel_case_%s_name c             s   s   | ]}|d kr|V  qdS )_Nr!   ).0r)   r!   r!   r"   	<genexpr>d   s    z)TemplateCommand.handle.<locals>.<genexpr>Zdocs_versionZdjango_versionF)Z
autoescapetemplate   T)exist_ok.__pycache__.pyo.pyc	.py.classz_%s already exists. Overlaying %s %s into an existing directory won't replace conflicting files.zutf-8)encodingwzCreating %szkNotice: Couldn't set permission bits on %s. You're probably using an uncommon filesystem setup. No problem.zCleaning up temporary files.)r6   r7   r8   )7app_or_projecta_or_anpaths_to_remover'   validate_nameospathjoingetcwdmakedirsFileExistsErrorr   OSErrorbasenameabspath
expanduserexiststupler   extendmapsplitstdoutwritetitler   r   django__version__r   Z
configured	configuresetuphandle_templatelenwalkreplace
startswithremoveendswithrewrite_template_suffixesopenreadr	   Zfrom_stringrendershutilcopyfilecopymodemake_writeablestderrstyleZNOTICEisfilermtree)#r   r;   r   targetoptionsZtop_direr   Zextra_filesfile	base_nameZbase_subdirZbase_directoryZcamel_case_nameZcamel_case_valuecontextZtemplate_dirZprefix_lengthrootdirsr   	path_restZrelative_dir
target_dirdirnamefilenameold_pathnew_path
old_suffix
new_suffixZtemplate_filecontentr1   Znew_fileZpath_to_remover!   r!   r"   handle:   s    

 


 zTemplateCommand.handlec             C   s   |dkrt jjtjd d|S |jdr4|dd }t jj|}t jj|}t jj|r\|S | j	|rr| j
|}nt jj|}t jj|r| j|S td| j|f dS )z
        Determine where the app or project templates are.
        Use django.__path__[0] as the default because the Django install
        directory isn't known.
        Nr   confzfile://   zcouldn't handle %s template %s.)r?   r@   rA   rQ   __path__rY   rH   normpathisdiris_urldownloadrG   rI   extractr   r;   )r   r1   subdirZexpanded_templateZabsolute_pathr!   r!   r"   rU      s    


zTemplateCommand.handle_templater   c             C   s|   |d krt dj| j| jd|j s<t dj|| j|dyt| W n tk
r\   Y nX t dj|| j| j|dd S )Nz you must provide {an} {app} name)r%   r$   zX'{name}' is not a valid {app} {type}. Please make sure the {type} is a valid identifier.)r   r$   typez'{name}' conflicts with the name of an existing Python module and cannot be used as {an} {app} {type}. Please try another {type}.)r   r%   r$   r   )r   formatr<   r;   isidentifierr   ImportError)r   r   Zname_or_dirr!   r!   r"   r>      s(    
zTemplateCommand.validate_namec             C   sL  dd }d| j  }tj|dd}| jj| ||\}}| jdkrR| jjd|  yt|t	j
j||\}}W n4 tk
r }	 ztd|||	f W Y d	d	}	~	X nX |jd
d }
|jd}|rtj|\}}|jdp|
}n|
}| j|d }|jd}| r |r tj|}|r ||7 }|
|krHt	j
j||}tj|| |S |S )zB
        Download the given URL and return the file name.
        c             S   s8   | j d}|jdd }| jdr,|d }n| }||fS )N/r2   )rstriprM   r[   )urltmprs   display_urlr!   r!   r"   cleanup_url   s    


z-TemplateCommand.download.<locals>.cleanup_urlzdjango_%s_template_	_download)prefixsuffixr,   zDownloading %sz"couldn't download URL %s to %s: %sNr   r2   zcontent-dispositionrs   zcontent-typer   )r;   tempfilemkdtempr=   r   r'   rN   rO   r   r?   r@   rA   rE   r   rM   getcgiparse_headersplitext	mimetypesguess_extensionr`   move)r   r   r   r   tempdirrs   r   the_pathinforj   Z	used_namecontent_dispositionr.   paramsZguessed_filenameextcontent_typeZguessed_pathr!   r!   r"   r      s:    	

 



zTemplateCommand.downloadc             C   s@   t j|\}}|j jdr8|dd | }|dd }||fS )z@
        Like os.path.splitext, but takes off .tar, too
        z.tar   Nr   )	posixpathr   lowerr[   )r   r   baser   r!   r!   r"   r   *  s
    zTemplateCommand.splitextc             C   s   d| j  }tj|dd}| jj| | jdkr>| jjd|  ytj	|| |S  tj
tfk
r } ztd|||f W Y dd}~X nX dS )z
        Extract the given file to a temporary directory and return
        the path of the directory with the extracted content.
        zdjango_%s_template_Z_extract)r   r   r,   zExtracting %sz"couldn't extract file %s to %s: %sN)r;   r   r   r=   r   r'   rN   rO   r
   r   ZArchiveExceptionrE   r   )r   rs   r   r   rj   r!   r!   r"   r   4  s    

zTemplateCommand.extractc             C   s*   d|krdS |j ddd j }|| jkS )z)Return True if the name looks like a URL.:Fr2   r   )rM   r   url_schemes)r   r1   schemer!   r!   r"   r   E  s    zTemplateCommand.is_urlc             C   s:   t j|t js6t j|}tj|jtjB }t j|| dS )zb
        Make sure that the file is writeable.
        Useful if our source is read-only.
        N)r?   accessW_OKstatS_IMODEst_modeS_IWUSRchmod)r   rs   stZnew_permissionsr!   r!   r"   rc   L  s    
zTemplateCommand.make_writeabler   r   )r   )N)r   )__name__
__module____qualname____doc__Zrequires_system_checksr   r\   r#   ry   rU   r>   r   r   r   r   rc   r!   r!   r!   r"   r      s   



!6
r   )r   r   r?   r   r`   r   r   	importlibr   urllib.requestr   rQ   Zdjango.confr   Zdjango.core.management.baser   r   Zdjango.core.management.utilsr   Zdjango.templater   r	   Zdjango.utilsr
   Zdjango.utils.versionr   r   r!   r!   r!   r"   <module>   s    