diff roundup/cgi/actions.py @ 2136:ee3cf6a44f29

queries on a per-user basis, and public queries [SF#891798] :) EditAction was confused about who "self" was Edit collision detection was broken for index-page edits
author Richard Jones <richard@users.sourceforge.net>
date Fri, 26 Mar 2004 04:50:51 +0000
parents 0884a0e4071e
children b29323f75718
line wrap: on
line diff
--- a/roundup/cgi/actions.py	Fri Mar 26 02:24:45 2004 +0000
+++ b/roundup/cgi/actions.py	Fri Mar 26 04:50:51 2004 +0000
@@ -1,4 +1,4 @@
-#$Id: actions.py,v 1.16 2004-03-26 00:46:33 richard Exp $
+#$Id: actions.py,v 1.17 2004-03-26 04:50:50 richard Exp $
 
 import re, cgi, StringIO, urllib, Cookie, time, random
 
@@ -134,14 +134,36 @@
             # query string.
             url = req.indexargs_href('', {})[1:]
 
-            # handle editing an existing query
-            try:
-                qid = self.db.query.lookup(queryname)
-                self.db.query.set(qid, klass=self.classname, url=url)
-            except KeyError:
-                # create a query
-                qid = self.db.query.create(name=queryname,
-                    klass=self.classname, url=url)
+            key = self.db.query.getkey()
+            if key:
+                # edit the old way, only one query per name
+                try:
+                    qid = self.db.query.lookup(queryname)
+                    self.db.query.set(qid, klass=self.classname, url=url)
+                except KeyError:
+                    # create a query
+                    qid = self.db.query.create(name=queryname,
+                        klass=self.classname, url=url)
+            else:
+                # edit the new way, query name not a key any more
+                # see if we match an existing private query
+                uid = self.db.getuid()
+                qids = self.db.query.filter({}, {'name': queryname,
+                        'private_for': uid})
+                if not qids:
+                    # ok, so there's not a private query for the current user
+                    # - see if there's a public one created by them
+                    qids = self.db.query.filter({}, {'name': queryname,
+                        'private_for': -1, 'creator': uid})
+
+                if qids:
+                    # edit query
+                    qid = qids[0]
+                    self.db.query.set(qid, klass=self.classname, url=url)
+                else:
+                    # create a query
+                    qid = self.db.query.create(name=queryname,
+                        klass=self.classname, url=url, private_for=uid)
 
             # and add it to the user's query multilink
             queries = self.db.user.get(self.userid, 'queries')
@@ -435,23 +457,21 @@
         return cl.create(**props)
 
 class EditItemAction(_EditAction):
-    def lastUserActivity(self):
+    def lastUserActvity(self):
         if self.form.has_key(':lastactivity'):
-            return date.Date(self.form[':lastactivity'].value)
+            user_actvity = date.Date(self.form[':lastactivity'].value)
         elif self.form.has_key('@lastactivity'):
-            return date.Date(self.form['@lastactivity'].value)
+            user_actvity = date.Date(self.form['@lastactivity'].value)
         else:
             return None
 
     def lastNodeActivity(self):
         cl = getattr(self.client.db, self.classname)
-        return cl.get(self.nodeid, 'activity')
+        node_activity = cl.get(self.nodeid, 'activity')
 
-    def detectCollision(self, userActivity, nodeActivity):
-        # Result from lastUserActivity may be None. If it is, assume there's no
-        # conflict, or at least not one we can detect.
-        if userActivity:
-            return userActivity < nodeActivity
+    def detectCollision(self, user_actvity, node_activity):
+        if user_activity:
+            return user_activity < node_activity
 
     def handleCollision(self):
         self.client.template = 'collision'
@@ -462,7 +482,9 @@
         See parsePropsFromForm and _editnodes for special variables.
 
         """
-        if self.detectCollision(self.lastUserActivity(), self.lastNodeActivity()):
+        user_activity = self.lastUserActvity()
+        if user_activity and self.detectCollision(user_activity,
+                self.lastNodeActivity()):
             self.handleCollision()
             return
 
@@ -488,7 +510,7 @@
         url += '?@ok_message=%s&@template=%s'%(urllib.quote(message),
             urllib.quote(self.template))
         if self.nodeid is None:
-            req = templating.HTMLRequest(self)
+            req = templating.HTMLRequest(self.client)
             url += '&' + req.indexargs_href('', {})[1:]
         raise Redirect, url
 

Roundup Issue Tracker: http://roundup-tracker.org/