Просмотр исходного кода

#131: Fallback for dynamic avatar if gravatar 404s

Rafał Pitoń 11 лет назад
Родитель
Сommit
14b6bd59b4
3 измененных файлов с 31 добавлено и 7 удалено
  1. 19 4
      misago/users/avatars/gravatar.py
  2. 1 0
      misago/users/views/admin/users.py
  3. 11 3
      misago/users/views/usercp.py

+ 19 - 4
misago/users/avatars/gravatar.py

@@ -8,11 +8,26 @@ from misago.conf import settings
 from misago.users.avatars import cache
 
 
-GRAVATAR_URL = 'http://www.gravatar.com/avatar/%s?s=%s'
+GRAVATAR_URL = 'http://www.gravatar.com/avatar/%s?s=%s&d=404'
+
+
+class GravatarError(RuntimeError):
+    pass
+
+
+class NoGravatarAvailable(RuntimeError):
+    pass
 
 
 def set_avatar(user):
     url_formats = (user.email_hash, max(settings.MISAGO_AVATARS_SIZES))
-    r = requests.get(GRAVATAR_URL % url_formats)
-    image = Image.open(StringIO(r.content))
-    cache.store_new_avatar(user, image)
+    try:
+        r = requests.get(GRAVATAR_URL % url_formats, timeout=5)
+        if r.status_code != 200:
+            raise NoGravatarAvailable(
+                'gravatar is not available for this e-mail')
+
+        image = Image.open(StringIO(r.content))
+        cache.store_new_avatar(user, image)
+    except requests.exceptions.RequestException:
+        raise GravatarError('failed to connect to gravatar servers')

+ 1 - 0
misago/users/views/admin/users.py

@@ -135,6 +135,7 @@ class EditUser(UserAdmin, generic.ModelFormView):
 
         if form.cleaned_data.get('email'):
             target.set_email(form.cleaned_data['email'])
+            start_admin_session(request, target)
 
         if form.cleaned_data.get('staff_level'):
             form.instance.staff_level = form.cleaned_data['staff_level']

+ 11 - 3
misago/users/views/usercp.py

@@ -58,9 +58,17 @@ def change_avatar(request):
 
     if request.method == 'POST':
         if 'download-gravatar' in request.POST:
-            avatars.gravatar.set_avatar(request.user)
-            message = _("Gravatar was downloaded and set as new avatar.")
-            messages.success(request, message)
+            try:
+                avatars.gravatar.set_avatar(request.user)
+                message = _("Gravatar was downloaded and set as new avatar.")
+                messages.success(request, message)
+            except avatars.gravatar.GravatarError:
+                message = _("Failed to connect to Gravatar servers.")
+                messages.info(request, message)
+            except avatars.gravatar.NoGravatarAvailable:
+                message = _("No Gravatar is associated "
+                            "with your e-mail address.")
+                messages.info(request, message)
         elif 'set-dynamic' in request.POST:
             avatars.dynamic.set_avatar(request.user)
             message = _("New avatar based on your account was set.")