Author: eduardo.padoan
Date: Sun Sep 21 14:58:08 2008
New Revision: 164

Modified:
    trunk/wiki/views.py

Log:
Views now receibe is_member and is_private functions to determine if the  
user have read/write permissions.

Modified: trunk/wiki/views.py
==============================================================================
--- trunk/wiki/views.py (original)
+++ trunk/wiki/views.py Sun Sep 21 14:58:08 2008
@@ -42,7 +42,7 @@
  def get_real_ip(request):
      """ Returns the real user IP, even if behind a proxy.
      Set BEHIND_PROXY to True in your settings if Django is
-    running begind a proxy.
+    running behind a proxy.
      """
      if getattr(settings, 'BEHIND_PROXY', False):
          return request.META['HTTP_X_FORWARDED_FOR']
@@ -104,6 +104,25 @@
          return self.user_ip == get_real_ip(request)


+def has_read_perm(user, group, is_member, is_private):
+    """ Return True if the user has permission to *read*
+    Articles, False otherwise.
+    """
+    if (group is None) or (is_member is None) or is_member(user, group):
+        return True
+    if (is_private is not None) and is_private(group):
+        return False
+    return True
+
+def has_write_perm(user, group, is_member):
+    """ Return True if the user have permission to edit Articles,
+    False otherwise.
+    """
+    if (group is None) or (is_member is None) or is_member(user, group):
+        return True
+    return False
+
+
  @login_required
  def article_list(request,
                   group_slug=None, group_slug_field=None, group_qs=None,
@@ -113,6 +132,8 @@
                   template_name='index.html',
                   template_dir='wiki',
                   extra_context=None,
+                 is_member=None,
+                 is_private=None,
                   *args, **kw):
      if request.method == 'GET':

@@ -120,12 +141,19 @@
              article_qs, group_slug,
              group_slug_field, group_qs)

+        allow_read = has_read_perm(request.user, group, is_member,  
is_private)
+        allow_write = has_write_perm(request.user, group, is_member)
+
+        if not allow_read:
+            return Http404() # @@@ Shouldn't it be forbidden or something?
+
          articles = articles.order_by('-created_at')

          search_form = SearchFormClass()

          template_params = {'articles': articles,
-                           'search_form': search_form}
+                           'search_form': search_form,
+                           'allow_write': allow_write}

          if group_slug is not None:
              template_params['group'] = group
@@ -152,6 +180,8 @@
                   template_name='view.html',
                   template_dir='wiki',
                   extra_context=None,
+                 is_member=None,
+                 is_private=None,
                   *args, **kw):

      if request.method == 'GET':
@@ -160,6 +190,15 @@
              group = get_object_or_404(group_qs,**{group_slug_field:  
group_slug})
              article_args.update({'content_type': get_ct(group),
                                   'object_id': group.id})
+            allow_read = has_read_perm(request.user, group, is_member,
+                                       is_private)
+            allow_write = has_write_perm(request.user, group, is_member)
+        else:
+            allow_read, allow_write = True
+
+        if not allow_read:
+            return Http404()
+
          try:
              article = article_qs.get(**article_args)
              if notification is not None:
@@ -170,7 +209,8 @@
              article = ArticleClass(**article_args)
              is_observing = False

