Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Cleanup, reorganization, moved the default avatar url to conform to c…
…ommunity standards, and added a test to ensure that it's correct.
  • Loading branch information
ericflo committed Feb 22, 2010
1 parent 67361f3 commit 5648cb9
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 28 deletions.
22 changes: 1 addition & 21 deletions avatar/models.py
Expand Up @@ -21,8 +21,7 @@

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]
Expand Down Expand Up @@ -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)
Expand Down
8 changes: 4 additions & 4 deletions avatar/templatetags/avatar_tags.py
Expand Up @@ -7,8 +7,8 @@
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()

Expand All @@ -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):
Expand All @@ -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)
Expand Down
14 changes: 14 additions & 0 deletions avatar/tests.py
Expand Up @@ -3,6 +3,8 @@
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
Expand Down Expand Up @@ -65,6 +67,18 @@ def testImageTooBig(self):
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
Expand Down
37 changes: 37 additions & 0 deletions 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
6 changes: 4 additions & 2 deletions avatar/views.py
Expand Up @@ -10,7 +10,8 @@
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')
Expand Down Expand Up @@ -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)

4 changes: 3 additions & 1 deletion tests/settings.py
Expand Up @@ -6,7 +6,9 @@
DATABASE_NAME = ':memory:'

ROOT_URLCONF = 'settings'


STATIC_URL = '/site_media/static/'

SITE_ID = 1

INSTALLED_APPS = (
Expand Down

0 comments on commit 5648cb9

Please sign in to comment.