from django.template import Library
from urllib import pathname2url
from thread import allocate_lock
register = Library()

@register.filter
def template_exists(templ):
    if templ is None: return False
    try:
        template_loader.get_template(templ)
    except TemplateDoesNotExist:
        return False
    return True

_cache_lock = allocate_lock()
_cache = {}


@register.simple_tag
def app_media_prefix(appname):
    """
    Returns the string contained in the setting <app>_MEDIA_PREFIX
    with a back off to 'MEDIA_URL/app/'

    If the settings var in question is None then it will back off to file://
    """
    appname = appname.lower()
    if appname in _cache:
        return _cache[appname]

    import os
    try:
        from django.conf import settings
    except ImportError:
        _cache_lock.acquire()
        _cache[appname] = ''
        _cache_lock.release()
        return ''
    #try:
    #    app = __import__(appname, '', '', [''])
    #except:
    #    _cache[appname] = ''
    #    return ''
    varname = appname.upper() + "_MEDIA_PREFIX"
    if not hasattr(settings, varname):
        if not hasattr(settings, 'MEDIA_URL'):
            _cache_lock.acquire()
            _cache[appname] = ''
            _cache_lock.release()
        else:
            if settings.MEDIA_URL == None:
                media_dir = os.path.join(os.path.dirname(app.__file__), 'media')
                if not os.path.isdir(media_dir):
                    _cache_lock.acquire()
                    _cache[appname] = ''
                    _cache_lock.release()
                    return ''
                _cache_lock.acquire()
                _cache[appname] = pathname2url(media_dir)
                _cache_lock.release()
            else:
                _cache_lock.acquire()
                _cache[appname] = settings.MEDIA_URL + appname + '/'
                _cache_lock.release()
    else:
        override = getattr(settings, varname)
        if override == None:
            override = pathname2url(media_dir)
        _cache_lock.acquire()
        _cache[appname] = override
        _cache_lock.release()
    return _cache[appname]
