ó
O'—^c           @  s|  d  Z  d d l m Z d d l Z d d l m Z d d l m Z y d d l Z Wn! e	 k
 ru d d l
 m Z n Xe e d d ƒ Z i d d	 6d
 d 6d d 6d d 6d d 6d d 6i d d 6d d 6d 6d g d 6d d 6d d 6d d 6d d  6d d! 6e e d" d# ƒ d$ 6d% d& 6d' d( g d) 6g  d* 6g  d+ 6Z d0 Z d1 Z d, „  Z d- „  Z d. e f d/ „  ƒ  YZ e e e e e ƒ Z d S(2   uX  
This module is largely inspired by django-rest-framework settings.

Settings for the OAuth2 Provider are all namespaced in the OAUTH2_PROVIDER setting.
For example your project's `settings.py` file might look like this:

OAUTH2_PROVIDER = {
    'CLIENT_ID_GENERATOR_CLASS':
        'oauth2_provider.generators.ClientIdGenerator',
    'CLIENT_SECRET_GENERATOR_CLASS':
        'oauth2_provider.generators.ClientSecretGenerator',
}

This module provides the `oauth2_settings` object, that is used to access
OAuth2 Provider settings, checking for user settings first, then falling
back to the defaults.
iÿÿÿÿ(   t   unicode_literalsN(   t   settings(   t   ImproperlyConfigured(   t	   importlibu   OAUTH2_PROVIDERu,   oauth2_provider.generators.ClientIdGeneratoru   CLIENT_ID_GENERATOR_CLASSu0   oauth2_provider.generators.ClientSecretGeneratoru   CLIENT_SECRET_GENERATOR_CLASSi€   u   CLIENT_SECRET_GENERATOR_LENGTHu   oauthlib.oauth2.Serveru   OAUTH2_SERVER_CLASSu1   oauth2_provider.oauth2_validators.OAuth2Validatoru   OAUTH2_VALIDATOR_CLASSu,   oauth2_provider.oauth2_backends.OAuthLibCoreu   OAUTH2_BACKEND_CLASSu   Reading scopeu   readu   Writing scopeu   writeu   SCOPESu   __all__u   DEFAULT_SCOPESu
   READ_SCOPEu   WRITE_SCOPEi<   u!   AUTHORIZATION_CODE_EXPIRE_SECONDSi Œ  u   ACCESS_TOKEN_EXPIRE_SECONDSu   REFRESH_TOKEN_EXPIRE_SECONDSu!   OAUTH2_PROVIDER_APPLICATION_MODELu   oauth2_provider.Applicationu   APPLICATION_MODELu   forceu   REQUEST_APPROVAL_PROMPTu   httpu   httpsu   ALLOWED_REDIRECT_URI_SCHEMESu   _SCOPESu   _DEFAULT_SCOPESc         C  sX   t  |  t j ƒ r t |  | ƒ St  |  t t f ƒ rT g  |  D] } t | | ƒ ^ q; S|  S(   um   
    If the given setting is a string import notation,
    then perform the necessary import or imports.
    (   t
   isinstancet   sixt   string_typest   import_from_stringt   listt   tuple(   t   valt   setting_namet   item(    (    s:   /tmp/pip-unpacked-wheel-ndW12l/oauth2_provider/settings.pyt   perform_importL   s
     c         C  s   yM |  j  d ƒ } d j | d  ƒ | d } } t j | ƒ } t | | ƒ SWn; t k
 rŠ } d |  | | j j | f } t | ƒ ‚ n Xd S(   uA   
    Attempt to import a class from a string representation.
    u   .iÿÿÿÿu/   Could not import '%s' for setting '%s'. %s: %s.N(   t   splitt   joinR   t   import_modulet   getattrt   ImportErrort	   __class__t   __name__(   R
   R   t   partst   module_patht
   class_namet   modulet   et   msg(    (    s:   /tmp/pip-unpacked-wheel-ndW12l/oauth2_provider/settings.pyR   X   s    t   OAuth2ProviderSettingsc           B  s5   e  Z d  Z d d d d d „ Z d „  Z d „  Z RS(   uâ   
    A settings object, that allows OAuth2 Provider settings to be accessed as properties.

    Any setting with string import paths will be automatically resolved
    and return the class, rather than the string literal.
    c         C  s@   | p	 i  |  _  | p i  |  _ | p' d |  _ | p6 d |  _ d  S(   N(    (    (   t   user_settingst   defaultst   import_stringst	   mandatory(   t   selfR   R   R   R   (    (    s:   /tmp/pip-unpacked-wheel-ndW12l/oauth2_provider/settings.pyt   __init__n   s    c         C  sA  | |  j  j ƒ  k r( t d | ƒ ‚ n  y |  j | } Wn t k
 rY |  j  | } n X| r | |  j k r t | | ƒ } n  | d k r¨ t t j	 |  j
 ƒ ƒ } n  | d k rd |  j k rÕ t |  j ƒ } qg  } x? |  j D]1 } | |  j k r
| j | ƒ qå t d ƒ ‚ qå Wn  |  j | | ƒ t |  | | ƒ | S(   Nu$   Invalid OAuth2Provider setting: '%s'u   _SCOPESu   _DEFAULT_SCOPESu   __all__u,   Defined DEFAULT_SCOPES not present in SCOPES(   R   t   keyst   AttributeErrorR   t   KeyErrorR   R   R   R   t   iterkeyst   SCOPESt   DEFAULT_SCOPESt   _SCOPESt   appendR   t   validate_settingt   setattr(   R    t   attrR
   t   scope(    (    s:   /tmp/pip-unpacked-wheel-ndW12l/oauth2_provider/settings.pyt   __getattr__t   s*    c         C  s-   | r) | |  j  k r) t d | ƒ ‚ n  d  S(   Nu)   OAuth2Provider setting: '%s' is mandatory(   R   R#   (   R    R,   R
   (    (    s:   /tmp/pip-unpacked-wheel-ndW12l/oauth2_provider/settings.pyR*   ™   s    N(   R   t
   __module__t   __doc__t   NoneR!   R.   R*   (    (    (    s:   /tmp/pip-unpacked-wheel-ndW12l/oauth2_provider/settings.pyR   f   s   	%(   u   CLIENT_ID_GENERATOR_CLASSu   CLIENT_SECRET_GENERATOR_CLASSu   OAUTH2_SERVER_CLASSu   OAUTH2_VALIDATOR_CLASSu   OAUTH2_BACKEND_CLASSu   SCOPESu   ALLOWED_REDIRECT_URI_SCHEMES(   u   CLIENT_ID_GENERATOR_CLASSu   CLIENT_SECRET_GENERATOR_CLASSu   OAUTH2_SERVER_CLASSu   OAUTH2_VALIDATOR_CLASSu   OAUTH2_BACKEND_CLASS(   R0   t
   __future__R    R   t   django.confR   t   django.core.exceptionsR   R   R   t   django.utilsR   R1   t   USER_SETTINGSt   DEFAULTSt	   MANDATORYt   IMPORT_STRINGSR   R   t   objectR   t   oauth2_settings(    (    (    s:   /tmp/pip-unpacked-wheel-ndW12l/oauth2_provider/settings.pyt   <module>   sX   

          		8