U
    |®c)  ã                   @   sÆ   d 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Zddl	m
Z
 ddlmZ ddlmZ ddlmZmZ dZd	Zd
ZG dd„ deƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZeƒ ZdS )zï
Settings and configuration for Django.

Read values from the module specified by the DJANGO_SETTINGS_MODULE environment
variable, and then from django.conf.global_settings; see the global_settings.py
for a list of all possible variables.
é    N)ÚPath)Úglobal_settings)ÚImproperlyConfigured)ÚRemovedInDjango40Warning)Ú
LazyObjectÚemptyZDJANGO_SETTINGS_MODULEzZThe PASSWORD_RESET_TIMEOUT_DAYS setting is deprecated. Use PASSWORD_RESET_TIMEOUT instead.z¾The DEFAULT_HASHING_ALGORITHM transitional setting is deprecated. Support for it and tokens, cookies, sessions, and signatures that use SHA-1 hashing algorithm will be removed in Django 4.0.c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚSettingsReferencez£
    String subclass which references a current settings value. It's treated as
    the value in memory but serializes to a settings.NAME attribute reference.
    c                 C   s   t  | |¡S ©N)ÚstrÚ__new__©ÚselfÚvalueÚsetting_name© r   ú8/tmp/pip-unpacked-wheel-7m9rsep5/django/conf/__init__.pyr   )   s    zSettingsReference.__new__c                 C   s
   || _ d S 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                       sv   e Zd ZdZddd„Zdd„ Zdd„ Z‡ fd	d
„Z‡ fdd„Ze	fdd„Z
edd„ ƒZedd„ ƒZedd„ ƒZ‡  ZS )ÚLazySettingszì
    A lazy proxy for either global Django settings or a custom settings object.
    The user can manually configure settings prior to using them. Otherwise,
    Django uses the settings module pointed to by DJANGO_SETTINGS_MODULE.
    Nc                 C   s>   t j t¡}|s0|rd| nd}td|tf ƒ‚t|ƒ| _dS )zÄ
        Load the settings module pointed to by the environment variable. This
        is used the first time settings are needed, if the user hasn't
        configured settings manually.
        z
setting %sÚsettingsz™Requested %s, but settings are not configured. You must either define the environment variable %s or call settings.configure() before accessing settings.N)ÚosÚenvironÚgetÚENVIRONMENT_VARIABLEr   ÚSettingsÚ_wrapped)r   ÚnameÚsettings_moduleÚdescr   r   r   Ú_setup6   s    ýÿzLazySettings._setupc                 C   s   | j tkrdS dd| j ji S )Nz<LazySettings [Unevaluated]>z$<LazySettings "%(settings_module)s">r    )r   r   ÚSETTINGS_MODULE©r   r   r   r   Ú__repr__G   s    
 ÿzLazySettings.__repr__c                 C   s^   | j tkr|  |¡ t| j |ƒ}|dkr<|dk	r<|  |¡}n|dkrP|sPtdƒ‚|| j|< |S )z<Return the value of a setting and cache it in self.__dict__.>   Ú	MEDIA_URLÚ
STATIC_URLNZ
SECRET_KEYz)The SECRET_KEY setting must not be empty.)r   r   r"   ÚgetattrÚ_add_script_prefixr   Ú__dict__)r   r   Úvalr   r   r   Ú__getattr__O   s    


zLazySettings.__getattr__c                    s4   |dkr| j  ¡  n| j  |d¡ tƒ  ||¡ dS )zŸ
        Set the value of setting. Clear all cached values if _wrapped changes
        (@override_settings does this) or clear single values when set.
        r   N)r*   ÚclearÚpopÚsuperÚ__setattr__©r   r   r   ©Ú	__class__r   r   r0   _   s    zLazySettings.__setattr__c                    s   t ƒ  |¡ | j |d¡ dS )z3Delete a setting and clear it from cache if needed.N)r/   Ú__delattr__r*   r.   ©r   r   r2   r   r   r4   j   s    zLazySettings.__delattr__c                 K   sV   | j tk	rtdƒ‚t|ƒ}| ¡ D ](\}}| ¡ s>td| ƒ‚t|||ƒ q"|| _ dS )zÜ
        Called to manually configure the settings. The 'default_settings'
        parameter sets where to retrieve any unspecified values from (its
        argument must support attribute access (__getattr__)).
        zSettings already configured.zSetting %r must be uppercase.N)r   r   ÚRuntimeErrorÚUserSettingsHolderÚitemsÚisupperÚ	TypeErrorÚsetattr)r   Údefault_settingsÚoptionsZholderr   r   r   r   r   Ú	configureo   s    
zLazySettings.configurec                 C   s(   |   d¡r| S ddlm} d|ƒ | f S )zÕ
        Add SCRIPT_NAME prefix to relative paths.

        Useful when the app is being served at a subpath and manually prefixing
        subpath to STATIC_URL and MEDIA_URL in settings is inconvenient.
        )zhttp://zhttps://ú/r   )Úget_script_prefixz%s%s)Ú
startswithZdjango.urlsr@   )r   r@   r   r   r   r)   ~   s    	
zLazySettings._add_script_prefixc                 C   s
   | j tk	S )z9Return True if the settings have already been configured.)r   r   r$   r   r   r   Ú
