mirror of
https://github.com/jazzband/django-avatar.git
synced 2026-03-16 22:20:30 +00:00
Merge branch 'master' of git://github.com/DrMeers/django-avatar into DrMeers-master
Conflicts: avatar/models.py
This commit is contained in:
commit
b8844d8cd9
13 changed files with 63 additions and 36 deletions
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 %}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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'),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
10
setup.py
10
setup.py
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue