diff options
-rw-r--r-- | askbot/__init__.py | 7 | ||||
-rw-r--r-- | askbot/conf/settings_wrapper.py | 7 | ||||
-rw-r--r-- | askbot/conf/skin_general_settings.py | 3 | ||||
-rw-r--r-- | askbot/deps/livesettings/values.py | 14 | ||||
-rw-r--r-- | askbot/deps/livesettings/widgets.py | 15 | ||||
-rw-r--r-- | askbot/skins/default/templates/header.html | 2 | ||||
-rw-r--r-- | askbot/skins/utils.py | 6 | ||||
-rw-r--r-- | askbot/tests/__init__.py | 1 | ||||
-rwxr-xr-x | askbot/tests/images/logo.gif | bin | 0 -> 910 bytes | |||
-rw-r--r-- | askbot/tests/skin_tests.py | 73 | ||||
-rw-r--r-- | askbot/urls.py | 2 | ||||
-rw-r--r-- | askbot/utils/path.py | 11 | ||||
-rw-r--r-- | setup.py | 2 |
13 files changed, 132 insertions, 11 deletions
diff --git a/askbot/__init__.py b/askbot/__init__.py index 4550ba40..4095646b 100644 --- a/askbot/__init__.py +++ b/askbot/__init__.py @@ -1,3 +1,10 @@ """ :synopsis: the Django Q&A forum application """ +import os + +def get_install_directory(): + return os.path.dirname(__file__) + +def get_version(): + return '0.6.9' diff --git a/askbot/conf/settings_wrapper.py b/askbot/conf/settings_wrapper.py index 2dbf9b74..a567d007 100644 --- a/askbot/conf/settings_wrapper.py +++ b/askbot/conf/settings_wrapper.py @@ -21,6 +21,7 @@ at run time askbot.deps.livesettings is a module developed for satchmo project """ from askbot.deps.livesettings import SortedDotDict, config_register +from askbot.deps.livesettings.functions import config_get class ConfigSettings(object): """A very simple Singleton wrapper for settings @@ -29,6 +30,7 @@ class ConfigSettings(object): to different settings groups """ __instance = None + __group_map = {} def __init__(self): """assigns SortedDotDict to self.__instance if not set""" @@ -45,6 +47,10 @@ class ConfigSettings(object): """ return getattr(self.__instance, key).value + def update(self, key, value): + setting = config_get(self.__group_map[key], key) + setting.update(value) + def register(self, value): """registers the setting value must be a subclass of askbot.deps.livesettings.Value @@ -65,6 +71,7 @@ class ConfigSettings(object): raise Exception('setting %s is already registered' % key) else: self.__instance[key] = config_register(value) + self.__group_map[key] = group_key def as_dict(self): out = dict() diff --git a/askbot/conf/skin_general_settings.py b/askbot/conf/skin_general_settings.py index ed48ea3f..be605fd3 100644 --- a/askbot/conf/skin_general_settings.py +++ b/askbot/conf/skin_general_settings.py @@ -25,7 +25,8 @@ settings.register( ), upload_directory = django_settings.ASKBOT_FILE_UPLOAD_DIR, upload_url = '/' + django_settings.ASKBOT_UPLOADED_FILES_URL, - default = skin_utils.get_media_url('/images/logo.gif') + default = '/images/logo.gif', + url_resolver = skin_utils.get_media_url ) ) diff --git a/askbot/deps/livesettings/values.py b/askbot/deps/livesettings/values.py index 1150d652..bf3a47ba 100644 --- a/askbot/deps/livesettings/values.py +++ b/askbot/deps/livesettings/values.py @@ -568,16 +568,16 @@ class LongStringValue(Value): class ImageValue(StringValue): def __init__(self, *args, **kwargs): - self.upload_directory = kwargs['upload_directory'] - self.upload_url = kwargs['upload_url'] - del kwargs['upload_directory'] - del kwargs['upload_url'] + self.upload_directory = kwargs.pop('upload_directory') + self.upload_url = kwargs.pop('upload_url') + self.url_resolver = kwargs.pop('url_resolver', None) super(ImageValue, self).__init__(*args, **kwargs) class field(forms.FileField): def __init__(self, *args, **kwargs): kwargs['required'] = False - kwargs['widget'] = ImageInput + url_resolver = kwargs.pop('url_resolver') + kwargs['widget'] = ImageInput(url_resolver = url_resolver) forms.FileField.__init__(self, *args, **kwargs) def clean(self, file_data, file_name): @@ -588,6 +588,10 @@ class ImageValue(StringValue): % {'types': ', '.join(image_extensions)} raise forms.ValidationError(error_message) + def make_field(self, **kwargs): + kwargs['url_resolver'] = self.url_resolver + return super(StringValue, self).make_field(**kwargs) + def update(self, uploaded_file): """uploaded_file is an instance of django UploadedFile object diff --git a/askbot/deps/livesettings/widgets.py b/askbot/deps/livesettings/widgets.py index 36b78e19..6dc1b65a 100644 --- a/askbot/deps/livesettings/widgets.py +++ b/askbot/deps/livesettings/widgets.py @@ -3,10 +3,23 @@ from django.utils import safestring class ImageInput(forms.FileInput): + def __init__(self, *args, **kwargs): + """ImageInput.__init__ function takes + an optional parameter url_resolver + which must be a callable accepting one argument - the url + or url key + url_resolver must return a valid image url + + if not given or None, the resolver will be a dummy + fuction returning an unchanged value + """ + self.url_resolver = kwargs.pop('url_resolver', lambda val: val) + super(ImageInput, self).__init__(*args, **kwargs) + def render(self, name, value, attrs = None): output = '<img ' if attrs and 'image_class' in attrs: output += 'class="%s" ' % attrs['image_class'] - output += 'src="%s"/><br/>' % value + output += 'src="%s"/><br/>' % self.url_resolver(value) output += super(ImageInput, self).render(name, value, attrs) return safestring.mark_safe(output) diff --git a/askbot/skins/default/templates/header.html b/askbot/skins/default/templates/header.html index c1bf51f1..11ca38f8 100644 --- a/askbot/skins/default/templates/header.html +++ b/askbot/skins/default/templates/header.html @@ -37,7 +37,7 @@ <td id="logoContainer"> <div id="logo"> <a href="{% url questions %}?start_over=true"><img - src="{{settings.SITE_LOGO_URL}}" title="{% trans "back to home page" %}" alt="{{settings.APP_TITLE}} logo"/></a> + src="{% media settings.SITE_LOGO_URL %}" title="{% trans "back to home page" %}" alt="{{settings.APP_TITLE}} logo"/></a> </div> </td> <td id="navTabContainer" valign="bottom" align="left"> diff --git a/askbot/skins/utils.py b/askbot/skins/utils.py index 3a03e4e3..a492c87a 100644 --- a/askbot/skins/utils.py +++ b/askbot/skins/utils.py @@ -55,6 +55,8 @@ def get_media_url(url): if os.path.isfile(file_path): url_copy = os.path.normpath('///' + url_copy) return url_copy + else: + logging.critical('missing media resource %s' % url) #2) if it does not exist - look in skins @@ -84,7 +86,9 @@ def get_media_url(url): if os.path.isfile(file_path): use_skin = 'common' else: - logging.critical('could not find media for %s' % url) + log_message = 'missing media resource %s in skin %s' \ + % (url, use_skin) + logging.critical(log_message) use_skin = '' return None diff --git a/askbot/tests/__init__.py b/askbot/tests/__init__.py index 329a5271..cbdd92a8 100644 --- a/askbot/tests/__init__.py +++ b/askbot/tests/__init__.py @@ -3,3 +3,4 @@ from askbot.tests.on_screen_notification_tests import * from askbot.tests.page_load_tests import * from askbot.tests.permission_assertion_tests import * from askbot.tests.db_api_tests import * +from askbot.tests.skin_tests import * diff --git a/askbot/tests/images/logo.gif b/askbot/tests/images/logo.gif Binary files differnew file mode 100755 index 00000000..8540e12b --- /dev/null +++ b/askbot/tests/images/logo.gif diff --git a/askbot/tests/skin_tests.py b/askbot/tests/skin_tests.py new file mode 100644 index 00000000..978f45b1 --- /dev/null +++ b/askbot/tests/skin_tests.py @@ -0,0 +1,73 @@ +import os +import shutil +from django.test import TestCase +from django.core.files.uploadedfile import UploadedFile +from django.conf import settings as django_settings +from askbot.conf import settings as askbot_settings +from askbot.utils.path import mkdir_p +from askbot.skins import utils as skin_utils +import askbot + +class SkinTests(TestCase): + + def setUp(self): + #create dummy skin + skin_image_dir = os.path.join( + askbot.get_install_directory(), + 'skins', + 'test_skin', + 'media', + 'images' + ) + mkdir_p(skin_image_dir) + test_image_file = os.path.join( + askbot.get_install_directory(), + 'tests', + 'images', + 'logo.gif' + ) + shutil.copy(test_image_file, skin_image_dir) + + def tearDown(self): + #delete the dummy skin + test_skin_dir = os.path.join( + askbot.get_install_directory(), + 'skins', + 'test_skin' + ) + shutil.rmtree(test_skin_dir) + + def assert_default_logo_in_skin(self, skin_name): + url = skin_utils.get_media_url(askbot_settings.SITE_LOGO_URL) + self.assertTrue('/' + skin_name + '/' in url) + response = self.client.get(url) + self.assertTrue(response.status_code == 200) + + def test_default_skin_logo(self): + """make sure that default logo + is where it is expected + """ + self.assert_default_logo_in_skin('default') + + def test_switch_to_custom_skin_logo(self): + askbot_settings.update('ASKBOT_DEFAULT_SKIN', 'test_skin') + self.assert_default_logo_in_skin('test_skin') + + def test_uploaded_logo(self): + logo_src = os.path.join( + askbot.get_install_directory(), + 'tests', + 'images', + 'logo.gif' + ) + logo_file = open(logo_src, 'r') + new_logo = UploadedFile(file = logo_file) + askbot_settings.update('SITE_LOGO_URL', new_logo) + logo_url = askbot_settings.SITE_LOGO_URL + self.assertTrue( + logo_url.startswith( + '/' + django_settings.ASKBOT_UPLOADED_FILES_URL + ) + ) + response = self.client.get(logo_url) + self.assertTrue(response.status_code == 200) diff --git a/askbot/urls.py b/askbot/urls.py index 3448478f..52a4e647 100644 --- a/askbot/urls.py +++ b/askbot/urls.py @@ -204,6 +204,6 @@ urlpatterns = patterns('', r'^doc/(?P<path>.*)$', 'django.views.static.serve', {'document_root': os.path.join(APP_PATH,'doc','build','html').replace('\\','/')}, - name='askbot_media', + name='askbot_docs', ), ) diff --git a/askbot/utils/path.py b/askbot/utils/path.py new file mode 100644 index 00000000..b63c75b5 --- /dev/null +++ b/askbot/utils/path.py @@ -0,0 +1,11 @@ +import os +import errno + +def mkdir_p(path): + try: + os.makedirs(path) + except OSError, e: + if e.errno == errno.EEXIST: + pass + else: + raise e @@ -20,7 +20,7 @@ if sys.platform not in WIN_PLATFORMS: setup( name = "askbot", - version = "0.6.7", + version = "0.6.8", description = 'Question and Answer forum, like StackOverflow, written in python and Django', packages = find_packages(), author = 'Evgeny.Fadeev', |