
^Q\kW                 @   s#  d  d l  m 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 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 m Z m  Z  m! Z! yr d e
 j" k r=d Z# nV d e
 j" k red  d l$ m% Z% d Z# n. d e
 j" k rd  d l& m% Z% d Z# n d Z# Wn e' k
 rd Z# Yn Xe j( d e j)  Z* d Z+ e, e
 d d  Z- e, e
 d d  Z. e j/ e0  Z1 Gd d   d e  Z2 d d   Z3 d S)    )print_functionN)settings)ImproperlyConfigured)BaseCommandCommandError)get_internal_wsgi_application)DEFAULT_DB_ALIASconnections)utils)MigrationExecutor)gen_filenames)null_technical_500_response)RedirectHandlerhas_ipdbsetup_loggersignalcommandzwhitenoise.runserver_nostaticFzdjango.contrib.staticfiles)StaticFilesHandlerTZstaticfilesz^(?:
(?P<addr>
    (?P<ipv4>\d{1,3}(?:\.\d{1,3}){3}) |         # IPv4 address
    (?P<ipv6>\[[a-fA-F0-9:]+\]) |               # IPv6 address
    (?P<fqdn>[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*) # FQDN
):)?(?P<port>\d+)$Z8000Z&RUNSERVERPLUS_POLLER_RELOADER_INTERVAL   Z"RUNSERVERPLUS_POLLER_RELOADER_TYPEautoc                   s   e  Z d  Z d Z d Z   f d d   Z e d d    Z d d   Z e	 d	 d
    Z
 e	 d d    Z e	 d d    Z e j d d  d k r d d   Z n    S)Commandz0Starts a lightweight Web server for development.Fc                sM  t  t |   j |  | j d d d d d | j d d d d	 d
 d d d d d | j d d d d
 d d d d d | j d d d	 d
 d d d | j d d d d
 d d d | j d d d	 d
 d d d | j d d
 d d d  d d | j d d d	 d d d d  | j   } | j d! d
 d" d d# d$ t d d% | j d& d
 d" d d# d$ t d d' | j d( d
 d) d d# d$ t d d* | j d+ d
 d, d d- d$ t d d. | j d/ d
 d0 d d# d$ t d t d d1 t | j d2 d
 d3 d d# d$ t d t d d4 t | j d5 d d	 d
 d6 d d d d7 | j d8 d d	 d
 d9 d d d d: | j d; d d	 d
 d< d d d d= | j d> d
 d? d d# d d@ d dA | j dB d
 dC d d	 d d d dD | j dE d
 dF d d	 d d d dG f t	 rI| j dH d d d
 dI d d d dJ | j dK d d	 d
 dL d d d dM n  d  S)NNaddrportnargs?helpz$Optional port number, or ipaddr:portz--ipv6z-6action
