3
š(ƒh;  ã               @   sJ   d dl mZ d dlmZ G dd„ deƒZeƒ Zdd„ Zdd„ Zd	d
„ Z	dS )é    )ÚImproperlyConfigured)Úsettingsc               @   s<   e Zd ZdZi Zdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Z	dS )ÚLookupChannelRegistryzï
    Registry for LookupChannels activated for your django project.

    This includes any installed apps that contain lookup.py modules (django 1.7+)
    and any lookups that are explicitly declared in `settings.AJAX_LOOKUP_CHANNELS`
    c             C   sN   i | _ yddlm} W n tk
r*   Y n
X |dƒ ttdƒrJ| jtjƒ dS )z§
        Called when loading the application. Cannot be called a second time,
        (eg. for testing) as Django will not re-import and re-register anything.
        r   )Úautodiscover_modulesZlookupsÚAJAX_LOOKUP_CHANNELSN)Ú	_registryZdjango.utils.module_loadingr   ÚImportErrorÚhasattrr   Úregisterr   )Úselfr   © r   úE/tmp/pip-install-q3hcpn_q/django-ajax-selects/ajax_select/registry.pyÚload_channels   s    
z#LookupChannelRegistry.load_channelsc             C   s@   x:|j ƒ D ].\}}|dkr.|| jkr8| j|= q
|| j|< q
W dS )ak  Register a set of lookup definitions.

        Args:
            lookup_specs (dict): One or more LookupChannel specifications
                - `{'channel': LookupChannelSubclass}`
                - `{'channel': ('module.of.lookups', 'MyLookupClass')}`
                - `{'channel': {'model': 'MyModelToBeLookedUp', 'search_field': 'field_to_search'}}`
        N)Úitemsr   )r   Zlookup_specsÚchannelÚspecr   r   r   r
      s
    	

zLookupChannelRegistry.registerc             C   s¼   ddl m} y| j| }W n$ tk
r>   tdd|i ƒ‚Y nX t|ƒtkr\t||ƒr\|ƒ S t|tƒrz| j	|d |d ƒS t|t
ƒr¬t|d i i dgƒ}t||d ƒ}|ƒ S td	| ƒ‚d
S )ai  Find the LookupChannel class for the named channel and instantiate it.

        Args:
            channel (string):  - name that the lookup channel was registered at
        Returns:
            LookupChannel
        Raises:
            ImproperlyConfigured - if channel is not found.
            Exception - invalid lookup_spec was stored in registery
        r   )ÚLookupChannelz=No ajax_select LookupChannel named %(channel)r is registered.r   ÚmodelÚsearch_fieldÚ é   zInvalid lookup spec: %sN)Úajax_selectr   r   ÚKeyErrorr   ÚtypeÚ
issubclassÚ
isinstanceÚdictÚmake_channelÚtupleÚ
__import__ÚgetattrÚ	Exception)r   r   r   Zlookup_specZlookup_moduleÚlookup_classr   r   r   Úget/   s    

zLookupChannelRegistry.getc             C   s
   || j kS )N)r   )r   r   r   r   r   Úis_registeredW   s    z#LookupChannelRegistry.is_registeredc                s8   ddl m} |jdƒ\‰ ‰G ‡ ‡‡fdd„d|ƒ}|ƒ S )zúAutomatically make a LookupChannel.

        Args:
            app_model (str):   app_name.ModelName
            arg_search_field (str):  the field to search against and to display in search results
        Returns:
            LookupChannel
        r   )r   Ú.c                   s   e Zd Ze” ”ƒZ”ZdS )z=LookupChannelRegistry.make_channel.<locals>.MadeLookupChannelN)Ú__name__Ú
__module__Ú__qualname__Ú	get_modelr   r   r   )Ú	app_labelÚarg_search_fieldÚ
model_namer   r   ÚMadeLookupChannelf   s   
r-   )r   r   Úsplit)r   Z	app_modelr+   r   r-   r   )r*   r+   r,   r   r   Z   s    	z"LookupChannelRegistry.make_channelN)
r&   r'   r(   Ú__doc__r   r   r
   r#   r$   r   r   r   r   r   r      s   (r   c             C   sJ   yddl m} W n( tk
r8   ddlm} |j| |ƒS X |j| |ƒS dS )z0Loads the model given an 'app_label' 'ModelName'r   )Úapps)ÚmodelsN)Údjango.appsr0   r   Z	django.dbr1   r)   )r*   r,   r0   r1   r   r   r   r)   q   s    r)   c              C   s*   yddl m}  W n tk
r$   dS X dS )Nr   )Ú	AppConfigFT)r2   r3   r   )r3   r   r   r   Úcan_autodiscover~   s
    r4   c                s   ‡ fdd„}|S )a"  Decorator to register a LookupClass.

    Example::
        from ajax_select import LookupChannel, register

        @register('agent')
        class AgentLookup(LookupClass):

            def get_query(self):
                ...
            def format_item(self):
                ...

    c                s   ˆ st dƒ‚tjˆ | iƒ | S )Nz'Lookup Channel must have a channel name)Ú
ValueErrorÚregistryr
   )r"   )r   r   r   Ú_wrapper–   s    zregister.<locals>._wrapperr   )r   r7   r   )r   r   r
   †   s    r
   N)
Zdjango.core.exceptionsr   Zdjango.confr   Úobjectr   r6   r)   r4   r
   r   r   r   r   Ú<module>   s   i