Browse Source

WIP tests and docs for avatar server

Rafał Pitoń 11 years ago
parent
commit
28ed14b462

+ 1 - 0
docs/developers/index.rst

@@ -46,5 +46,6 @@ Following references cover everything you want to know about writing your own ap
    shortcuts
    thread_store
    user_sites
+   writing_templates
    validators
    views_errors

+ 28 - 0
docs/developers/writing_templates.rst

@@ -0,0 +1,28 @@
+=================
+Writing Templates
+=================
+
+Misago defines plenty of custom tags and filters for use by template authors.
+
+
+misago_avatars
+=============
+
+``avatar`` filter
+-----------------
+
+
+``blankavatar`` tag
+-------------------
+
+
+misago_capture
+==============
+
+
+misago_editor
+=============
+
+
+misago_forms
+============

+ 1 - 0
docs/index.rst

@@ -35,5 +35,6 @@ Table of Contents
    developers/shortcuts
    developers/thread_store
    developers/user_sites
+   developers/writing_templates
    developers/validators
    developers/views_errors

+ 11 - 1
misago/users/templatetags/misago_avatars.py

@@ -9,5 +9,15 @@ register = template.Library()
 
 @register.filter(name='avatar')
 def avatar(user, size=200):
+    try:
+        user_pk = user.pk
+    except:
+        user_pk = user
+
     return reverse('misago:user_avatar',
-                   kwargs={'user_id': user.pk, 'size': size})
+                   kwargs={'user_id': user_pk, 'size': size})
+
+
+@register.simple_tag
+def blankavatar(size=200):
+    return reverse('misago:blank_avatar', kwargs={'size': size})

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

@@ -0,0 +1,8 @@
+from django.contrib.auth import get_user_model
+from django.core.urlresolvers import reverse
+from django.template import Context, Template
+from django.test import TestCase
+
+
+class AvatarServerTests(TestCase):
+    pass

+ 44 - 0
misago/users/tests/test_misagoavatars_tags.py

@@ -0,0 +1,44 @@
+from django.contrib.auth import get_user_model
+from django.template import Context, Template
+from django.test import TestCase
+
+
+class TemplateTagsTests(TestCase):
+    def test_user_avatar_filter(self):
+        """avatar filter returns url to avatar image"""
+        User = get_user_model()
+        user = User.objects.create_user('Bob', 'bob@test.com', 'pass123')
+
+        tpl_content = """
+{% load misago_avatars %}
+
+{{ user|avatar }}
+{{ user|avatar:100 }}
+{{ user.pk|avatar }}
+{{ user.pk|avatar:100 }}
+"""
+
+        tpl = Template(tpl_content)
+        render = tpl.render(Context({'user': user})).strip().splitlines()
+
+        pk = user.pk
+
+        self.assertEqual(render[0].strip(), '/user-avatar/200/%s.png' % pk)
+        self.assertEqual(render[1].strip(), '/user-avatar/100/%s.png' % pk)
+        self.assertEqual(render[2].strip(), '/user-avatar/200/%s.png' % pk)
+        self.assertEqual(render[3].strip(), '/user-avatar/100/%s.png' % pk)
+
+    def test_blankavatar_tag(self):
+        """{% blankavatar %} tag returns url to default image"""
+        tpl_content = """
+{% load misago_avatars %}
+
+{% blankavatar %}
+{% blankavatar 100 %}
+"""
+
+        tpl = Template(tpl_content)
+        render = tpl.render(Context()).strip().splitlines()
+
+        self.assertEqual(render[0].strip(), '/user-avatar/200.png')
+        self.assertEqual(render[1].strip(), '/user-avatar/100.png')

+ 2 - 2
misago/users/urls.py

@@ -47,6 +47,6 @@ urlpatterns += patterns('misago.users.views.usercp',
 
 
 urlpatterns += patterns('misago.users.views.avatarserver',
-    url(r'^user-avatar/(?P<size>\d+)/(?P<user_id>\d+)\.png$', 'serve_avatar', name="user_avatar"),
-
+    url(r'^user-avatar/(?P<size>\d+)/(?P<user_id>\d+)\.png$', 'serve_user_avatar', name="user_avatar"),
+    url(r'^user-avatar/(?P<size>\d+)\.png$', 'serve_blank_avatar', name="blank_avatar"),
 )

+ 32 - 10
misago/users/views/avatarserver.py

@@ -6,24 +6,46 @@ from misago.core.fileserver import make_file_response
 from misago.users.avatars import set_default_avatar
 
 
-def serve_avatar(request, user_id, size):
-    avatar_file = get_avatar_file(user_id, size)
+def serve_user_avatar(request, user_id, size):
+    size = clean_size(size)
+    User = get_user_model()
+
+    if user_id > 0:
+        try:
+            user = User.objects.get(id=user_id)
+            if not user.is_avatar_banned:
+                avatar_file = get_avatar_file(user, size)
+            else:
+                avatar_file = get_blank_avatar_file(size)
+        except User.DoesNotExist:
+            avatar_file = get_blank_avatar_file(size)
+    else:
+        avatar_file = get_blank_avatar_file(size)
+
     avatar_path = '%s/%s.png' % (settings.MISAGO_AVATAR_CACHE, avatar_file)
+    return make_file_response(avatar_path, 'image/png')
+
 
+def serve_blank_avatar(request, size):
+    size = clean_size(size)
+    avatar_file = get_blank_avatar_file(size)
+    avatar_path = '%s/%s.png' % (settings.MISAGO_AVATAR_CACHE, avatar_file)
     return make_file_response(avatar_path, 'image/png')
 
 
-def get_avatar_file(user_id, size):
+def clean_size(size):
     if not size in settings.MISAGO_AVATARS_SIZES:
+        size = max(settings.MISAGO_AVATARS_SIZES)
         for valid_size in sorted(settings.MISAGO_AVATARS_SIZES, reverse=True):
             if valid_size > size:
                 size = valid_size
+    return size
+
+
+def get_user_avatar_file(user, size):
+    file_formats = (user.joined_on.strftime('%y%m'), user.pk, size)
+    return '%s/%s_%s' % file_formats
 
-    User = get_user_model()
-    try:
-        user = User.objects.get(id=user_id)
-        file_formats = (user.joined_on.strftime('%y%m'), user.pk, size)
-        return '%s/%s_%s' % file_formats
-    except User.DoesNotExist:
-        return 'guest_%s' % size
 
+def get_blank_avatar_file(size):
+    return 'blank/blank_%s' % size