-        template_params = {'article': article}
+        template_params = {'article': article,
+                           'allow_write': allow_write}

          if notification is not None:
              template_params.update({'is_observing': is_observing,
@@ -196,16 +236,28 @@
                   template_name='edit.html',
                   template_dir='wiki',
                   extra_context=None,
+                 check_membership=False,
+                 is_member=None,
+                 is_private=None,
                   *args, **kw):

      group = None
+    article_args = {'title': title}
+    if group_slug is not None:
+        group = get_object_or_404(group_qs,**{group_slug_field:  
group_slug})
+        group_ct = get_ct(group)
+        article_args.update({'content_type': group_ct,
+                             'object_id': group.id})
+        allow_read = has_read_perm(request.user, group, is_member,
+                                   is_private)
+        allow_write = has_write_perm(request.user, group, is_member)
+    else:
+        allow_read, allow_write = True
+
+    if not (allow_read or allow_write):
+        return Http404()
+
      try:
-        article_args = {'title': title}
-        if group_slug is not None:
-            group = get_object_or_404(group_qs,**{group_slug_field:  
group_slug})
-            group_ct = get_ct(group)
-            article_args.update({'content_type': group_ct,
-                                 'object_id': group.id})
          article = article_qs.get(**article_args)
      except ArticleClass.DoesNotExist:
          article = None
@@ -278,6 +330,8 @@
                     template_name='changeset.html',
                     template_dir='wiki',
                     extra_context=None,
+                   is_member=None,
+                   is_private=None,
                     *args, **kw):

      if request.method == "GET":
@@ -296,10 +350,20 @@
              group = get_object_or_404(group_qs,**{group_slug_field:  
group_slug})
              article_args.update({'content_type': get_ct(group),
                                   'object_id': group.id})
+            allow_read = has_read_perm(request.user, group, is_member,
+                                       is_private)
+            allow_write = has_write_perm(request.user, group, is_member)
+        else:
+            allow_read, allow_write = True
+
+        if not allow_read:
+            return Http404()
+
          article = article_qs.get(**article_args)

          template_params = {'article.title': article.title,
-                           'changeset': changeset}
+                           'changeset': changeset,
+                           'allow_write': allow_write}

          if group_slug is not None:
              template_params['group'] = group
@@ -319,6 +383,8 @@
                      template_name='history.html',
                      template_dir='wiki',
                      extra_context=None,
+                    is_member=None,
+                    is_private=None,
                      *args, **kw):

      if request.method == 'GET':
@@ -328,12 +394,22 @@
              group = get_object_or_404(group_qs,**{group_slug_field:  
group_slug})
              article_args.update({'content_type': get_ct(group),
                                   'object_id': group.id})
+            allow_read = has_read_perm(request.user, group, is_member,
+                                       is_private)
+            allow_write = has_write_perm(request.user, group, is_member)
+        else:
+            allow_read, allow_write = True
+
+        if not allow_read:
+            return Http404()
+
          article = get_object_or_404(article_qs, **article_args)
          changes = article.changeset_set.filter(
              reverted=False).order_by('-revision')

          template_params = {'article': article,
-                           'changes': changes}
+                           'changes': changes,
+                           'allow_write': allow_write}
          if group_slug is not None:
              template_params['group'] = group
          if extra_context is not None:
@@ -351,6 +427,8 @@
                         group_slug=None, group_slug_field=None,  
group_qs=None,
                         article_qs=ALL_ARTICLES,
                         extra_context=None,
+                       is_member=None,
+                       is_private=None,
                         *args, **kw):

      if request.method == 'POST':
@@ -364,6 +442,14 @@
              group = get_object_or_404(group_qs,**{group_slug_field:  
group_slug})
              article_args.update({'content_type': get_ct(group),
                                   'object_id': group.id})
+            allow_read = has_read_perm(request.user, group, is_member,
+                                       is_private)
+            allow_write = has_write_perm(request.user, group, is_member)
+        else:
+            allow_read, allow_write = True
+
+        if not (allow_read or allow_write):
+            return Http404()

          article = get_object_or_404(article_qs, **article_args)

@@ -392,6 +478,8 @@
                     article_qs=ALL_ARTICLES,
                     SearchFormClass=SearchForm,
                     extra_context=None,
+                   is_member=None,
+                   is_private=None,
                     *args, **kw):
      if request.method == 'POST':
          search_form = SearchFormClass(request.POST)
@@ -402,6 +490,13 @@
              if group_slug is not None:
                  group = get_object_or_404(group_qs,
                                            **{group_slug_field: group_slug})
