summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-08-19 00:09:59 -0400
committerEvgeny Fadeev <evgeny.fadeev@gmail.com>2010-08-19 00:09:59 -0400
commite1c71ab9e2a26bb80bb9fe19c83f30f582b85140 (patch)
tree56300841910f9f59af813b40133c84dc58b20b01
parent2f5d76ccf197c2db5b2468b3e7c290de2c34f3d5 (diff)
downloadaskbot-e1c71ab9e2a26bb80bb9fe19c83f30f582b85140.tar.gz
askbot-e1c71ab9e2a26bb80bb9fe19c83f30f582b85140.tar.bz2
askbot-e1c71ab9e2a26bb80bb9fe19c83f30f582b85140.zip
made uploaded logo persist across change of selected skin
-rw-r--r--askbot/__init__.py7
-rw-r--r--askbot/conf/settings_wrapper.py7
-rw-r--r--askbot/conf/skin_general_settings.py3
-rw-r--r--askbot/deps/livesettings/values.py14
-rw-r--r--askbot/deps/livesettings/widgets.py15
-rw-r--r--askbot/skins/default/templates/header.html2
-rw-r--r--askbot/skins/utils.py6
-rw-r--r--askbot/tests/__init__.py1
-rwxr-xr-xaskbot/tests/images/logo.gifbin0 -> 910 bytes
-rw-r--r--askbot/tests/skin_tests.py73
-rw-r--r--askbot/urls.py2
-rw-r--r--askbot/utils/path.py11
-rw-r--r--setup.py2
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
new file mode 100755
index 00000000..8540e12b
--- /dev/null
+++ b/askbot/tests/images/logo.gif
Binary files differ
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
diff --git a/setup.py b/setup.py
index 144acfe2..326ba971 100644
--- a/setup.py
+++ b/setup.py
@@ -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',