Code

- fixed filter() with no sort/group (sf bug 618614)
authorrichard <richard@57a73879-2fb5-44c3-a270-3262357dd7e2>
Mon, 7 Oct 2002 00:52:51 +0000 (00:52 +0000)
committerrichard <richard@57a73879-2fb5-44c3-a270-3262357dd7e2>
Mon, 7 Oct 2002 00:52:51 +0000 (00:52 +0000)
- fixed register with no session (sf bug 618611)
- fixed log / pid file path handling in roundup-server (sf bug 617981)
- fixed old gadfly compatibiltiy problem, for sure this time (sf bug 612873)

git-svn-id: http://svn.roundup-tracker.org/svnroot/roundup/trunk@1322 57a73879-2fb5-44c3-a270-3262357dd7e2

12 files changed:
CHANGES.txt
MANIFEST.in
doc/Makefile
roundup/backends/__init__.py
roundup/backends/back_anydbm.py
roundup/backends/back_gadfly.py
roundup/backends/back_metakit.py
roundup/backends/rdbms_common.py
roundup/cgi/client.py
roundup/hyperdb.py
roundup/mailgw.py
roundup/scripts/roundup_server.py

index 422fb2d84e66c0ee49eade38a59718b50b0aec90..c8ae24f256d02bbd6217e0ee033a9b75d6a7111d 100644 (file)
@@ -6,6 +6,10 @@ are given with the most recent entry first.
 - metakit cleanups
 - nicer "navigation" style in index views
 - handle missing Link values in anydbm backend set() operation
+- fixed filter() with no sort/group (sf bug 618614)
+- fixed register with no session (sf bug 618611)
+- fixed log / pid file path handling in roundup-server (sf bug 617981)
+- fixed old gadfly compatibiltiy problem, for sure this time (sf bug 612873)
 
 
 2002-10-02 0.5.0
index b7c6a328ad9347f9f103c1a69963668c9f8fb67a..29d70e322a43c83a07d14781f4c5abff01434f82 100644 (file)
@@ -9,4 +9,5 @@ recursive-exclude roundup *.pyc *.pyo .cvsignore
 recursive-exclude frontends *.pyc *.pyo .cvsignore
 include run_tests *.txt
 exclude BUILD.txt I18N_PROGRESS.txt TODO.txt
+exclude doc/security.txt doc/templating.txt
 
index 987dfe7071249eaccb6ccda635c58dea3b3599e5..dcfb826731a1a5ae8b0c1d24cb8ae2d9900d29d3 100644 (file)
@@ -3,8 +3,7 @@ STXTOHTML = -c "from docutils.core import publish;publish(writer_name='html')"
 
 SOURCE = announcement.txt customizing.txt developers.txt FAQ.txt features.txt \
     glossary.txt implementation.txt index.txt design.txt \
-    installation.txt security.txt upgrading.txt user_guide.txt \
-    maintenance.txt
+    installation.txt upgrading.txt user_guide.txt maintenance.txt
 
 COMPILED := $(SOURCE:.txt=.html)
 
index 8a6b1079a54dac2899627b997de4fd489481b751..047c29452e43d15d645900e952414a070fb2b7b4 100644 (file)
@@ -15,7 +15,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: __init__.py,v 1.19 2002-10-03 06:56:29 richard Exp $
+# $Id: __init__.py,v 1.20 2002-10-07 00:52:51 richard Exp $
 
 ''' Container for the hyperdb storage backend implementations.
 
@@ -46,7 +46,11 @@ try:
     import gadfly
     import gadfly.client
 except ImportError, message:
-    if str(message) != 'No module named gadfly': raise
+    if str(message) == 'No module named client':
+        # don't keep the old gadfly around
+        del gadfly
+    elif str(message) != 'No module named gadfly':
+        raise
 else:
     import back_gadfly
     gadfly = back_gadfly
index 19a94d7b3ccf26c51ca2f30e493f8815f2ea6ee0..d99094fc016a3fe67fc3ab3d17ef7853228d1587 100644 (file)
@@ -15,7 +15,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-#$Id: back_anydbm.py,v 1.87 2002-10-04 06:30:30 richard Exp $
+#$Id: back_anydbm.py,v 1.88 2002-10-07 00:52:51 richard Exp $
 '''
 This module defines a backend that saves the hyperdatabase in a database
 chosen by anydbm. It is guaranteed to always be available in python