+                allow_read = has_read_perm(request.user, group, is_member,
+                                           is_private)
+            else:
+                allow_read = True
+
+            if not allow_read:
+                return Http404()

              # go to article by title
              url = get_url('wiki_article', group,
@@ -427,10 +522,18 @@
              group = get_object_or_404(group_qs,
                                        **{group_slug_field : group_slug})
              changes_qs =  
changes_qs.filter(article__content_type=get_ct(group),
-                                       article__object_id=group.id)
-        template_params = {'changes': changes_qs.order_by('-modified'),
-                           }
+                                           article__object_id=group.id)
+            allow_read = has_read_perm(request.user, group, is_member,
+                                       is_private)
+            allow_write = has_write_perm(request.user, group, is_member)
+        else:
+            allow_read, allow_write = True

+        if not allow_read:
+            return Http404()
+
+        template_params = {'changes': changes_qs.order_by('-modified'),
+                           'allow_write': allow_write}
          if group_slug is not None:
              template_params['group'] = group_slug

@@ -450,6 +553,8 @@
                      template_name='recentchanges.html',
                      template_dir='wiki',
                      extra_context=None,
+                    is_member=None,
+                    is_private=None,
                      *args, **kw):
      if request.method == 'POST':

@@ -459,6 +564,14 @@
              group = get_object_or_404(group_qs,**{group_slug_field:  
group_slug})
              article_args.update({'content_type': get_ct(group),
                                   'object_id': group.id})
+            allow_read = has_read_perm(request.user, group, is_member,
+                                       is_private)
+        else:
+            allow_read = True
+
+        if not allow_read:
+            return Http404()
+
          article = get_object_or_404(article_qs, **article_args)

          notification.observe(article, request.user,
@@ -480,6 +593,8 @@
                             template_name='recentchanges.html',
                             template_dir='wiki',
                             extra_context=None,
+                           is_member=None,
+                           is_private=None,
                             *args, **kw):
      if request.method == 'POST':

@@ -489,6 +604,14 @@
              group = get_object_or_404(group_qs,**{group_slug_field:  
group_slug})
              article_args.update({'content_type': get_ct(group),
                                   'object_id': group.id})
+            allow_read = has_read_perm(request.user, group, is_member,
+                                       is_private)
+        else:
+            allow_read = True
+
+        if not allow_read:
+            return Http404()
+
          article = get_object_or_404(article_qs, **article_args)

          notification.stop_observing(article, request.user)
@@ -502,10 +625,12 @@


  def article_history_feed(request, feedtype, title,
-                   group_slug=None, group_slug_field=None, group_qs=None,
-                   article_qs=ALL_ARTICLES, changes_qs=ALL_CHANGES,
-                   extra_context=None,
-                   *args, **kw):
+                         group_slug=None, group_slug_field=None,  
group_qs=None,
+                         article_qs=ALL_ARTICLES, changes_qs=ALL_CHANGES,
+                         extra_context=None,
+                         is_member=None,
+                         is_private=None,
+                         *args, **kw):

      feeds = {'rss' : RssArticleHistoryFeed,
               'atom' : AtomArticleHistoryFeed}
@@ -526,10 +651,12 @@


  def history_feed(request, feedtype,
-                   group_slug=None, group_slug_field=None, group_qs=None,
-                   article_qs=ALL_ARTICLES, changes_qs=ALL_CHANGES,
-                   extra_context=None,
-                   *args, **kw):
+                 group_slug=None, group_slug_field=None, group_qs=None,
+                 article_qs=ALL_ARTICLES, changes_qs=ALL_CHANGES,
+                 extra_context=None,
+                 is_member=None,
+                 is_private=None,
+                 *args, **kw):

      feeds = {'rss' : RssHistoryFeed,
               'atom' : AtomHistoryFeed}

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"pinax-updates" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/pinax-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to