Merge branch 'master' of git://github.com/DrMeers/django-avatar into DrMeers-master

Conflicts:
	avatar/models.py
This commit is contained in:
Jannis Leidel 2013-05-27 10:13:16 +02:00
commit b8844d8cd9
13 changed files with 63 additions and 36 deletions

View file

@ -3,12 +3,12 @@ from django.utils.translation import ugettext_lazy as _
from avatar.models import Avatar
from avatar.templatetags.avatar_tags import avatar
from avatar.util import User
class AvatarAdmin(admin.ModelAdmin):
list_display = ('get_avatar', 'user', 'primary', "date_uploaded")
list_filter = ('primary',)
search_fields = ('user__username',)
search_fields = ('user__%s' % getattr(User, 'USERNAME_FIELD', 'username'),)
list_per_page = 50
def get_avatar(self, avatar_in):

View file

@ -9,7 +9,7 @@ from django.utils.translation import ugettext as _
from django.utils.encoding import smart_str
from django.db.models import signals
from django.contrib.auth.models import User
from avatar.util import User, get_username
try:
from cStringIO import StringIO
@ -40,10 +40,10 @@ avatar_storage = get_storage_class(AVATAR_STORAGE)()
def avatar_file_path(instance=None, filename=None, size=None, ext=None):
tmppath = [AVATAR_STORAGE_DIR]
if AVATAR_HASH_USERDIRNAMES:
tmp = hashlib.md5(instance.user.username).hexdigest()
tmppath.extend([tmp[0], tmp[1], instance.user.username])
tmp = hashlib.md5(get_username(instance.user)).hexdigest()
tmppath.extend([tmp[0], tmp[1], get_username(instance.user)])
else:
tmppath.append(instance.user.username)
tmppath.append(get_username(instance.user))
if not filename:
# Filename already stored in database
filename = instance.avatar.name

View file

@ -1,5 +1,6 @@
{% extends "avatar/base.html" %}
{% load i18n avatar_tags %}
{% load url from future %}
{% block content %}
<p>{% trans "Your current avatar: " %}</p>
@ -7,7 +8,7 @@
{% if not avatars %}
<p>{% trans "You haven't uploaded an avatar yet. Please upload one now." %}</p>
{% endif %}
<form enctype="multipart/form-data" method="POST" action="{% url avatar_add %}">
<form enctype="multipart/form-data" method="POST" action="{% url 'avatar_add' %}">
{{ upload_avatar_form.as_p }}
<p>{% csrf_token %}<input type="submit" value="{% trans "Upload New Image" %}" /></p>
</form>

View file

@ -1,5 +1,6 @@
{% extends "avatar/base.html" %}
{% load i18n avatar_tags %}
{% load url from future %}
{% block content %}
<p>{% trans "Your current avatar: " %}</p>
@ -7,14 +8,14 @@
{% if not avatars %}
<p>{% trans "You haven't uploaded an avatar yet. Please upload one now." %}</p>
{% else %}
<form method="POST" action="{% url avatar_change %}">
<form method="POST" action="{% url 'avatar_change' %}">
<ul>
{{ primary_avatar_form.as_ul }}
</ul>
<p>{% csrf_token %}<input type="submit" value="{% trans "Choose new Default" %}" /></p>
</form>
{% endif %}
<form enctype="multipart/form-data" method="POST" action="{% url avatar_add %}">
<form enctype="multipart/form-data" method="POST" action="{% url 'avatar_add' %}">
{{ upload_avatar_form.as_p }}
<p>{% csrf_token %}<input type="submit" value="{% trans "Upload New Image" %}" /></p>
</form>

View file

@ -1,13 +1,14 @@
{% extends "avatar/base.html" %}
{% load i18n %}
{% load url from future %}
{% block content %}
<p>{% trans "Please select the avatars that you would like to delete." %}</p>
{% if not avatars %}
{% url avatar_change as avatar_change_url %}
{% url 'avatar_change' as avatar_change_url %}
<p>{% blocktrans %}You have no avatars to delete. Please <a href="{{ avatar_change_url }}">upload one</a> now.{% endblocktrans %}</p>
{% else %}
<form method="POST" action="{% url avatar_delete %}">
<form method="POST" action="{% url 'avatar_delete' %}">
<ul>
{{ delete_avatar_form.as_ul }}
</ul>

