Browse Source

Set avatar from gallery.

Rafał Pitoń 11 years ago
parent
commit
09ca5c9d8f

+ 6 - 0
misago/static/misago/css/misago/forms.less

@@ -155,6 +155,12 @@
           font-weight: bold;
           font-weight: bold;
         }
         }
       }
       }
+
+      .gallery {
+        padding: @form-panel-padding;
+        padding-top: 0px;
+        padding-bottom: 0px;
+      }
     }
     }
 
 
     &.no-fieldsets {
     &.no-fieldsets {

+ 46 - 0
misago/templates/misago/usercp/avatar_galleries.html

@@ -0,0 +1,46 @@
+{% extends "misago/usercp/base.html" %}
+{% load i18n misago_batch %}
+
+
+{% block title %}
+{% trans "Avatars gallery" %} | {% trans "Change options" %} | {{ block.super }}
+{% endblock title %}
+
+
+{% block page %}
+<div class="form-panel">
+  <form method="POST" role="form" class="form-horizontal">
+    {% csrf_token %}
+
+    <div class="form-header">
+      <h2>
+        <span class="fa fa-image"></span>
+        {% trans "Select avatar from gallery" %}
+      </h2>
+    </div>
+
+    <div class="form-body">
+
+      {% for gallery in galleries %}
+      <fieldset>
+        <legend>{{ gallery.name }}</legend>
+        <div class="gallery">
+          {% for row in gallery.images|batch:4 %}
+          <div class="row">
+            {% for image in row %}
+            <div class="col-md-3">
+              <button type="submit" name="new-image", value="{{ image }}" class="thumbnail">
+                <img src="{{ MEDIA_URL }}{{ image }}" alt="{% trans "Gallery image"%}">
+              </button>
+            </div>
+            {% endfor %}
+          </div>
+          {% endfor %}
+        </div>
+      </fieldset>
+      {% endfor %}
+
+    </div>
+  </form>
+</div>
+{% endblock page %}

+ 8 - 2
misago/templates/misago/usercp/change_avatar.html

@@ -34,26 +34,32 @@
           <h4 class="media-heading">{% trans "Change avatar:" %}</h4>
           <h4 class="media-heading">{% trans "Change avatar:" %}</h4>
 
 
           <ul class="list-unstyled">
           <ul class="list-unstyled">
+            {% if misago_settings.allow_custom_avatars %}
             <li>
             <li>
-              <button name="download-gravatar" class="btn btn-link">
+              <button name="dl-gravatar" class="btn btn-link">
                 {% trans "Download my Gravatar" %}
                 {% trans "Download my Gravatar" %}
               </button>
               </button>
             </li>
             </li>
+            {% endif %}
             <li>
             <li>
               <button name="set-dynamic" class="btn btn-link">
               <button name="set-dynamic" class="btn btn-link">
                 {% trans "Generate avatar from my username" %}
                 {% trans "Generate avatar from my username" %}
               </button>
               </button>
             </li>
             </li>
+            {% if misago_settings.allow_custom_avatars %}
             <li>
             <li>
               <a href="#">
               <a href="#">
                 {% trans "Upload image from computer" %}
                 {% trans "Upload image from computer" %}
               </a>
               </a>
             </li>
             </li>
+            {% endif %}
+            {% if galleries_exist %}
             <li>
             <li>
-              <a href="#">
+              <a href="{% url 'misago:usercp_avatar_galleries' %}">
                 {% trans "Pick avatar from gallery" %}
                 {% trans "Pick avatar from gallery" %}
               </a>
               </a>
             </li>
             </li>
+            {% endif %}
           </ul>
           </ul>
           {% endif %}
           {% endif %}
 
 

+ 1 - 1
misago/users/avatars/__init__.py

@@ -16,7 +16,7 @@ SET_DEFAULT_AVATAR = {
 def set_default_avatar(user):
 def set_default_avatar(user):
     try:
     try:
         SET_DEFAULT_AVATAR[settings.default_avatar](user)
         SET_DEFAULT_AVATAR[settings.default_avatar](user)
-    except RuntimeException:
+    except RuntimeError:
         SET_DEFAULT_AVATAR[settings.default_gravatar_fallback](user)
         SET_DEFAULT_AVATAR[settings.default_gravatar_fallback](user)
 
 
 
 

+ 53 - 0
misago/users/avatars/gallery.py

@@ -1,2 +1,55 @@
+from path import path
+from PIL import Image
+
+from django.conf import settings
+
+from misago.users.avatars import cache
+from misago.users.avatars.paths import MEDIA_AVATARS
+
+
+def get_available_galleries():
+    """
+    Returns list of dicts containing 'name' and list of images
+
+    Only jpgs, gifs and pngs are supported avatar images.
+    Galleries are
+    """
+    galleries = []
+
+    for directory in path(MEDIA_AVATARS).dirs():
+        if directory[-8:] != '_default':
+            gallery = {'name': directory.name, 'images': []}
+
+            images = directory.files('*.gif')
+            images += directory.files('*.jpg')
+            images += directory.files('*.jpeg')
+            images += directory.files('*.png')
+
+            for image in images:
+                gallery['images'].append(image[len(settings.MEDIA_ROOT):])
+
+            if gallery['images']:
+                galleries.append(gallery)
+
+    return galleries
+
+
+def galleries_exist():
+    return bool(get_available_galleries())
+
+
+def is_avatar_from_gallery(image_path):
+    for gallery in get_available_galleries():
+        if image_path in gallery['images']:
+            return True
+    else:
+        return False
+
+
+def set_avatar(user, gallery_image_path):
+    image = Image.open(settings.MEDIA_ROOT + gallery_image_path)
+    cache.store_new_avatar(user, image)
+
+
 def set_random_avatar(user):
 def set_random_avatar(user):
     pass
     pass

+ 1 - 0
misago/users/urls.py

@@ -39,6 +39,7 @@ urlpatterns += patterns('misago.users.views.api',
 urlpatterns += patterns('misago.users.views.usercp',
 urlpatterns += patterns('misago.users.views.usercp',
     url(r'^usercp/forum-options/$', 'change_forum_options', name="usercp_change_forum_options"),
     url(r'^usercp/forum-options/$', 'change_forum_options', name="usercp_change_forum_options"),
     url(r'^usercp/change-avatar/$', 'change_avatar', name="usercp_change_avatar"),
     url(r'^usercp/change-avatar/$', 'change_avatar', name="usercp_change_avatar"),
+    url(r'^usercp/change-avatar/galleries/$', 'avatar_galleries', name="usercp_avatar_galleries"),
     url(r'^usercp/edit-signature/$', 'edit_signature', name="usercp_edit_signature"),
     url(r'^usercp/edit-signature/$', 'edit_signature', name="usercp_edit_signature"),
     url(r'^usercp/change-username/$', 'change_username', name="usercp_change_username"),
     url(r'^usercp/change-username/$', 'change_username', name="usercp_change_username"),
     url(r'^usercp/change-email-password/$', 'change_email_password', name="usercp_change_email_password"),
     url(r'^usercp/change-email-password/$', 'change_email_password', name="usercp_change_email_password"),

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

@@ -57,7 +57,7 @@ def change_avatar(request):
     avatar_size = max(settings.MISAGO_AVATARS_SIZES)
     avatar_size = max(settings.MISAGO_AVATARS_SIZES)
 
 
     if not request.user.is_avatar_banned and request.method == 'POST':
     if not request.user.is_avatar_banned and request.method == 'POST':
-        if 'download-gravatar' in request.POST:
+        if 'dl-gravatar' in request.POST and settings.allow_custom_avatars:
             try:
             try:
                 avatars.gravatar.set_avatar(request.user)
                 avatars.gravatar.set_avatar(request.user)
                 message = _("Gravatar was downloaded and set as new avatar.")
                 message = _("Gravatar was downloaded and set as new avatar.")
@@ -76,8 +76,35 @@ def change_avatar(request):
         return redirect('misago:usercp_change_avatar')
         return redirect('misago:usercp_change_avatar')
 
 
     return render(request, 'misago/usercp/change_avatar.html', {
     return render(request, 'misago/usercp/change_avatar.html', {
-            'avatar_size': avatar_size
-        })
+        'avatar_size': avatar_size,
+        'galleries_exist': avatars.gallery.galleries_exist()
+    })
+
+
+@deny_guests
+def avatar_galleries(request):
+    if request.user.is_avatar_banned:
+        message = _("You don't have permission to change your avatar.")
+        messages.info(request, message)
+        return redirect('misago:usercp_change_avatar')
+
+    if not avatars.gallery.galleries_exist():
+        messages.info(request, _("No avatars galleries exist."))
+        return redirect('misago:usercp_change_avatar')
+
+    if request.method == 'POST':
+        new_image = request.POST.get('new-image')
+        if new_image:
+            if avatars.gallery.is_avatar_from_gallery(new_image):
+                avatars.gallery.set_avatar(request.user, new_image)
+                messages.success(request, _("Avatar from gallery was set."))
+                return redirect('misago:usercp_change_avatar')
+            else:
+                messages.error(request, _("Incorrect image."))
+
+    return render(request, 'misago/usercp/avatar_galleries.html', {
+        'galleries': avatars.gallery.get_available_galleries()
+    })
 
 
 
 
 @deny_guests
 @deny_guests