diff --git a/avatar/models.py b/avatar/models.py index c428d5c..da97e49 100644 --- a/avatar/models.py +++ b/avatar/models.py @@ -21,8 +21,7 @@ except ImportError: from avatar import AVATAR_STORAGE_DIR, AVATAR_RESIZE_METHOD, \ AVATAR_MAX_AVATARS_PER_USER, AVATAR_THUMB_FORMAT, \ - AVATAR_HASH_USERDIRNAMES, AVATAR_HASH_FILENAMES, \ - AVATAR_DEFAULT_URL + AVATAR_HASH_USERDIRNAMES, AVATAR_HASH_FILENAMES def avatar_file_path(instance=None, filename=None, size=None, ext=None): tmppath = [AVATAR_STORAGE_DIR] @@ -59,25 +58,6 @@ def find_extension(format): format = 'jpg' return format - -def get_primary_avatar(user, size=80): - if not isinstance(user, User): - try: - user = User.objects.get(username=user) - except User.DoesNotExist: - return AVATAR_DEFAULT_URL - avatars = user.avatar_set.order_by('-date_uploaded') - primary = avatars.filter(primary=True) - if primary.count() > 0: - avatar = primary[0] - elif avatars.count() > 0: - avatar = avatars[0] - else: - avatar = None - if avatar: - if not avatar.thumbnail_exists(size): - avatar.create_thumbnail(size) - return avatar class Avatar(models.Model): user = models.ForeignKey(User) diff --git a/avatar/templatetags/avatar_tags.py b/avatar/templatetags/avatar_tags.py index b0928be..e97a490 100644 --- a/avatar/templatetags/avatar_tags.py +++ b/avatar/templatetags/avatar_tags.py @@ -7,8 +7,8 @@ from django.utils.hashcompat import md5_constructor from django.core.urlresolvers import reverse from avatar.models import get_primary_avatar -from avatar import AVATAR_DEFAULT_URL, AVATAR_GRAVATAR_BACKUP -from avatar import AVATAR_GRAVATAR_DEFAULT +from avatar import AVATAR_GRAVATAR_BACKUP, AVATAR_GRAVATAR_DEFAULT +from avatar.util import get_default_avatar_url register = template.Library() @@ -25,7 +25,7 @@ def avatar_url(user, size=80): md5_constructor(user.email).hexdigest(), urllib.urlencode(params)) else: - return AVATAR_DEFAULT_URL + return get_default_avatar_url() register.simple_tag(avatar_url) def avatar(user, size=80): @@ -35,7 +35,7 @@ def avatar(user, size=80): alt = unicode(user) url = avatar_url(user, size) except User.DoesNotExist: - url = AVATAR_DEFAULT_URL + url = get_default_avatar_url() alt = _("Default Avatar") else: alt = unicode(user) diff --git a/avatar/tests.py b/avatar/tests.py index 649bacd..249c784 100644 --- a/avatar/tests.py +++ b/avatar/tests.py @@ -3,6 +3,8 @@ from django.test import TestCase from django.test.client import Client from django.contrib.auth.models import User from django.core.urlresolvers import reverse +from django.conf import settings +from avatar import AVATAR_DEFAULT_URL try: from PIL import Image @@ -65,6 +67,18 @@ class AvatarUploadTests(TestCase): f.close() self.failUnlessEqual(response.status_code, 200) self.failIfEqual(response.context['upload_avatar_form'].errors, {}) + + def testDefaultUrl(self): + response = self.client.get(reverse('avatar_render_primary', kwargs={ + 'user': self.user.username, + 'size': 80, + })) + loc = response['Location'] + base_url = getattr(settings, 'STATIC_URL', None) + if not base_url: + base_url = settings.MEDIA_URL + self.assertTrue(base_url in loc) + self.assertTrue(loc.endswith(AVATAR_DEFAULT_URL)) # def testTooManyAvatars # def testReplaceAvatarWhenMaxIsOne diff --git a/avatar/util.py b/avatar/util.py new file mode 100644 index 0000000..528e8af --- /dev/null +++ b/avatar/util.py @@ -0,0 +1,37 @@ +from django.conf import settings + +from django.contrib.auth.models import User + +from avatar import AVATAR_DEFAULT_URL + +def get_default_avatar_url(): + base_url = getattr(settings, 'STATIC_URL', None) + if not base_url: + base_url = getattr(settings, 'MEDIA_URL', '') + # We'll be nice and make sure there are no duplicated forward slashes + ends = base_url.endswith('/') + begins = AVATAR_DEFAULT_URL.startswith('/') + if ends and begins: + base_url = base_url[:-1] + elif not ends and not begins: + return '%s/%s' % (base_url, AVATAR_DEFAULT_URL) + return '%s%s' % (base_url, AVATAR_DEFAULT_URL) + +def get_primary_avatar(user, size=80): + if not isinstance(user, User): + try: + user = User.objects.get(username=user) + except User.DoesNotExist: + return get_default_avatar_url() + avatars = user.avatar_set.order_by('-date_uploaded') + primary = avatars.filter(primary=True) + if primary.count() > 0: + avatar = primary[0] + elif avatars.count() > 0: + avatar = avatars[0] + else: + avatar = None + if avatar: + if not avatar.thumbnail_exists(size): + avatar.create_thumbnail(size) + return avatar \ No newline at end of file diff --git a/avatar/views.py b/avatar/views.py index f0a894d..293ea73 100644 --- a/avatar/views.py +++ b/avatar/views.py @@ -10,7 +10,8 @@ from django.db.models import get_app from django.core.exceptions import ImproperlyConfigured from django.conf import settings -from avatar import AVATAR_MAX_AVATARS_PER_USER, AVATAR_DEFAULT_URL +from avatar import AVATAR_MAX_AVATARS_PER_USER +from avatar.util import get_default_avatar_url try: notification = get_app('notification') @@ -175,5 +176,6 @@ def render_primary(request, extra_context={}, user=None, size=80, *args, **kwarg # the CDN store those files instead return HttpResponseRedirect(avatar.avatar_url(size)) else: - return HttpResponseRedirect(AVATAR_DEFAULT_URL) + url = get_default_avatar_url() + return HttpResponseRedirect(url) diff --git a/tests/settings.py b/tests/settings.py index 73ca330..20e95b2 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -6,7 +6,9 @@ DATABASE_ENGINE = 'sqlite3' DATABASE_NAME = ':memory:' ROOT_URLCONF = 'settings' - + +STATIC_URL = '/site_media/static/' + SITE_ID = 1 INSTALLED_APPS = (