]> git.openstreetmap.org Git - osqa.git/blob - forum/skins/__init__.py
Some fixes in custom pages logic.
[osqa.git] / forum / skins / __init__.py
1 from django.conf import settings
2 from django.template import loader
3 from django.template.loaders import filesystem 
4 from django.http import HttpResponse
5 import os.path
6 import logging
7
8 #module for skinning osqa
9 #at this point skin can be changed only in settings file
10 #via OSQA_DEFAULT_SKIN variable
11
12 #note - Django template loaders use method django.utils._os.safe_join
13 #to work on unicode file paths
14 #here it is ignored because it is assumed that we won't use unicode paths
15
16 def load_template_source(name, dirs=None):
17     try:
18         tname = os.path.join(settings.OSQA_DEFAULT_SKIN,'templates',name)
19         return filesystem.load_template_source(tname,dirs)
20     except:
21         tname = os.path.join('default','templates',name)
22         return filesystem.load_template_source(tname,dirs)
23 load_template_source.is_usable = True
24
25 def find_media_source(url):
26     """returns url prefixed with the skin name
27     of the first skin that contains the file 
28     directories are searched in this order:
29     settings.OSQA_DEFAULT_SKIN, then 'default', then 'commmon'
30     if file is not found - returns None
31     and logs an error message
32     """
33     while url[0] == '/': url = url[1:]
34     d = os.path.dirname
35     n = os.path.normpath
36     j = os.path.join
37     f = os.path.isfile
38     skins = n(j(d(d(__file__)),'skins'))
39     try:
40         media = os.path.join(skins, settings.OSQA_DEFAULT_SKIN, url)
41         assert(f(media))
42         use_skin = settings.OSQA_DEFAULT_SKIN
43     except:
44         try:
45             media = j(skins, 'default', url)
46             assert(f(media))
47             use_skin = 'default'
48         except:
49             media = j(skins, 'common', url)
50             try:
51                 assert(f(media))
52                 use_skin = 'common'
53             except:
54                 logging.error('could not find media for %s' % url)
55                 use_skin = ''
56                 return None
57     return use_skin + '/' + url