store_truedestuse_ipv6defaultFz#Tells Django to use a IPv6 address.z
--noreloadstore_falseuse_reloaderTz*Tells Django to NOT use the auto-reloader.z	--browseropen_browserzTells Django to open a browser.z--nothreadingthreadedz!Do not run in multithreaded mode.z
--threadedzRun in multithreaded mode.z--outputoutput_filezRSpecifies an output file to send a copy of all messages (not flushed immediately).z--print-sqlz%Print SQL queries as they're executedz--cert	cert_pathstoretypez(Deprecated alias for --cert-file option.z--cert-filezSSL .cert file path. If not provided path from --key-file will be selected. Either --cert-file or --key-file must be provided to use SSL.z
--key-filekey_file_pathzSSL .key file path. If not provided path from --cert-file will be selected. Either --cert-file or --key-file must be provided to use SSL.z--extra-fileextra_filesappendzQauto-reload whenever the given file changes too (can be specified multiple times)z--reloader-intervalreloader_intervalzVAfter how many seconds auto-reload should scan for updates in poller-mode [default=%s]z--reloader-typereloader_typezHWerkzeug reloader type [options are auto, watchdog, or stat, default=%s]z--pdbpdbz-Drop into pdb shell at the start of any view.z--ipdbipdbz.Drop into ipdb shell at the start of any view.z--pmpmz;Drop into (i)pdb shell if an exception is raised in a view.z--startup-messagesstartup_messagesreloadzEWhen to show startup messages: reload [default], once, always, never.z--keep-meta-shutdownkeep_meta_shutdown_funczKeep request.META['werkzeug.server.shutdown'] function which is automatically removed because Django debug pages tries to call the function and unintentionally shuts down the Werkzeug server.z--nopinnopinz+Disable the PIN in werkzeug. USE IT WISELY!z
--nostaticuse_static_handlerzCTells Django to NOT automatically serve static files at STATIC_URL.z
--insecureinsecure_servingz3Allows serving static files even if DEBUG is False.)
superr   add_argumentsadd_argumentadd_mutually_exclusive_groupstrint DEFAULT_POLLER_RELOADER_INTERVALDEFAULT_POLLER_RELOADER_TYPEUSE_STATICFILES)selfparserZ
cert_group)	__class__ e/var/www/dbchiro/venv/build/django-extensions/django_extensions/management/commands/runserver_plus.pyr6   <   s^    !$$
zCommand.add_argumentsc          .      s  | j  d  } | j  d d  } | d k rE t j j  d  |  _ nF | d k rj t j j  d  |  _ n! | d k r d |  _ n	 d |  _ d	 t j d <t |  j d
  r d  |  j _ n  t t |  j d | j  d d   t	 t
  } t j d  } | j t j  | j |  d | _ | j  d d  ry d d  l  Wn t k
 rXd   Yn Xy d d  l   d d  l   Wn t k
 rd    Yn Xt t d d   G    f d d   d t j  } | t _ n  | j  d d  } | j  d d  }	 | j  d d  }
 y d d l m } Wn9 t k
 rX| s?|	 s?|
 rNt d   n  d }
 Yn X| sn|	 snt j rd } y t j } Wn0 t k
 rt j  d' k r  n  t j! } Yn X| | k rt" | t#  r| | f 7} q| | g 7} qn  | rd | _$ n |	 rd | _$ n  d d   } d d l% m& } |
 r>| n t' | _( | j  d  |  _) |  j) r{t* j+ r{t d   n  d |  _, | sy t j- } Wqt k
 rYqXn  | sd  |  _. t/ |  _0 n t1 j2 t3 |  } | d  k rt d! |   n  | j4   \ |  _. } } } |  _0 |  j0 j5   sAt d" |  j0   n  |  j. r| r{|  j. d# d(  |  _. d |  _) d |  _, q|  j) r| rt d$ |  j.   qn  |  j. s|  j) rd% n d& |  _. d |  _, n  |  j6 |  d  S))Nr   r/   r0   ZRUNSERVER_PLUS_SHOW_MESSAGESonceZneverFT1endingfilenamer#   werkzeugZ	print_sqlr   Z!RUNSERVER_PLUS_PRINT_SQL_TRUNCATEi  c                   s+   e  Z d  Z f      f d d  Z d S)z)Command.handle.<locals>.PrintQueryWrapperc                s  t  j    } z |  j j | |  SWd  t  j    | } |  j j j |  j | |  }  r | d    }  j | d d d d } n    r   j |   j j	 d    j
 j    } n  t j |  t j d  t j d | |  j j f  t j d  Xd  S)NZreindent_alignedTZtruncate_stringsi  sql z&[Execution time: %.6fs] [Database: %s])timecursorexecutedbopsZlast_executed_queryformatZ	highlightZlexersZget_lexer_by_name
formattersZTerminalFormatterloggerinfoalias)r>   rH   paramsZ	starttimeZexecution_timeZraw_sql)pygmentssqlparsetruncaterA   rB   rL      s"    z1Command.handle.<locals>.PrintQueryWrapper.executeN)__name__
__module____qualname__rL   rA   )rU   rV   rW   rA   rB   PrintQueryWrapper   s   r[   r,   r-   r.   )PdbMiddlewarezdjango-pdb is required for --pdb, --ipdb and --pm options. Please visit https://pypi.python.org/pypi/django-pdb or install via pip. (pip install django-pdb)z#django_pdb.middleware.PdbMiddleware   c             S   s^   t    r d d  l } | } n d d  l } | } t d | | f d t j | j |  d  S)Nr   zException occured: %s, %sfile)r   r-   r,   printsysstderrZpost_mortem)requestexc_type	exc_valuetbr-   pr,   rA   rA   rB   
postmortem   s    		z"Command.handle.<locals>.postmortem)debugr   z"Your Python does not support IPv6.rI   z5"%s" is not a valid port number or address:port pair.z%r is not a valid port number.r   z!"%s" is not a valid IPv6 address.z::1z	127.0.0.1)r]   r   )7getosenvironshow_startup_messageshasattrra   rE   r   rQ   r   rX   logging	getLoggersetLevelINFO
addHandler	propagaterV   ImportErrorZpygments.lexersZpygments.formattersgetattrr   r
   ZCursorDebugWrapperZdjango_pdb.middlewarer\   r   DEBUGZ
