Browse Source

Foundation for user sites added

Rafał Pitoń 11 years ago
parent
commit
8a2b64b542

+ 1 - 0
misago/conf/defaults.py

@@ -136,6 +136,7 @@ TEMPLATE_CONTEXT_PROCESSORS = (
     'django.contrib.messages.context_processors.messages',
     'django.contrib.messages.context_processors.messages',
     'misago.core.context_processors.site_address',
     'misago.core.context_processors.site_address',
     'misago.conf.context_processors.settings',
     'misago.conf.context_processors.settings',
+    'misago.users.context_processors.sites_links',
 )
 )
 
 
 MISAGO_ACL_EXTENSIONS = (
 MISAGO_ACL_EXTENSIONS = (

+ 0 - 73
misago/templates/misago/navbar.html

@@ -1,73 +0,0 @@
-{% load i18n misago_avatars %}
-<nav id="main-navbar" class="navbar navbar-default navbar-static-top" role="navigation">
-  <div class="container">
-    <!-- Brand and toggle get grouped for better mobile display -->
-    <div class="navbar-header">
-      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
-        <span class="sr-only">{% trans "Toggle navigation" %}</span>
-        <span class="icon-bar"></span>
-        <span class="icon-bar"></span>
-        <span class="icon-bar"></span>
-      </button>
-      {% include "misago/brand.html" %}
-    </div>
-
-    <!-- Collect the nav links, forms, and other content for toggling -->
-    <div class="collapse navbar-collapse">
-      {% if user.is_authenticated %}
-      <ul class="nav navbar-nav navbar-nav-user navbar-right">
-        <li class="dropdown">
-          <a href="#" class="dropdown-toggle user-toggle" data-toggle="dropdown">
-            <span class="glyphicon glyphicon-chevron-down"></span>
-            <img src="{{ user|avatar:30 }}" alt="{% trans "Your avatar" %}">
-            {{ user.username }}
-          </a>
-          <ul class="dropdown-menu">
-            <li>
-              <a href="#">
-                <span class="fa fa-plane"></span>
-                Action
-              </a>
-            </li>
-            <li>
-              <a href="#">
-                <span class="badge pull-right">42</span>
-                <span class="fa fa-plane"></span>
-                Another action
-              </a>
-            </li>
-            <li>
-              <a href="#">
-                <span class="fa fa-plane"></span>
-                Something else here
-              </a>
-            </li>
-            <li class="divider"></li>
-            <li>
-              <a href="#">
-                <span class="fa fa-plane"></span>
-                Separated link
-              </a>
-            </li>
-            <li class="divider"></li>
-            <li>
-              <form action="{% url LOGOUT_URL %}" method="POST">
-                {% csrf_token %}
-                <button>
-                  <span class="fa fa-power-off"></span>
-                  {% trans "Sign out" %}
-                </button>
-              </form>
-            </li>
-          </ul>
-        </li>
-      </ul>
-      {% else %}
-      <div class="navbar-nav-guest navbar-right">
-        <a href="{% url LOGIN_URL %}" class="btn btn-sign-in navbar-btn">{% trans "Sign in" %}</a>
-        <a href="{% url 'misago:register' %}" class="btn btn-register navbar-btn">{% trans "Register" %}</a>
-      </div>
-      {% endif %}
-    </div><!-- /.navbar-collapse -->
-  </div><!-- /.container -->
-</nav>

+ 48 - 0
misago/templates/misago/user_nav.html

@@ -0,0 +1,48 @@
+{% load i18n misago_avatars %}
+<ul class="nav navbar-nav navbar-nav-user navbar-right">
+  <li class="dropdown">
+    <a href="#" class="dropdown-toggle user-toggle" data-toggle="dropdown">
+      <span class="glyphicon glyphicon-chevron-down"></span>
+      <img src="{{ user|avatar:30 }}" alt="{% trans "Your avatar" %}">
+      {{ user.username }}
+    </a>
+    <ul class="dropdown-menu">
+      <li>
+        <a href="#">
+          <span class="fa fa-user"></span>
+          {% trans "See your profile" %}
+        </a>
+      </li>
+      <li>
+        <a href="{% url USERCP_URL %}">
+          <span class="fa fa-cog"></span>
+          {% trans "Change options" %}
+        </a>
+      </li>
+      <li>
+        <a href="#">
+          <span class="badge pull-right">42</span>
+          <span class="fa fa-plane"></span>
+          Another action
+        </a>
+      </li>
+      <li class="divider"></li>
+      <li>
+        <a href="#">
+          <span class="fa fa-plane"></span>
+          Separated link
+        </a>
+      </li>
+      <li class="divider"></li>
+      <li>
+        <form action="{% url LOGOUT_URL %}" method="POST">
+          {% csrf_token %}
+          <button>
+            <span class="fa fa-power-off"></span>
+            {% trans "Sign out" %}
+          </button>
+        </form>
+      </li>
+    </ul>
+  </li>
+</ul>

+ 22 - 0
misago/users/apps.py

@@ -1,7 +1,29 @@
 from django.apps import AppConfig
 from django.apps import AppConfig
+from django.utils.translation import ugettext_lazy as _
+from misago.users.sites import usercp, users_list, user_profile
 
 
 
 
 class MisagoUsersConfig(AppConfig):
 class MisagoUsersConfig(AppConfig):
     name = 'misago.users'
     name = 'misago.users'
     label = 'misago_users'
     label = 'misago_users'
     verbose_name = "Misago Auth"
     verbose_name = "Misago Auth"
+
+    def ready(self):
+        self.register_default_usercp_pages()
+        self.register_default_users_list_pages()
+        self.register_default_user_profile_pages()
+
+    def register_default_usercp_pages(self):
+        usercp.add_page(link='misago:index',
+                        name='Not',
+                        icon='fa fa-check')
+
+    def register_default_users_list_pages(self):
+        users_list.add_page(link='misago:index',
+                            name='Todo',
+                            icon='fa fa-check')
+
+    def register_default_user_profile_pages(self):
+        user_profile.add_page(link='misago:index',
+                              name='Todo',
+                              icon='fa fa-check')

+ 9 - 0
misago/users/context_processors.py

@@ -0,0 +1,9 @@
+from misago.users.sites import usercp, users_list, user_profile
+
+
+def sites_links(request):
+    return {
+        'USERCP_URL': usercp.get_default_link(),
+        'USERS_LIST_URL': users_list.get_default_link(),
+        'USER_PROFILE_URL': user_profile.get_default_link(),
+    }

+ 83 - 8
misago/users/sites.py

@@ -13,9 +13,9 @@ class Site(object):
     def assert_site_is_finalized(self):
     def assert_site_is_finalized(self):
         if not self._finalized:
         if not self._finalized:
             self._finalized = True
             self._finalized = True
-            self.finalize_site()
+            self._finalize_site()
 
 
-    def finalize_site(self):
+    def _finalize_site(self):
         iterations = 0
         iterations = 0
         while self._unsorted_list:
         while self._unsorted_list:
             iterations += 1
             iterations += 1
@@ -25,23 +25,98 @@ class Site(object):
                 raise ValueError(message)
                 raise ValueError(message)
 
 
             for index, page in enumerate(self._unsorted_list):
             for index, page in enumerate(self._unsorted_list):
-                pass
+                if page['after']:
+                    page_added = self._insert_page(page, after=page['after'])
+                elif page['before']:
+                    page_added = self._insert_page(page, before=page['before'])
+                else:
+                    page_added = self._insert_page(page)
 
 
-    def add_page(self, link, name, icon=None, after=None, before=None):
+                if page_added:
+                    del self._unsorted_list[index]
+                    break
+
+    def _insert_page(self, inserted_page, after=None, before=None):
+        if after:
+            new_sorted_list = []
+            for index, page in enumerate(self._sorted_list):
+                new_sorted_list.append(page)
+                if page['link'] == after:
+                    new_sorted_list.append(inserted_page)
+                    self._sorted_list = new_sorted_list
+                    return True
+            else:
+                return False
+        elif before:
+            new_sorted_list = []
+            for index, page in enumerate(self._sorted_list):
+                if page['link'] == before:
+                    new_sorted_list.append(inserted_page)
+                    new_sorted_list.append(page)
+                    self._sorted_list = new_sorted_list
+                    return True
+                else:
+                    new_sorted_list.append(page)
+            else:
+                return False
+        else:
+            self._sorted_list.append(inserted_page)
+            return True
+
+    def add_page(self, link, name, icon=None, after=None, before=None,
+                 visibility_condition=None):
         if self._finalized:
         if self._finalized:
             message = ("%s site was initialized already and no longer "
             message = ("%s site was initialized already and no longer "
                        "accepts new pages")
                        "accepts new pages")
             raise RuntimeError(message % self.name)
             raise RuntimeError(message % self.name)
 
 
-        self._sorted_list.append({
+        if after and before:
+            raise ValueError("after and before arguments are exclusive")
+
+        self._unsorted_list.append({
             'link': link,
             'link': link,
             'name': name,
             'name': name,
             'icon': icon,
             'icon': icon,
             'after': after,
             'after': after,
             'before': before,
             'before': before,
+            'visibility_condition': visibility_condition,
             })
             })
 
 
+    def _active_link_name(self, request):
+        namespace = request.resolver_match.namespace
+        url_name = request.resolver_match.url_name
+
+        if namespace:
+            active_link = '%s:%s' (namespace, url_name)
+        else:
+            active_link = url_name
+        return active_link
+
+    def get_pages(self, request, profile=None):
+        self.assert_site_is_finalized()
+        active_link = self._active_link_name(request)
+        visible_pages = []
+
+        if profile:
+            test_args = (request, profile)
+        else:
+            test_args = (request,)
+
+        for page in self._sorted_list:
+            is_visible = True
+            if page['visibility_condition']:
+                is_visible = page['visibility_condition'](*test_args)
+
+            if is_visible:
+                page['is_active'] = page['link'].startswith(active_link)
+                visible_pages.append(page)
+        return visible_pages
+
+    def get_default_link(self):
+        self.assert_site_is_finalized()
+        return self._sorted_list[0]['link']
+
 
 
-usercp_actions = Site('usercp')
-users_list_tabs = Site('users list')
-user_profile_tabs = Site('user profile')
+usercp = Site('usercp')
+users_list = Site('users list')
+user_profile = Site('user profile')

+ 26 - 0
misago/users/tests/test_sites.py

@@ -0,0 +1,26 @@
+from django.test import TestCase
+from misago.users.sites import Site
+
+
+class SiteTests(TestCase):
+    def setUp(self):
+        self.site = Site('test')
+
+    def test_sites(self):
+        """add_page adds page to site"""
+        self.site.add_page(link='misago:user_posts',
+                           name='Posts',
+                           after='misago:user_threads')
+        self.site.add_page(link='misago:user_threads',
+                           name='Threads')
+        self.site.add_page(link='misago:user_follows',
+                           name='Follows',
+                           before='misago:user_posts')
+
+        self.site.assert_site_is_finalized()
+        sorted_pages = self.site._sorted_list
+        self.assertEqual(sorted_pages[0]['name'], 'Threads')
+        self.assertEqual(sorted_pages[1]['name'], 'Follows')
+        self.assertEqual(sorted_pages[2]['name'], 'Posts')
+
+        self.assertEqual(self.site.get_default_link, 'misago:user_threads')

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

@@ -1,19 +1,11 @@
 from django.shortcuts import redirect, render as django_render
 from django.shortcuts import redirect, render as django_render
 
 
+from misago.users.sites import usercp
+
 
 
 def render(request, template, context=None):
 def render(request, template, context=None):
     context = context or {}
     context = context or {}
-
-    if 'active_link' not in context:
-        namespace = request.resolver_match.namespace
-        url_name = request.resolver_match.url_name
-
-        if namespace:
-            active_link = '%s:%s' (namespace, url_name)
-        else:
-            active_link = url_name
-        context['active_link'] = active_link
-
+    context['pages'] = usercp.get_pages(request, context['profile'])
     return django_render(request, template, context)
     return django_render(request, template, context)