--- Page.py.orig	2008-02-11 19:00:12.000000000 -0300
+++ Page.py	2008-02-11 22:58:03.000000000 -0300
@@ -503,6 +503,41 @@
         """
         return self.exists(domain='standard', includeDeleted=includeDeleted)
 
+    def isApprovedPage(self):
+        """ Is this page approved for public viewing?
+
+        @rtype: bool
+        @return: true, if this page has been approved 
+        """
+        approvedFile = os.path.join(self.getPagePath(), "approved")
+        if os.path.isfile(approvedFile):
+            approvedRevision = {}
+            for line in open(approvedFile).readlines():
+                tmp = line.split("\t")
+                approvedRevision[tmp[0]] = tmp[1]
+            currentRevision = "%08d" % self.get_real_rev()
+            if currentRevision in approvedRevision:
+                return True
+        return False
+
+    def getLastApprovedVersion(self):
+       """ Get The last approved version for public viewing
+       @rtype: int
+       @return: Version number, None if none approved
+       """
+       approvedFile = os.path.join(self.getPagePath(), "approved")
+       if os.path.isfile(approvedFile):
+           approvedRevision = []
+           for line in open(approvedFile).readlines():
+               tmp = line.split("\t")
+               approvedRevision.append(int(tmp[0]))
+           if len(approvedRevision) ==  0:
+               return None
+           else:
+               return max(approvedRevision)
+       else:
+           return None
+
     def exists(self, rev=0, domain=None, includeDeleted=False):
         """ Does this page exist?
 
@@ -1032,6 +1067,7 @@
         pi_formtext = []
         pi_formfields = []
         pi_lines = 0
+        pi_review = None
 
         # check for XML content
         if body and body[:5] == '<?xml':
@@ -1130,6 +1166,9 @@
                 if args in i18n.wikiLanguages():
                     self.language = args
                     request.setContentLanguage(self.language)
+            elif verb == "review":
+                # This page can be reviewed/approved
+                pi_review = args
             else:
                 # unknown PI ==> end PI parsing, and show invalid PI as text
                 body = line + '\n' + body
@@ -1144,6 +1183,20 @@
         if not content_only:
             request.setHttpHeader("Content-Type: %s; charset=%s" % ('text/html', config.charset))
             if page_exists:
+                # Before sending anything check if we need to redirect to the last Approved Version
+                if ( pi_review == "yes" ) and (not self.isApprovedPage()) and (not request.user.may.review(self.page_name)):
+                    lastApRev = self.getLastApprovedVersion()
+                    if lastApRev != None:
+                        # Redirect to the latest Public Revision
+                        rev = int(lastApRev)
+                        pi_redirect = self.page_name
+                        url_str = '%s/%s?action=show&rev=%d&redirect=%s' % (
+                               request.getScriptname(),
+                               wikiutil.quoteWikinameURL(pi_redirect),
+                               rev,
+                               wikiutil.url_quote_plus(self.page_name, ''),)
+                        request.http_redirect(url_str)
+                        return
                 request.setHttpHeader('Status: 200 OK')
                 if not request.cacheable:
                     # use "nocache" headers if we're using a method that is not simply "display"
@@ -1162,6 +1215,7 @@
                 request.setHttpHeader('Status: 404 NOTFOUND')
                 request.setResponseCode(404)
 
+
             request.http_headers()
             request.write(doc_leader)
 
@@ -1248,6 +1302,8 @@
                                                 formatter=self.formatter))
         elif not request.user.may.read(self.page_name):
             request.write("<strong>%s</strong><br>" % _("You are not allowed to view this page."))
+        elif (pi_review == "yes") and (not self.isApprovedPage()) and (not request.user.may.review(self.page_name)):
+              request.write("<strong>%s</strong><br>" % _("Sorry. This page has not been approved yet for public access or you are not allowed to review it."))
         else:
             # parse the text and send the page content
             self.send_page_content(request, Parser, body,