MIDDLEWAREAttributeErrordjangoVERSIONZMIDDLEWARE_CLASSES
isinstancetupleZalways_breakZdjango.viewsrh   r   Ztechnical_500_responser   sockethas_ipv6	_raw_ipv6Z!RUNSERVERPLUS_SERVER_ADDRESS_PORTaddrDEFAULT_PORTportrematch
naiveip_regroupsisdigit	inner_run)r>   argsoptionsr   r/   ZlogredirectZ
werkloggerr[   Z
pdb_optionZipdb_optionr.   r\   Z
middlewareZsettings_middlewarerg   rh   mZ_ipv4Z_ipv6Z_fqdnrA   )rU   rV   rW   rB   handler   s    	"	%		!			zCommand.handlec          :      s  yl d d l  m } m } d d l m } t j rk y t   Wqk t k
 rg |  j	 rc t
 d  n  Yqk Xn  Wn t k
 r t d   Yn XG   f d d   d |     j d d	  }  j d
 d	  }  j d d  } t j d k r d p d }  j d d   pg  }	  j d d  }
  j d d  }  j d d  |  _ |  j	 rdt
 d  n  t |  d  r|  j d |  j	  n |  j d |  j	  y |  j   Wn t k
 rYn Xt   } t r j d d	  }  j d d  } | rt j s| rt |  } qn   j d  s7 j d  rIy d d  l } Wn t k
 rgt d   Yn X|  j   \ } } t j j |  \ } } t j j |  \ } } yh d d l m } t j j  |  rt j j  |  r| | f } n! | t j j! | |  d d  } WqOt k
 rE|  j	 r;t
 d!  n  d" } YqOXn d  } d# | r^d$ n d% |  j" ss|  j# n
 d& |  j# |  j$ f } |  j	 rt
 d' t% j&   t j' f  t
 d( | f  t
 d)  t
 d* |  n  | rd d  l( } | j) |  n  | r/t j* r/|	 j+ t, d+ d,   t-     n  | sEd- t j. d. <n  t j. j d.  d- k r|  j rvd/ t j. d0 <n  | | d	  } n  | |  j# t/ |  j$  | d
 | d1 d	 d |	 d |
 d | d | d2   d3 | d  S)4Nr   )
run_simpleDebuggedApplication)WSGIRequestHandlerzDWrapping internal werkzeug logger for color highlighting has failed!zWerkzeug is required to use runserver_plus.  Please visit http://werkzeug.pocoo.org/ or install via pip. (pip install Werkzeug)c                   s(   e  Z d  Z     f d d   Z   S)z-Command.inner_run.<locals>.WSGIRequestHandlerc                s2   t    |   j   }  j d  s. | d =n  | S)Nr1   zwerkzeug.server.shutdown)r5   make_environrj   )r>   rl   )r   r@   r   rA   rB   r     s    
z:Command.inner_run.<locals>.WSGIRequestHandler.make_environ)rX   rY   rZ   r   rA   )r   r   )r@   rB   r     s   r   r"   Tr    r!   Fwin32z
CTRL-BREAKz	CONTROL-Cr(   r*   r   r+   r   r2   zPerforming system checks...
checkZdisplay_num_errorsr3   r4   r$   r'   zsPython OpenSSL Library is required to use runserver_plus with ssl support. Install via pip (pip install pyOpenSSL).)make_ssl_devcerthost	localhostz<Werkzeug version is less than 0.9, trying adhoc certificate.Zadhocz%s://%s:%s/httpshttpz[%s]z%
Django version %s, using settings %rz#Development server is running at %sz8Using the Werkzeug debugger (http://werkzeug.pocoo.org/)zQuit the server with %s.c             S   s   |  j  d  S)Nz.mo)endswith)rF   rA   rA   rB   <lambda>l  s    z#Command.inner_run.<locals>.<lambda>trueZWERKZEUG_RUN_MAINoffZWERKZEUG_DEBUG_PINZuse_debuggerZrequest_handlerssl_context)0rG   r   r   werkzeug.servingr   r   rw   set_werkzeug_log_color	Exceptionrm   r_   ru   r   rj   r`   platformr2   rn   r   validatecheck_migrationsr   r   r=   r   OpenSSLdetermine_ssl_files_pathsrk   pathsplitsplitextr   existsjoinr   r   r   ry   get_versionZSETTINGS_MODULE
webbrowseropenZUSE_I18Nextendfilterr   rl   r:   )r>   r   r   r   Z_WSGIRequestHandlerr"   r    r!   Zquit_commandr(   r*   r+   handlerr3   r4   r   certfilekeyfiledir_pathroot_r   r   Zbind_urlr   rA   )r   r   rB   r   
  s    				
