]> git.openstreetmap.org Git - osqa.git/blobdiff - forum/modules/ui_objects.py
Merge pull request #49 from udacity/login_logout_links
[osqa.git] / forum / modules / ui_objects.py
index e7f626fb417797115d9ee4f4ace5681e2a066d40..7fae3d43a8ef4bbf41c8056e73a4d53401fef799 100644 (file)
@@ -2,11 +2,12 @@ from django.core.urlresolvers import reverse
 from django.template.defaultfilters import slugify
 from django import template
 from forum.utils import html
+from forum.models.user import AnonymousUser
 from ui import Registry
 from copy import copy
 
 class Visibility(object):
-    def __init__(self, level='public'):
+    def __init__(self, level='public', negated=False):
         if level not in ['public', 'authenticated', 'staff', 'superuser', 'owner']:
             try:
                 int(level)
@@ -17,7 +18,7 @@ class Visibility(object):
             self.by_reputation = False
 
         self.level = level
-        self.negated = False
+        self.negated = negated
 
     def show_to(self, user):
         if self.by_reputation:
@@ -35,11 +36,11 @@ class Visibility(object):
             return res
 
     def __invert__(self):
-        inverted = copy(self)
-        inverted.negated = True
+        return Visibility(self.level, not self.negated)
         
 
 Visibility.PUBLIC = Visibility('public')
+Visibility.ANONYMOUS = Visibility('authenticated', negated=True)
 Visibility.AUTHENTICATED = Visibility('authenticated')
 Visibility.STAFF = Visibility('staff')
 Visibility.SUPERUSER = Visibility('superuser')
@@ -62,14 +63,15 @@ class ObjectBase(object):
 
         def __call__(self, context):
             if callable(self.argument):
-                user = context.get('request', None) and context['request'].user or None
+                user = context.get('request', None) and context['request'].user or AnonymousUser()
                 return self.argument(user, context)
             else:
                 return self.argument
 
-    def __init__(self, visibility=None, weight=500):
+    def __init__(self, visibility=None, weight=500, name=''):
         self.visibility = visibility
         self.weight = weight
+        self.name = name
 
     def _visible_to(self, user):
         return (not self.visibility) or (self.visibility and self.visibility.show_to(user))
@@ -81,10 +83,7 @@ class ObjectBase(object):
             try:
                 return self._visible_to(context['viewer'])
             except KeyError:
-                if self.visibility:
-                    return False
-                else:
-                    return True
+                return self._visible_to(AnonymousUser())
 
     def render(self, context):
         return ''
@@ -96,8 +95,8 @@ class LoopBase(ObjectBase):
 
 
 class Link(ObjectBase):
-    def __init__(self, text, url, attrs=None, pre_code='', post_code='', visibility=None, weight=500):
-        super(Link, self).__init__(visibility, weight)
+    def __init__(self, text, url, attrs=None, pre_code='', post_code='', visibility=None, weight=500, name=''):
+        super(Link, self).__init__(visibility, weight, name)
         self.text = self.Argument(text)
         self.url = self.Argument(url)
         self.attrs = self.Argument(attrs or {})
@@ -110,8 +109,8 @@ class Link(ObjectBase):
             self.post_code(context))
 
 class Include(ObjectBase):
-    def __init__(self, tpl, visibility=None, weight=500):
-        super(Include, self).__init__(visibility, weight)
+    def __init__(self, tpl, visibility=None, weight=500, name=''):
+        super(Include, self).__init__(visibility, weight, name)
         self.template = template.loader.get_template(tpl)
 
     def render(self, context):
@@ -121,8 +120,8 @@ class Include(ObjectBase):
         
 
 class LoopContext(LoopBase):
-    def __init__(self, loop_context, visibility=None, weight=500):
-        super(LoopContext, self).__init__(visibility, weight)
+    def __init__(self, loop_context, visibility=None, weight=500, name=''):
+        super(LoopContext, self).__init__(visibility, weight, name)
         self.loop_context = self.Argument(loop_context)
 
     def update_context(self, context):
@@ -130,8 +129,8 @@ class LoopContext(LoopBase):
 
 
 class PageTab(LoopBase):
-    def __init__(self, tab_name, tab_title, url_getter, weight):
-        super(PageTab, self).__init__(weight=weight)
+    def __init__(self, tab_name, tab_title, url_getter, weight, name=''):
+        super(PageTab, self).__init__(weight=weight, name=name)
         self.tab_name = tab_name
         self.tab_title = tab_title
         self.url_getter = url_getter
@@ -146,7 +145,7 @@ class PageTab(LoopBase):
 
 class ProfileTab(LoopBase):
     def __init__(self, name, title, description, url_getter, private=False, render_to=None, weight=500):
-        super(ProfileTab, self).__init__(weight=weight)
+        super(ProfileTab, self).__init__(weight=weight, name=name)
         self.name = name
         self.title = title
         self.description = description
@@ -169,8 +168,8 @@ class ProfileTab(LoopBase):
 
 
 class AjaxMenuItem(ObjectBase):
-    def __init__(self, label, url, a_attrs=None, span_label='', span_attrs=None, visibility=None, weight=500):
-        super(AjaxMenuItem, self).__init__(visibility, weight)
+    def __init__(self, label, url, a_attrs=None, span_label='', span_attrs=None, visibility=None, weight=500, name=''):
+        super(AjaxMenuItem, self).__init__(visibility, weight, name)
         self.label = self.Argument(label)
         self.url = self.Argument(url)
         self.a_attrs = self.Argument(a_attrs or {})
@@ -184,8 +183,8 @@ class AjaxMenuItem(ObjectBase):
             **{'class': 'item'})
 
 class AjaxMenuGroup(ObjectBase, Registry):
-    def __init__(self, label, items, visibility=None, weight=500):
-        super(AjaxMenuGroup, self).__init__(visibility, weight)
+    def __init__(self, label, items, visibility=None, weight=500, name=''):
+        super(AjaxMenuGroup, self).__init__(visibility, weight, name)
         self.label = label
 
         for item in items: