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

fix #688: reports of avatarserver's death have been greatly exaggerated

Rafał Pitoń 8 лет назад
Родитель
Сommit
5dc5fa5b7c

+ 5 - 1
misago/core/tests/test_mailer.py

@@ -18,7 +18,11 @@ class MisagoMailerTests(TestCase):
 
         # assert that url to user's avatar is valid
         html_body = mail.outbox[0].alternatives[0][0]
-        user_avatar_url = 'http://testserver%s' % user.avatars[0]['url']
+        user_avatar_url = reverse('misago:user-avatar', kwargs={
+            'pk': user.pk,
+            'size': 32
+        })
+
         self.assertIn(user_avatar_url, html_body)
 
     def test_mail_users(self):

+ 1 - 2
misago/templates/misago/emails/base.html

@@ -1,4 +1,3 @@
-{% load misago_avatars %}
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 <html lang="{{ LANGUAGE_CODE }}">
 <head>
@@ -56,7 +55,7 @@
               <table border="0" width="100%" height="100%" cellpadding="0" cellspacing="0">
                 <tr>
                   <td valign="middle" style="font-size: 28px; line-height: 24px; color: #555555;">{{ misago_settings.forum_name }}</td>
-                  <td align="center" valign="middle" width="30"><img src="{{ SITE_ADDRESS }}{{ recipient|avatar:32 }}" width="32" height="32" style="border-radius: 3px;" alt=""></td>
+                  <td align="center" valign="middle" width="30"><img src="{{ SITE_ADDRESS }}{% url 'misago:user-avatar' pk=recipient.pk size=32 %}" width="32" height="32" style="border-radius: 3px;" alt=""></td>
                 </tr>
               </table>
             <br>

+ 69 - 0
misago/users/tests/test_avatarserver_views.py

@@ -0,0 +1,69 @@
+from django.conf import settings
+from django.contrib.auth import get_user_model
+from django.test import TestCase
+from django.urls import reverse
+
+
+class AvatarServerTests(TestCase):
+    def setUp(self):
+        User = get_user_model()
+        self.user = User.objects.create_user('Bob', 'bob@bob.com', 'Pass123')
+
+        self.user.avatars = [
+            {
+                'size': 200,
+                'url': '/media/avatars/avatar-200.png'
+            },
+            {
+                'size': 100,
+                'url': '/media/avatars/avatar-100.png'
+            },
+            {
+                'size': 50,
+                'url': '/media/avatars/avatar-50.png'
+            },
+        ]
+
+        self.user.save()
+
+    def test_get_user_avatar_exact_size(self):
+        """avatar server resolved valid avatar url for user"""
+        avatar_url = reverse('misago:user-avatar', kwargs={
+            'pk': self.user.pk,
+            'size': 100,
+        })
+
+        response = self.client.get(avatar_url)
+
+        self.assertEqual(response.status_code, 302)
+        self.assertEqual(response['location'],  self.user.avatars[1]['url'])
+
+    def test_get_user_avatar_inexact_size(self):
+        """avatar server resolved valid avatar fallback for user"""
+        avatar_url = reverse('misago:user-avatar', kwargs={
+            'pk': self.user.pk,
+            'size': 150,
+        })
+
+        response = self.client.get(avatar_url)
+
+        self.assertEqual(response.status_code, 302)
+        self.assertEqual(response['location'],  self.user.avatars[0]['url'])
+
+    def test_get_notfound_user_avatar(self):
+        """avatar server handles deleted user avatar requests"""
+        avatar_url = reverse('misago:user-avatar', kwargs={
+            'pk': self.user.pk + 1,
+            'size': 150,
+        })
+        response = self.client.get(avatar_url)
+
+        self.assertEqual(response.status_code, 302)
+        self.assertTrue(response['location'].endswith(settings.MISAGO_BLANK_AVATAR))
+
+    def test_blank_avatar_serving(self):
+        """avatar server handles blank avatar requests"""
+        response = self.client.get(reverse('misago:blank-avatar'))
+
+        self.assertEqual(response.status_code, 302)
+        self.assertTrue(response['location'].endswith(settings.MISAGO_BLANK_AVATAR))

+ 7 - 1
misago/users/urls/__init__.py

@@ -2,7 +2,7 @@ from django.conf.urls import include, url
 
 from misago.core.views import home_redirect
 
-from ..views import activation, auth, forgottenpassword, lists, options, profile
+from ..views import activation, auth, avatarserver, forgottenpassword, lists, options, profile
 
 
 urlpatterns = [
@@ -53,3 +53,9 @@ urlpatterns += [
         url(r'^ban-details/$', profile.user_ban, name='user-ban'),
     ]))
 ]
+
+
+urlpatterns += [
+    url(r'^avatar/$', avatarserver.blank_avatar, name='blank-avatar'),
+    url(r'^avatar/(?P<pk>\d+)/(?P<size>\d+)/$', avatarserver.user_avatar, name='user-avatar'),
+]

+ 24 - 0
misago/users/views/avatarserver.py

@@ -0,0 +1,24 @@
+from django.conf import settings
+from django.contrib.auth import get_user_model
+from django.contrib.staticfiles.templatetags.staticfiles import static
+from django.shortcuts import redirect
+
+
+def user_avatar(request, pk, size):
+    User = get_user_model()
+    size = int(size)
+
+    try:
+        user = User.objects.get(pk=pk)
+
+        found_avatar = user.avatars[0]
+        for avatar in user.avatars:
+            if avatar['size'] >= size:
+                found_avatar = avatar
+        return redirect(found_avatar['url'])
+    except User.DoesNotExist:
+        return blank_avatar(request)
+
+
+def blank_avatar(request):
+    return redirect(static(settings.MISAGO_BLANK_AVATAR))