Cleanup, reorganization, moved the default avatar url to conform to community standards, and added a test to ensure that it's correct.

This commit is contained in:
Eric Florenzano 2010-02-22 18:48:22 -05:00
parent 67361f3933
commit 5648cb9f11
6 changed files with 63 additions and 28 deletions

View file

@ -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)

View file

@ -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)

View file

@ -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

37
avatar/util.py Normal file
View file

@ -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

View file

@ -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)

View file

@ -6,7 +6,9 @@ DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = ':memory:'
ROOT_URLCONF = 'settings'
STATIC_URL = '/site_media/static/'
SITE_ID = 1
INSTALLED_APPS = (