Source code for dajaxice.core.Dajaxice

import logging

from django.conf import settings

# Python 2.7 has an importlib with import_module.
# For older Pythons, Django's bundled copy provides it.
# For older Django's dajaxice reduced_import_module.
try:
    from importlib import import_module
except:
    try:
        from django.utils.importlib import import_module
    except:
        from dajaxice.utils import simple_import_module as import_module
        
log = logging.getLogger('dajaxice.DajaxiceRequest')

[docs]class DajaxiceFunction(object): def __init__(self, name, path): self.name = name self.path = path
[docs] def get_callable_path(self): return '%s.%s' % (self.path.replace('.ajax',''), self.name)
def __cmp__(self, other): return (self.name == other.name and self.path == other.path)
[docs]class DajaxiceModule(object): def __init__(self, module): self.functions = [] self.sub_modules = [] self.name = module[0] sub_module = module[1:] if len(sub_module)!=0: self.add_submodule(sub_module)
[docs] def get_module(self, module): """ Recursively get_module util we found it. """ if len(module) == 0: return self for dajaxice_module in self.sub_modules: if dajaxice_module.name == module[0]: return dajaxice_module.get_module(module[1:]) return None
[docs] def add_function(self, function): self.functions.append(function)
[docs] def has_sub_modules(self): return len(self.sub_modules) > 0
[docs] def add_submodule(self, module): """ Recursively add_submodule, if it's not registered, create it. """ if len(module) == 0: return else: sub_module = self.exist_submodule(module[0]) if type(sub_module) == int: self.sub_modules[sub_module].add_submodule(module[1:]) else: self.sub_modules.append(DajaxiceModule(module))
[docs] def exist_submodule(self, name): """ Check if submodule name was already registered. """ for module in self.sub_modules: if module.name == name: return self.sub_modules.index(module) return False
[docs]class Dajaxice(object): def __init__(self): self._registry = [] self._callable = [] for function in getattr(settings, 'DAJAXICE_FUNCTIONS', ()): function = function.rsplit('.',1) self.register_function(function[0],function[1])
[docs] def register(self, function): self.register_function(function.__module__, function.__name__)
[docs] def register_function(self, module, name): """ Register function at 'module' depth """ #Create the dajaxice function. function = DajaxiceFunction(name=name, path=module) #Check for already registered functions. full_path = '%s.%s' % (module, name) if full_path in self._callable: log.warning('%s already registered as dajaxice function.' % full_path) return self._callable.append(full_path) #Dajaxice path without ajax. module_without_ajax = module.replace('.ajax','').split('.') #Register module if necessary. exist_module = self._exist_module(module_without_ajax[0]) if type(exist_module) == int: self._registry[exist_module].add_submodule(module_without_ajax[1:]) else: self._registry.append(DajaxiceModule(module_without_ajax)) #Register Function module = self.get_module(module_without_ajax) if module: module.add_function(function)
[docs] def get_module(self, module): """ Recursively get module from registry """ for dajaxice_module in self._registry: if dajaxice_module.name == module[0]: return dajaxice_module.get_module(module[1:]) return None
[docs] def is_callable(self, name): return name in self._callable
def _exist_module(self,module_name): for module in self._registry: if module.name == module_name: return self._registry.index(module) return False
[docs] def get_functions(self): return self._registry
LOADING_DAJAXICE = False def dajaxice_autodiscover(): """ Auto-discover INSTALLED_APPS ajax.py modules and fail silently when not present. NOTE: dajaxice_autodiscover was inspired/copied from django.contrib.admin autodiscover """ global LOADING_DAJAXICE if LOADING_DAJAXICE: return LOADING_DAJAXICE = True import imp from django.conf import settings for app in settings.INSTALLED_APPS: try: app_path = import_module(app).__path__ except AttributeError: continue try: imp.find_module('ajax', app_path) except ImportError: continue import_module("%s.ajax" % app) LOADING_DAJAXICE = False