configuredŒ   s    zLazySettings.configuredc                 C   sF   t  ¡ }|d \}}}}| tj tj¡¡s<tj	t
tdd� |  d¡S )Néþÿÿÿé   )Ú
stacklevelÚPASSWORD_RESET_TIMEOUT_DAYS)Ú	tracebackÚextract_stackrA   r   ÚpathÚdirnameÚdjangoÚ__file__ÚwarningsÚwarnÚ*PASSWORD_RESET_TIMEOUT_DAYS_DEPRECATED_MSGr   r,   )r   ÚstackÚfilenameÚ_r   r   r   rF   ‘   s    ýz(LazySettings.PASSWORD_RESET_TIMEOUT_DAYS)N)r   r   r   r   r"   r%   r,   r0   r4   r   r>   Ústaticmethodr)   ÚpropertyrB   rF   Ú__classcell__r   r   r2   r   r   0   s   


r   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )r   c                 C   s`  t tƒD ]}| ¡ rt| |tt|ƒƒ q|| _t | j¡}d}tƒ | _	t |ƒD ]P}| ¡ rNt||ƒ}||kr†t
|ttfƒs†td| ƒ‚t| ||ƒ | j	 |¡ qN|  d¡râ|  d¡r¼tdƒ‚t| d| jd d d ƒ t tt¡ |  d¡røt tt¡ ttd	ƒ�r\| j�r\td
ƒ}|j| j d¡Ž }| ¡ �rH| ¡ �sHtd| j ƒ‚| jtjd< t  ¡  d S )N)ZINSTALLED_APPSZTEMPLATE_DIRSZLOCALE_PATHSz*The %s setting must be a list or a tuple. rF   ÚPASSWORD_RESET_TIMEOUTzJPASSWORD_RESET_TIMEOUT_DAYS/PASSWORD_RESET_TIMEOUT are mutually exclusive.é<   é   ÚDEFAULT_HASHING_ALGORITHMÚtzsetz/usr/share/zoneinfor?   zIncorrect timezone setting: %sZTZ)!Údirr   r9   r;   r(   r#   Ú	importlibÚimport_moduleÚsetÚ_explicit_settingsÚ
isinstanceÚlistÚtupler   ÚaddÚis_overriddenrF   rM   rN   rO   r   Ú(DEFAULT_HASHING_ALGORITHM_DEPRECATED_MSGÚhasattrÚtimeZ	TIME_ZONEr   ÚjoinpathÚsplitÚexistsÚ
ValueErrorr   r   rZ   )r   r    ÚsettingÚmodZtuple_settingsZsetting_valueZzoneinfo_rootZzone_info_filer   r   r   r   ¡   s@    
ÿ

ÿ
zSettings.__init__c                 C   s
   || j kS r	   )r_   )r   rl   r   r   r   rd   Ô   s    zSettings.is_overriddenc                 C   s   d| j j| jdœ S )Nz<%(cls)s "%(settings_module)s">)Úclsr    )r3   r   r#   r$   r   r   r   r%   ×   s    þzSettings.__repr__N)r   r   r   r   rd   r%   r   r   r   r   r       s   3r   c                       sX   e Zd ZdZdZdd„ Zdd„ Z‡ fdd„Z‡ fd	d
„Zdd„ Z	dd„ Z
dd„ Z‡  ZS )r7   z$Holder for user configured settings.Nc                 C   s   t ƒ | jd< || _dS )z›
        Requests for configuration variables not in this class are satisfied
        from the module specified in default_settings (if possible).
        Ú_deletedN)r^   r*   r<   )r   r<   r   r   r   r   ä   s    zUserSettingsHolder.__init__c                 C   s"   |  ¡ r|| jkrt‚t| j|ƒS r	   )r9   ro   ÚAttributeErrorr(   r<   r5   r   r   r   r,   ì   s    zUserSettingsHolder.__getattr__c                    s^   | j  |¡ |dkr8t| d|d d d ƒ t tt¡ |dkrLt tt¡ tƒ  	||¡ d S )NrF   rV   rW   rX   rY   )
ro   Údiscardr;   rM   rN   rO   r   re   r/   r0   r1   r2   r   r   r0   ñ   s    zUserSettingsHolder.__setattr__c                    s&   | j  |¡ t| |ƒr"tƒ  |¡ d S r	   )ro   rc   rf   r/   r4   r5   r2   r   r   r4   ú   s    
zUserSettingsHolder.__delattr__c                    s"   t ‡ fdd„ˆ jtˆ jƒ•D ƒƒS )Nc                 3   s   | ]}|ˆ j kr|V  qd S r	   )ro   )Ú.0Úsr$   r   r   Ú	<genexpr>   s   
ÿz-UserSettingsHolder.__dir__.<locals>.<genexpr>)Úsortedr*   r[   r<   r$   r   r$   r   Ú__dir__ÿ   s    ÿzUserSettingsHolder.__dir__c                 C   s6   || j k}|| jk}t| jddd„ ƒ|ƒ}|p4|p4|S )Nrd   c                 S   s   dS )NFr   )rs   r   r   r   Ú<lambda>  ó    z2UserSettingsHolder.is_overridden.<locals>.<lambda>)ro   r*   r(   r<   )r   rl   ZdeletedZset_locallyZset_on_defaultr   r   r   rd     s    

z UserSettingsHolder.is_overriddenc                 C   s   dd| j ji S )Nz	<%(cls)s>rn   )r3   r   r$   r   r   r   r%     s     ÿzUserSettingsHolder.__repr__)r   r   r   r   r#   r   r,   r0   r4   rv   rd   r%   rU   r   r   r2   r   r7   Þ   s   	r7   )r   r\   r   rg   rG   rM   Úpathlibr   rK   Zdjango.confr   Zdjango.core.exceptionsr   Zdjango.utils.deprecationr   Zdjango.utils.functionalr   r   r   rO   re   r
   r   r   r   r7   r   r   r   r   r   Ú<module>   s*   ÿÿp>3