View file

@ -1,2 +1,2 @@
{% load i18n %}{% url profile_detail username=user.username as user_url %}
{% blocktrans with user as avatar_creator and avatar.get_absolute_url as avatar_url %}<a href="{{ user_url }}">{{ avatar_creator }}</a> has updated their avatar <a href="{{ avatar_url }}">{{ avatar }}</a>.{% endblocktrans %}
{% load i18n %}{% load url from future %}{% url 'profile_detail' username=user.username as user_url %}{# TODO: support custom user models via get_username; actually, is this template even used anymore? #}
{% blocktrans with user as avatar_creator and avatar.get_absolute_url as avatar_url %}<a href="{{ user_url }}">{{ avatar_creator }}</a> has updated their avatar <a href="{{ avatar_url }}">{{ avatar }}</a>.{% endblocktrans %}

View file

@ -7,11 +7,10 @@ from django.template.loader import render_to_string
from django.utils.translation import ugettext as _
from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
from avatar.settings import (AVATAR_GRAVATAR_BACKUP, AVATAR_GRAVATAR_DEFAULT,
AVATAR_DEFAULT_SIZE, AVATAR_GRAVATAR_BASE_URL)
from avatar.util import get_primary_avatar, get_default_avatar_url, cache_result
from avatar.util import (
get_primary_avatar, get_default_avatar_url, cache_result, User, get_user)
from avatar.models import Avatar
register = template.Library()
@ -40,7 +39,7 @@ def avatar_url(user, size=AVATAR_DEFAULT_SIZE):
def avatar(user, size=AVATAR_DEFAULT_SIZE, **kwargs):
if not isinstance(user, User):
try:
user = User.objects.get(username=user)
user = get_user(user)
alt = unicode(user)
url = avatar_url(user, size)
except User.DoesNotExist:

View file

@ -4,10 +4,8 @@ from django.test import TestCase
from django.core.urlresolvers import reverse
from django.conf import settings
from django.contrib.auth.models import User
from avatar.settings import AVATAR_DEFAULT_URL, AVATAR_MAX_AVATARS_PER_USER
from avatar.util import get_primary_avatar
from avatar.util import get_primary_avatar, User
from avatar.models import Avatar
try:

View file

@ -7,6 +7,6 @@ urlpatterns = patterns(
url(r'^change/$', 'change', name='avatar_change'),
url(r'^delete/$', 'delete', name='avatar_delete'),
url(r'^render_primary/(?P<user>[\w\d\.\-_]{3,30})/(?P<size>[\d]+)/$', 'render_primary', name='avatar_render_primary'),
url(r'^list/(?P<username>[\+\w]+)/$', 'avatar_gallery', name='avatar_gallery'),
url(r'^list/(?P<username>[\+\w]+)/(?P<id>[\d]+)/$', 'avatar', name='avatar'),
url(r'^list/(?P<username>[\+\w\@\.]+)/$', 'avatar_gallery', name='avatar_gallery'),
url(r'^list/(?P<username>[\+\w\@\.]+)/(?P<id>[\d]+)/$', 'avatar', name='avatar'),
)

View file

@ -5,20 +5,41 @@ from django.core.cache import cache
from django.utils.encoding import smart_str
from django.template.defaultfilters import slugify
from django.contrib.auth.models import User
try:
from django.contrib.auth import get_user_model
except ImportError:
from django.contrib.auth.models import User
custom_user_model = False
else:
User = get_user_model()
custom_user_model = True
from avatar.settings import (AVATAR_DEFAULT_URL, AVATAR_CACHE_TIMEOUT,
AUTO_GENERATE_AVATAR_SIZES, AVATAR_DEFAULT_SIZE)
cached_funcs = set()
def get_username(user):
""" Return username of a User instance """
if hasattr(user, 'get_username'):
return user.get_username()
else:
return user.username
def get_user(username):
""" Return user from a username/ish identifier """
if custom_user_model:
return User.objects.get_by_natural_key(username)
else:
return User.objects.get(username=username)
def get_cache_key(user_or_username, size, prefix):
"""
Returns a cache key consisten of a username and image size.
"""
if isinstance(user_or_username, User):
user_or_username = user_or_username.username
user_or_username = get_username(user_or_username)
key = u'%s_%s_%s' % (prefix, user_or_username, size)
return u'%s_%s' % (slugify(key)[:100],
hashlib.md5(smart_str(key)).hexdigest())
@ -70,7 +91,7 @@ def get_default_avatar_url():
def get_primary_avatar(user, size=AVATAR_DEFAULT_SIZE):
if not isinstance(user, User):
try:
user = User.objects.get(username=user)
user = get_user(user)
except User.DoesNotExist:
return None
try:

View file

@ -7,13 +7,13 @@ from django.views.decorators.csrf import csrf_exempt
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from avatar.forms import PrimaryAvatarForm, DeleteAvatarForm, UploadAvatarForm
from avatar.models import Avatar
from avatar.settings import AVATAR_MAX_AVATARS_PER_USER, AVATAR_DEFAULT_SIZE
from avatar.signals import avatar_updated
from avatar.util import get_primary_avatar, get_default_avatar_url
from avatar.util import (
get_primary_avatar, get_default_avatar_url, User, get_user)
def _get_next(request):
@ -173,7 +173,10 @@ def delete(request, extra_context=None, next_override=None, *args, **kwargs):
def avatar_gallery(request, username, template_name="avatar/gallery.html"):
user = get_object_or_404(User, username=username)
try:
user = get_user(username)
except User.DoesNotExist:
raise Http404
return render_to_response(template_name, {
"other_user": user,
"avatars": user.avatar_set.all(),
@ -181,7 +184,10 @@ def avatar_gallery(request, username, template_name="avatar/gallery.html"):
def avatar(request, username, id, template_name="avatar/avatar.html"):
user = get_object_or_404(User, username=username)
try:
user = get_user(username)
except User.DoesNotExist:
raise Http404
avatars = user.avatar_set.order_by("-date_uploaded")
index = None
avatar = None

View file

@ -28,7 +28,7 @@ that are required. A minimal integration can work like this:
3. Somewhere in your template navigation scheme, link to the change avatar
page::
<a href="{% url avatar_change %}">Change your avatar</a>
<a href="{% url 'avatar_change' %}">Change your avatar</a>
4. Wherever you want to display an avatar for a user, first load the avatar
template tags::
@ -135,4 +135,4 @@ Management Commands
This application does include one management command: ``rebuild_avatars``. It
takes no arguments and, when run, re-renders all of the thumbnails for all of
the avatars for the pixel sizes specified in the ``AUTO_GENERATE_AVATAR_SIZES``
setting.
setting.

View file

@ -33,7 +33,7 @@ that are required. A minimal integration can work like this:
3. Somewhere in your template navigation scheme, link to the change avatar
page::
<a href="{% url avatar_change %}">Change your avatar</a>
<a href="{% url 'avatar_change' %}">Change your avatar</a>
4. Wherever you want to display an avatar for a user, first load the avatar
template tags::
@ -92,12 +92,12 @@ template rendering system:
``{% avatar_url user [size in pixels] %}``
Renders the URL of the avatar for the given user. User can be either a
``django.contrib.auth.models.User`` object instance or a username.
``django.contrib.auth.get_user_model()`` object instance or a username.
``{% avatar user [size in pixels] %}``
Renders an HTML ``img`` tag for the given user for the specified size. User
can be either a ``django.contrib.auth.models.User`` object instance or a
username.
Renders an HTML ``img`` tag for the given user for the specified size. User
can be either a ``django.contrib.auth.get_user_model()`` object instance
or a username.
``{% render_avatar avatar [size in pixels] %}``
Given an actual ``avatar.models.Avatar`` object instance, renders an HTML