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

User Control Panel is now modular and easily extensible #12

Ralfp 12 лет назад
Родитель
Сommit
8c826fd44b

+ 0 - 0
misago/avatarcp/__init__.py


+ 0 - 0
misago/avatarcp/forms.py


+ 9 - 0
misago/avatarcp/urls.py

@@ -0,0 +1,9 @@
+from django.conf.urls import patterns, url
+
+urlpatterns = patterns('misago.avatarcp.views',
+    url(r'^avatar/$', 'avatar', name="usercp_avatar"),
+    #url(r'^avatar/gallery/$', 'gallery', name="usercp_avatar_gallery"),
+    #url(r'^avatar/upload/$', 'upload', name="usercp_avatar_upload"),
+    #url(r'^avatar/crop/$', 'crop', name="usercp_avatar_crop"),
+    #url(r'^avatar/gravatar/$', 'gravatar', name="usercp_avatar_gravatar"),
+)

+ 4 - 0
misago/avatarcp/usercp.py

@@ -0,0 +1,4 @@
+from django.utils.translation import ugettext_lazy as _
+
+def register_usercp_extension(request):
+    return (('usercp_avatar', _('Change Avatar')),)

+ 21 - 0
misago/avatarcp/views.py

@@ -0,0 +1,21 @@
+from django.core.urlresolvers import reverse
+from django.shortcuts import redirect
+from django.utils.translation import ugettext as _
+from misago.authn.decorators import block_guest
+from misago.forms import FormLayout
+from misago.messages import Message
+from misago.usercp.template import RequestContext
+
+@block_guest
+def avatar(request):
+    # Intercept all requests if we cant use avatar
+    if request.user.avatar_ban:
+        return request.theme.render_to_response('usercp/avatar_banned.html',
+                                            context_instance=RequestContext(request, {
+                                              'tab': 'avatar',
+                                             }));
+                                                   
+    return request.theme.render_to_response('usercp/avatar.html',
+                                            context_instance=RequestContext(request, {
+                                              'tab': 'avatar',
+                                             }));

+ 5 - 0
misago/settings_base.py

@@ -94,6 +94,11 @@ PERMISSION_PROVIDERS = (
     'misago.forums.acl',
 )
 
+# List of UserCP extensions
+USERCP_EXTENSIONS = (
+    'misago.avatarcp',
+)
+
 # Name of root urls configuration
 ROOT_URLCONF = 'misago.urls'
 

+ 0 - 0
misago/usercp/extension/__init__.py


+ 2 - 0
misago/usercp/extension/avatar.py

@@ -0,0 +1,2 @@
+def user_cp(request):
+	pass

+ 25 - 0
misago/usercp/template.py

@@ -0,0 +1,25 @@
+from django.conf import settings
+from django.template import RequestContext as DjangoRequestContext
+from django.utils.importlib import import_module
+
+def RequestContext(request, context=None):
+    print context
+    if not context:
+        context = {}
+    context['tabs'] = []
+    
+    for extension in settings.USERCP_EXTENSIONS:
+        usercp_module = import_module(extension + '.usercp')
+        try:
+            append_links = usercp_module.register_usercp_extension(request)
+            for link in append_links:
+                context['tabs'].append({
+                                        'route': link[0],
+                                        'active': context['tab'] == link[0][link[0].find('_') + 1:],
+                                        'name': link[1],
+                                        })
+        except AttributeError:
+            pass
+    
+    return DjangoRequestContext(request, context)
+    

+ 9 - 3
misago/usercp/urls.py

@@ -1,10 +1,16 @@
-from django.conf.urls import patterns, url
+from django.conf import settings
+from django.conf.urls import include, patterns, url
+from django.utils.importlib import import_module
 
 urlpatterns = patterns('misago.usercp.views',
     url(r'^$', 'options', name="usercp"),
     url(r'^credentials/$', 'credentials', name="usercp_credentials"),
     url(r'^username/$', 'username', name="usercp_username"),
-    url(r'^avatar/$', 'avatar', name="usercp_avatar"),
     url(r'^signature/$', 'signature', name="usercp_signature"),
     url(r'^ignored/$', 'ignored', name="usercp_ignored"),
-)
+)
+
+for extension in settings.USERCP_EXTENSIONS:
+    urlpatterns += patterns('',
+        (r'^', include(extension + '.urls')),
+    )

+ 21 - 41
misago/usercp/views.py

@@ -1,11 +1,11 @@
 from django.core.urlresolvers import reverse
 from django.shortcuts import redirect
-from django.template import RequestContext
 from django.utils.translation import ugettext as _
 from misago.forms import FormLayout
 from misago.messages import Message
 from misago.authn.decorators import block_guest
 from misago.usercp.forms import UserForumOptionsForm
+from misago.usercp.template import RequestContext
 
 
 @block_guest   
