Code

Some cleanup.
[roundup.git] / roundup / cgi_client.py
index e46098ba0aa2273593bbb56c400825db403dddb4..c978b3d94fcd147abdbb582819b0b793b9fba0d7 100644 (file)
@@ -15,7 +15,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: cgi_client.py,v 1.36 2001-10-21 04:44:50 richard Exp $
+# $Id: cgi_client.py,v 1.40 2001-10-23 23:06:39 richard Exp $
 
 import os, cgi, pprint, StringIO, urlparse, re, traceback, mimetypes
 import base64, Cookie, time
@@ -39,7 +39,18 @@ class Client:
     'anonymous' user exists, the user is logged in using that user (though
     there is no cookie). This allows them to modify the database, and all
     modifications are attributed to the 'anonymous' user.
+
+
+    Customisation
+    -------------
+      FILTER_POSITION - one of 'top', 'bottom', 'top and bottom'
+      ANONYMOUS_ACCESS - one of 'deny', 'allow'
+      ANONYMOUS_REGISTER - one of 'deny', 'allow'
+
     '''
+    FILTER_POSITION = 'bottom'       # one of 'top', 'bottom', 'top and bottom'
+    ANONYMOUS_ACCESS = 'deny'        # one of 'deny', 'allow'
+    ANONYMOUS_REGISTER = 'deny'      # one of 'deny', 'allow'
 
     def __init__(self, instance, out, env):
         self.instance = instance
@@ -229,8 +240,8 @@ class Client:
         if show_customization is None:
             show_customization = self.customization_widget()
 
-        htmltemplate.index(self, self.TEMPLATES, self.db, cn, filterspec,
-            filter, columns, sort, group,
+        index = htmltemplate.IndexTemplate(self, self.TEMPLATES, cn)
+        index.render(filterspec, filter, columns, sort, group,
             show_customization=show_customization)
         self.pagefoot()
 
@@ -265,7 +276,9 @@ class Client:
         nodeid = self.nodeid
 
         # use the template to display the item
-        htmltemplate.item(self, self.TEMPLATES, self.db, self.classname, nodeid)
+        item = htmltemplate.ItemTemplate(self, self.TEMPLATES, self.classname)
+        item.render(nodeid)
+
         self.pagefoot()
     showissue = shownode
     showmsg = shownode
@@ -422,8 +435,12 @@ class Client:
                 traceback.print_exc(None, s)
                 message = '<pre>%s</pre>'%cgi.escape(s.getvalue())
         self.pagehead('New %s'%self.classname.capitalize(), message)
-        htmltemplate.newitem(self, self.TEMPLATES, self.db, self.classname,
-            self.form)
+
+        # call the template
+        newitem = htmltemplate.NewItemTemplate(self, self.TEMPLATES,
+            self.classname)
+        newitem.render(self.form)
+
         self.pagefoot()
     newissue = newnode
     newuser = newnode
@@ -455,8 +472,9 @@ class Client:
                 message = '<pre>%s</pre>'%cgi.escape(s.getvalue())
 
         self.pagehead('New %s'%self.classname.capitalize(), message)
-        htmltemplate.newitem(self, self.TEMPLATES, self.db, self.classname,
-            self.form)
+        newitem = htmltemplate.NewItemTemplate(self, self.TEMPLATES,
+            self.classname)
+        newitem.render(self.form)
         self.pagefoot()
 
     def classes(self, message=None):
@@ -493,7 +511,11 @@ class Client:
 <tr><td></td>
     <td><input type="submit" value="Log In"></td></tr>
 </form>
-
+''')
+        if self.user is None and not self.ANONYMOUS_REGISTER == 'deny':
+            self.write('</table')
+            return
+        self.write('''
 <p>
 <tr><td colspan=2 class="strong-header">New User Registration</td></tr>
 <tr><td colspan=2><em>marked items</em> are optional...</td></tr>
@@ -526,6 +548,7 @@ class Client:
             password = self.form['__login_password'].value
         else:
             password = ''
+        print self.user, password
         # make sure the user exists
         try:
             uid = self.db.user.lookup(self.user)
@@ -570,6 +593,10 @@ class Client:
         ''' create a new user based on the contents of the form and then
         set the cookie
         '''
+        # re-open the database as "admin"
+        self.db.close()
+        self.db = self.instance.open('admin')
+
         # TODO: pre-check the required fields and username key property
         cl = self.db.classes['user']
         props, dummy = parsePropsFromForm(self.db, cl, self.form)
@@ -617,58 +644,68 @@ class Client:
         # now figure which function to call
         path = self.split_path
         if not path or path[0] in ('', 'index'):
-            self.index()
-        elif len(path) == 1:
-            if path[0] == 'list_classes':
-                self.classes()
-                return
-            if path[0] == 'login':
-                self.login()
-                return
-            if path[0] == 'login_action':
-                self.login_action()
-                return
-            if path[0] == 'newuser_action':
-                self.newuser_action()
-                return
-            if path[0] == 'logout':
-                self.logout()
-                return
-            m = dre.match(path[0])
-            if m:
-                self.classname = m.group(1)
-                self.nodeid = m.group(2)
-                try:
-                    cl = self.db.classes[self.classname]
-                except KeyError:
-                    raise NotFound
-                try:
-                    cl.get(self.nodeid, 'id')
-                except IndexError:
-                    raise NotFound
-                try:
-                    func = getattr(self, 'show%s'%self.classname)
-                except AttributeError:
-                    raise NotFound
-                func()
-                return
-            m = nre.match(path[0])
-            if m:
-                self.classname = m.group(1)
-                try:
-                    func = getattr(self, 'new%s'%self.classname)
-                except AttributeError:
-                    raise NotFound
-                func()
-                return
-            self.classname = path[0]
+            return self.index()
+        elif not path:
+            raise 'ValueError', 'Path not understood'
+
+        #
+        # Everthing ignores path[1:]
+        #
+        # The file download link generator actually relies on this - it
+        # appends the name of the file to the URL so the download file name
+        # is correct, but doesn't actually use it.
+        action = path[0]
+        if action == 'login_action':
+            return self.login_action()
+
+        # make sure anonymous are allowed to register
+        if self.ANONYMOUS_REGISTER == 'deny' and self.user is None:
+            return self.login()
+
+        if action == 'newuser_action':
+            return self.newuser_action()
+
+        # make sure totally anonymous access is OK
+        if self.ANONYMOUS_ACCESS == 'deny' and self.user is None:
+            return self.login()
+
+        if action == 'list_classes':
+            return self.classes()
+        if action == 'login':
+            return self.login()
+        if action == 'logout':
+            return self.logout()
+        m = dre.match(action)
+        if m:
+            self.classname = m.group(1)
+            self.nodeid = m.group(2)
             try:
-                self.db.getclass(self.classname)
+                cl = self.db.classes[self.classname]
             except KeyError:
                 raise NotFound
-            self.list()
-        else:
-            raise 'ValueError', 'Path not understood'
+            try:
+                cl.get(self.nodeid, 'id')
+            except IndexError:
+                raise NotFound
+            try:
+                func = getattr(self, 'show%s'%self.classname)
+            except AttributeError:
+                raise NotFound
+            return func()
+        m = nre.match(action)
+        if m:
+            self.classname = m.group(1)
+            try:
+                func = getattr(self, 'new%s'%self.classname)
+            except AttributeError:
+                raise NotFound
+            return func()
+        self.classname = action
+        try:
+            self.db.getclass(self.classname)
+        except KeyError:
+            raise NotFound
+        self.list()
 
     def __del__(self):
         self.db.close()
@@ -808,6 +845,29 @@ def parsePropsFromForm(db, cl, form, nodeid=0):
 
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.39  2001/10/23 01:00:18  richard
+# Re-enabled login and registration access after lopping them off via
+# disabling access for anonymous users.
+# Major re-org of the htmltemplate code, cleaning it up significantly. Fixed
+# a couple of bugs while I was there. Probably introduced a couple, but
+# things seem to work OK at the moment.
+#
+# Revision 1.38  2001/10/22 03:25:01  richard
+# Added configuration for:
+#  . anonymous user access and registration (deny/allow)
+#  . filter "widget" location on index page (top, bottom, both)
+# Updated some documentation.
+#
+# Revision 1.37  2001/10/21 07:26:35  richard
+# feature #473127: Filenames. I modified the file.index and htmltemplate
+#  source so that the filename is used in the link and the creation
+#  information is displayed.
+#
+# Revision 1.36  2001/10/21 04:44:50  richard
+# bug #473124: UI inconsistency with Link fields.
+#    This also prompted me to fix a fairly long-standing usability issue -
+#    that of being able to turn off certain filters.
+#
 # Revision 1.35  2001/10/21 00:17:54  richard
 # CGI interface view customisation section may now be hidden (patch from
 #  Roch'e Compaan.)