@@ -1531,8 +1531,8 @@ class Class(hyperdb.Class):
         l.sort()
         return l
 
-    def filter(self, search_matches, filterspec, sort, group, 
-            num_re = re.compile('^\d+$')):
+    def filter(self, search_matches, filterspec, sort=(None,None),
+            group=(None,None), num_re = re.compile('^\d+$')):
         ''' Return a list of the ids of the active nodes in this class that
             match the 'filter' spec, sorted by the group spec and then the
             sort spec.
index f81dd04826b4e38432da7062747c691dc057f654..62dfee21a6551ce413413d7fd4e5be86bd8795f2 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: back_gadfly.py,v 1.28 2002-10-03 06:56:29 richard Exp $
+# $Id: back_gadfly.py,v 1.29 2002-10-07 00:52:51 richard Exp $
 ''' Gadlfy relational database hypderb backend.
 
 About Gadfly
@@ -137,7 +137,8 @@ class Database(rdbms_common.Database):
         return res
 
 class GadflyClass:
-    def filter(self, search_matches, filterspec, sort, group):
+    def filter(self, search_matches, filterspec, sort=(None,None),
+            group=(None,None)):
         ''' Gadfly doesn't have a LIKE predicate :(
         '''
         cn = self.classname
index 1cdcda30f4a2880d33a69e69580bf9f174fe4894..c8e220d8cfdbbafe927eb65854264e25580665ad 100755 (executable)
@@ -738,10 +738,10 @@ class Class:
         view = self.__getview()
         self.db.commit()
     # ---- end of ping's spec
-    def filter(self, search_matches, filterspec, sort, group):
+    def filter(self, search_matches, filterspec, sort=(None,None),
+            group=(None,None)):
         # search_matches is None or a set (dict of {nodeid: {propname:[nodeid,...]}})
         # filterspec is a dict {propname:value}
-        # sort and group are lists of propnames
         # sort and group are (dir, prop) where dir is '+', '-' or None
         #                    and prop is a prop name or None
 
index ced7ccaf31b56211202d91c24395e6806799052e..8839273f11243e08bb9e2ca1b07f48414e151321 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: rdbms_common.py,v 1.20 2002-10-03 06:56:29 richard Exp $
+# $Id: rdbms_common.py,v 1.21 2002-10-07 00:52:51 richard Exp $
 ''' Relational database (SQL) backend common code.
 
 Basics:
@@ -1708,7 +1708,8 @@ class Class(hyperdb.Class):
         '''
         return self.db.getnodeids(self.classname, retired=0)
 
-    def filter(self, search_matches, filterspec, sort, group):
+    def filter(self, search_matches, filterspec, sort=(None,None),
+            group=(None,None)):
         ''' Return a list of the ids of the active nodes in this class that
             match the 'filter' spec, sorted by the group spec and then the
             sort spec
index df85b0c85d596b753b84e39327bce2c1fa79c2c6..46167ebfaf52118a0ac38c5fca75d84fd10765af 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: client.py,v 1.49 2002-10-03 06:56:29 richard Exp $
+# $Id: client.py,v 1.50 2002-10-07 00:52:51 richard Exp $
 
 __doc__ = """
 WWW request handler (also used in the stand-alone server).
@@ -603,8 +603,8 @@ class Client:
         # re-open the database for real, using the user
         self.opendb(self.user)
 
-        # update the user's session
-        if self.session:
+        # if we have a session, update it
+        if hasattr(self, 'session'):
             self.db.sessions.set(self.session, user=self.user,
                 last_use=time.time())
         else:
index 221377c478b94bdcd8be2de04cd4b34ae1372b5e..56f7ab0cc06dfc590073e5b4942606151fb6e42a 100644 (file)
@@ -15,7 +15,7 @@
 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 # 
-# $Id: hyperdb.py,v 1.83 2002-10-03 06:56:29 richard Exp $
+# $Id: hyperdb.py,v 1.84 2002-10-07 00:52:51 richard Exp $
 
 """
 Hyperdatabase implementation, especially field types.
@@ -512,11 +512,20 @@ class Class:
         """
         raise NotImplementedError
 
-    def filter(self, search_matches, filterspec, sort, group, 
-            num_re = re.compile('^\d+$')):
+    def filter(self, search_matches, filterspec, sort=(None,None),
+            group=(None,None)):
         ''' Return a list of the ids of the active nodes in this class that
             match the 'filter' spec, sorted by the group spec and then the