@@ -29,66 +29,46 @@ def options(request):
                                                              })
     
     return request.theme.render_to_response('usercp/options.html',
-                                            {
-                                             'message': message,
-                                             'tab': 'options',
-                                             'form': FormLayout(form)
-                                             },
-                                            context_instance=RequestContext(request));
+                                            context_instance=RequestContext(request, {
+                                              'message': message,
+                                              'tab': 'options',
+                                              'form': FormLayout(form)
+                                             }));
     
  
 @block_guest
 def credentials(request):
     return request.theme.render_to_response('usercp/credentials.html',
-                                            {
-                                             'tab': 'credentials',
-                                             },
-                                            context_instance=RequestContext(request));
+                                            context_instance=RequestContext(request, {
+                                              'tab': 'credentials',
+                                             }));
     
  
 @block_guest
 def username(request):
     return request.theme.render_to_response('usercp/username.html',
-                                            {
-                                             'tab': 'username',
-                                             },
-                                            context_instance=RequestContext(request));
-    
- 
-@block_guest
-def avatar(request):
-    # Intercept all requests if we cant use avatar
-    if request.user.avatar_ban:
-        return request.theme.render_to_response('usercp/avatar_banned.html',
-                                                {'tab': 'avatar'},
-                                                context_instance=RequestContext(request));
-                                                   
-    return request.theme.render_to_response('usercp/avatar.html',
-                                            {
-                                             'tab': 'avatar',
-                                             },
-                                            context_instance=RequestContext(request));
-    
+                                            context_instance=RequestContext(request, {
+                                              'tab': 'username',
+                                             }));  
  
 @block_guest
 def signature(request):
     # Intercept all requests if we cant use signature
     if request.user.avatar_ban:
         return request.theme.render_to_response('usercp/signature_banned.html',
-                                                {'tab': 'signature'},
-                                                context_instance=RequestContext(request));
+                                                context_instance=RequestContext(request, {
+                                                  'tab': 'signature',
+                                                 }));
                                                 
     return request.theme.render_to_response('usercp/signature.html',
-                                            {
-                                             'tab': 'signature',
-                                             },
-                                            context_instance=RequestContext(request));
+                                            context_instance=RequestContext(request, {
+                                              'tab': 'signature',
+                                             }));
     
  
 @block_guest
 def ignored(request):
     return request.theme.render_to_response('usercp/ignored.html',
-                                            {
-                                             'tab': 'ignored',
-                                             },
-                                            context_instance=RequestContext(request));
+                                            context_instance=RequestContext(request, {
+                                              'tab': 'ignored',
+                                             }));

+ 1 - 0
static/sora/css/sora.css

@@ -931,3 +931,4 @@ th.table-sort.sort-desc a:hover{border-bottom:3px solid #eca09a;padding-bottom:5
 .profile-header .avatar-height h1{font-size:300%;}
 .profile-header .avatar-height .lead{color:#555555;}.profile-header .avatar-height .lead .muted{color:#959595;}
 .profile-header .nav-tabs{margin-top:-22px;margin-bottom:0px;padding-left:142px;}
+.avatar-menu h3{margin-top:0px;}

+ 6 - 0
static/sora/css/sora/utilities.less

@@ -38,3 +38,9 @@
     padding-left: 142px;
   }
 }
+
+.avatar-menu {
+  h3 {
+    margin-top: 0px;
+  }
+}

+ 19 - 0
templates/sora/usercp/avatar.html

@@ -7,4 +7,23 @@
 
 {% block action %}
 <h2>{% trans %}Change your Avatar{% endtrans %}</h2>
+<div class="row">
+  <div class="span3" style="text-align: right;">
+  	<img src="{{ user.get_avatar() }}" class="avatar-big" alt="{% trans %}Your Avatar{% endtrans %}" title="{% trans %}Your Avatar{% endtrans %}">
+  </div>
+  <div class="span6 avatar-menu">
+    <h3>{% if user.avatar_type == 'upload' -%}
+    	{% trans %}Uploaded Avatar{% endtrans %}
+    	{%- elif user.avatar_type == 'gallery' -%}
+    	{% trans %}Gallery Avatar{% endtrans %}
+    	{%- else -%}
+    	{% trans %}Gravatar{% endtrans %}
+    	{%- endif %} <small>{% trans %}Current Avatar{% endtrans %}</small></h3>
+    <ul class="unstyled">
+      <li><i class="icon-share"></i> <a href="#">{% trans %}Use Gravatar{% endtrans %}</a></li>
+      <li><i class="icon-th"></i> <a href="#">{% trans %}Pick Avatar from Gallery{% endtrans %}</a></li>
+      <li><i class="icon-picture"></i> <a href="#">{% trans %}Upload Avatar{% endtrans %}</a></li>
+    </ul>
+  </div>
+</div>
 {% endblock %}

+ 3 - 0
templates/sora/usercp/layout.html

@@ -11,6 +11,9 @@
   	<div class="tabbable tabs-left">
   	  <ul class="nav nav-tabs">
         <li class="nav-header">{% trans %}Account Settings{% endtrans %}</li>
+        {% for link in tabs %}
+        <li{% if link.active %} class="active"{% endif %}><a href="{{ link.route|url }}">{{ link.name }}</a></li>
+        {% endfor %}
   	    <li{% if tab == 'options' %} class="active"{% endif %}><a href="{% url 'usercp' %}">{% trans %}Forum Options{% endtrans %}</a></li>
         <li{% if tab == 'avatar' %} class="active"{% endif %}><a href="{% url 'usercp_avatar' %}">{% trans %}Change Avatar{% endtrans %}</a></li>
         <li{% if tab == 'signature' %} class="active"{% endif %}><a href="{% url 'usercp_signature' %}">{% trans %}Edit Signature{% endtrans %}</a></li>