$%	8	
"	zCommand.inner_runc             C   s`   t  j j |  \ } } | s- t  j   } n  t  j j |  \ } } t  j j | | d |  S)N.)rk   r   r   getcwdr   r   )cls	file_path	extensionr   	cert_file	file_namer   rA   rA   rB    _create_path_with_extension_from  s
    z(Command._create_path_with_extension_fromc             C   s   | d k r |  j  | |  St j j |  \ } } t j j |  \ } } | sb |  j  | |  St j j | | d |  Sd S)a_   Determine path with proper extension. If path is absent then use path from alternative file.
        If path is relative than use current working directory.
        :param current_file: path for current file
        :param other_file: path for alternative file
        :param extension: expected extension
        :return: path of this file.
        Nr   )r   rk   r   r   r   r   )r   Zcurrent_fileZ
other_filer   	directoryr^   r   r   rA   rA   rB   _determine_path_for_file  s    	z Command._determine_path_for_filec             C   sX   |  j  | j d  | j d  d  } |  j  | j d  | j d  d  } | | f S)Nr$   r'   Zcrtkey)r   rj   )r   r   r   key_filerA   rA   rB   r     s    ''z!Command.determine_ssl_files_pathsNr]   r   	   c             C   sy   t  t t  } | j | j j j    } | ru |  j ru |  j j	 |  j
 j d   |  j j	 |  j
 j d   n  d S)z
            Checks to see if the set of migrations on disk matches the
            migrations in the database. Prints a warning if they don't match.
            zV
You have unapplied migrations; your app may not work properly until they are applied.z.Run 'python manage.py migrate' to apply them.
N)r   r	   r   Zmigration_planloadergraphZ
leaf_nodesrm   stdoutwritestyleZNOTICE)r>   ZexecutorZplanrA   rA   rB   r     s
    zCommand.check_migrations)r   r   )rX   rY   rZ   r   Zrequires_system_checksr6   r   r   r   classmethodr   r   r   ry   rz   r   rA   rA   )r@   rB   r   6   s   6r   c                 sg   d d l  m }  d d l m } d d l m   |     | j      f d d   } | | _ d S)z*Try to set color to the werkzeug log.
    r   )color_style)r   )_logc                s@  y7 d |  j    |  j   | | f } t | d  } Wn" t k
 r[  | | |  SYn X| d d k r~  j |  } n | d d k r  j |  } n | d k r  j |  } nq | d d k r  j |  } nO | d k r  j |  } n1 | d d	 k r  j	 |  } n  j
 |  }   | |  d  S)
Nz%s - - [%s] %sr   r   2rD   Z3043Z4044)address_stringlog_date_time_stringr9   r   ZHTTP_SUCCESSZ	HTTP_INFOZHTTP_NOT_MODIFIEDZHTTP_REDIRECTZHTTP_NOT_FOUNDZHTTP_BAD_REQUESTZHTTP_SERVER_ERROR)r>   r&   messager   msgZ	http_code)r   	_orig_log_stylerA   rB   werk_log  s,    		z(set_werkzeug_log_color.<locals>.werk_logN)Zdjango.core.management.colorr   r   r   Zwerkzeug._internalr   log)r   r   r   rA   )r   r   r   rB   r     s    		r   )4
__future__r   ro   rk   r   r}   r`   rJ   ry   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.core.management.baser   r   Zdjango.core.servers.basehttpr   Z	django.dbr   r	   Zdjango.db.backendsr
   Zdjango.db.migrations.executorr   Zdjango.utils.autoreloadr   Z/django_extensions.management.technical_responser   Z"django_extensions.management.utilsr   r   r   r   ZINSTALLED_APPSr=   Z#django.contrib.staticfiles.handlersr   Zstaticfiles.handlersru   compileXr   r   rv   r;   r<   rp   rX   rQ   r   r   rA   rA   rA   rB   <module>   sL   "			
 