-            sort spec
+            sort spec.
+
+            "filterspec" is {propname: value(s)}
+            "sort" and "group" are (dir, prop) where dir is '+', '-' or None
+                               and prop is a prop name or None
+            "search_matches" is {nodeid: marker}
+
+            The filter must match all properties specificed - but if the
+            property value to match is a list, any one of the values in the
+            list may match for that property to match.
         '''
         raise NotImplementedError
 
index 501da003ca21070f568fb94b37c76864d968ff23..9bb022949163fdd0a5e9c9a719e4420963d840f7 100644 (file)
@@ -73,7 +73,7 @@ are calling the create() method to create a new node). If an auditor raises
 an exception, the original message is bounced back to the sender with the
 explanatory message given in the exception. 
 
-$Id: mailgw.py,v 1.94 2002-10-03 06:56:29 richard Exp $
+$Id: mailgw.py,v 1.95 2002-10-07 00:52:51 richard Exp $
 '''
 
 import string, re, os, mimetools, cStringIO, smtplib, socket, binascii, quopri
@@ -859,8 +859,7 @@ def uidFromAddress(db, address, create=1):
     # try the user alternate addresses if possible
     props = db.user.getprops()
     if props.has_key('alternate_addresses'):
-        users = db.user.filter(None, {'alternate_addresses': address},
-            [], [])
+        users = db.user.filter(None, {'alternate_addresses': address})
         user = extractUserFromList(db.user, users)
         if user is not None: return user
 
index 72d7d380b0fac9c9220af2cdd59c922806d186e6..86f8444a6d8ae8d2d02f72633d7aff8831f4905a 100644 (file)
@@ -16,7 +16,7 @@
 # 
 """ HTTP Server that serves roundup.
 
-$Id: roundup_server.py,v 1.12 2002-09-23 06:48:35 richard Exp $
+$Id: roundup_server.py,v 1.13 2002-10-07 00:52:51 richard Exp $
 """
 
 # python version check
@@ -225,7 +225,18 @@ def daemonize(pidfile):
     os.dup2(devnull, 1)
     os.dup2(devnull, 2)
 
+def abspath(path):
+    ''' Make the given path an absolute path.
+
+        Code from Zope-Coders posting of 2002-10-06 by GvR.
+    '''
+    if not os.path.isabs(path):
+        path = os.path.join(os.getcwd(), path)
+    return os.path.normpath(path)
+
 def run():
+    ''' Script entry point - handle args and figure out what to to.
+    '''
     hostname = ''
     port = 8080
     pidfile = None
@@ -242,8 +253,8 @@ def run():
             if opt == '-n': hostname = arg
             elif opt == '-p': port = int(arg)
             elif opt == '-u': user = arg
-            elif opt == '-d': pidfile = arg
-            elif opt == '-l': logfile = arg
+            elif opt == '-d': pidfile = abspath(arg)
+            elif opt == '-l': logfile = abspath(arg)
             elif opt == '-h': usage()
 
         if hasattr(os, 'getuid'):