diff roundup/cgi_client.py @ 872:bd6211d39328

Saving, running & editing queries.
author Gordon B. McMillan <gmcm@users.sourceforge.net>
date Wed, 17 Jul 2002 12:39:11 +0000
parents d122204996cc
children de3da99a7c02
line wrap: on
line diff
--- a/roundup/cgi_client.py	Mon Jul 15 22:05:17 2002 +0000
+++ b/roundup/cgi_client.py	Wed Jul 17 12:39:11 2002 +0000
@@ -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.140 2002-07-14 23:17:15 richard Exp $
+# $Id: cgi_client.py,v 1.141 2002-07-17 12:39:10 gmcm Exp $
 
 __doc__ = """
 WWW request handler (also used in the stand-alone server).
@@ -193,6 +193,29 @@
                 _('Unassigned <a href="issue?assignedto=-1&status=-1,unread,deferred,chatting,need-eg,in-progress,testing,done-cbb&:sort=-activity&:filter=status,assignedto&:columns=id,activity,status,title,assignedto&:group=priority&show_customization=1">Issues</a>')
             ]
 
+        if userid:
+            # add any personal queries to the menu
+            try:
+                queries = self.db.getclass('query')
+            except KeyError:
+                # no query class
+                queries = self.instance.dbinit.Class(self.db,
+                                                    "query",
+                                                    klass=hyperdb.String(),
+                                                    name=hyperdb.String(),
+                                                    url=hyperdb.String())
+                queries.setkey('name')
+#queries.disableJournalling()
+            try:
+                qids = self.db.getclass('user').get(userid, 'queries')
+            except KeyError, e:
+                #self.db.getclass('user').addprop(queries=hyperdb.Multilink('query'))
+                qids = []
+            for qid in qids:
+                links.append('<a href=%s?%s>%s</a>' % (queries.get(qid, 'klass'),
+                                                       queries.get(qid, 'url'),
+                                                       queries.get(qid, 'name')))
+                
         # if they're logged in, include links to their information, and the
         # ability to add an issue
         if user_name not in ('', 'anonymous'):
@@ -222,7 +245,7 @@
         admin_links = ''
         if user_name == 'admin':
             links.append(_('<a href="list_classes">Class List</a>'))
-            links.append(_('<a href="user">User List</a>'))
+            links.append(_('<a href="user?:sort=username">User List</a>'))
             links.append(_('<a href="newuser">Add User</a>'))
 
         # add the search links
@@ -251,11 +274,14 @@
 <body bgcolor=#ffffff>
 %(message)s
 <table width=100%% border=0 cellspacing=0 cellpadding=2>
-<tr class="location-bar"><td><big><strong>%(title)s</strong></big></td>
-<td align=right valign=bottom>%(user_name)s</td></tr>
-<tr class="location-bar">
-<td align=left>%(links)s</td>
-<td align=right>%(user_info)s</td>
+ <tr class="location-bar">
+  <td><big><strong>%(title)s</strong></big></td>
+  <td align=right valign=bottom>%(user_name)s</td>
+ </tr>
+ <tr class="location-bar">
+  <td align=left>%(links)s</td>
+  <td align=right>%(user_info)s</td>
+ </tr>
 </table><br>
 ''')%locals())
 
@@ -330,14 +356,17 @@
             x.append('%s%s' % (desc, colnm))
         return x
     
-    def index_filterspec(self, filter):
+    def index_filterspec(self, filter, classname=None):
         ''' pull the index filter spec from the form
 
         Links and multilinks want to be lists - the rest are straight
         strings.
         '''
+        if classname is None:
+            classname = self.classname
+        klass = self.db.getclass(classname)
         filterspec = {}
-        props = self.db.classes[self.classname].getprops()
+        props = klass.getprops()
         for colnm in filter:
             widget = ':%s_fs' % colnm
             try:
@@ -486,6 +515,34 @@
         else:
             startwith = 0
 
+        if self.form.has_key('Query') and self.form['Query'].value == 'Save':
+            # format a query string
+            qd = {}
+            qd[':sort'] = ','.join(map(urllib.quote, sort))
+            qd[':group'] = ','.join(map(urllib.quote, group))
+            qd[':filter'] = ','.join(map(urllib.quote, filter))
+            qd[':columns'] = ','.join(map(urllib.quote, columns))
+            for k, l in filterspec.items():
+                qd[urllib.quote(k)] = ','.join(map(urllib.quote, l))
+            url = '&'.join([k+'='+v for k,v in qd.items()])
+            url += '&:pagesize=%s' % pagesize
+            if search_text:
+                url += '&search_text=%s' % search_text
+
+            # create a query
+            d = {}
+            d['name'] = self.form[':name'].value
+            d['klass'] = self.form[':classname'].value
+            d['url'] = url
+            qid = self.db.getclass('query').create(**d)
+
+            # and add it to the user's query multilink
+            uid = self.getuid()
+            usercl = self.db.getclass('user')
+            queries = usercl.get(uid, 'queries')
+            queries.append(qid)
+            usercl.set(uid, queries=queries)
+            
         index = htmltemplate.IndexTemplate(self, self.instance.TEMPLATES, cn)
         try:
             index.render(filterspec, search_text, filter, columns, sort, 
@@ -665,6 +722,56 @@
     showmsg = shownode
     searchissue = searchnode
 
+    def showquery(self):
+        queries = self.db.getclass(self.classname)
+        if self.form.keys():
+            sort = self.index_sort()
+            group = self.index_arg(':group')
+            filter = self.index_arg(':filter')
+            columns = self.index_arg(':columns')
+            filterspec = self.index_filterspec(filter, queries.get(self.nodeid, 'klass'))
+            if self.form.has_key('search_text'):
+                search_text = self.form['search_text'].value
+            else:
+                search_text = ''
+            if self.form.has_key(':pagesize'):
+                pagesize = int(self.form[':pagesize'].value)
+            else:
+                pagesize = 50
+            # format a query string
+            qd = {}
+            qd[':sort'] = ','.join(map(urllib.quote, sort))
+            qd[':group'] = ','.join(map(urllib.quote, group))
+            qd[':filter'] = ','.join(map(urllib.quote, filter))
+            qd[':columns'] = ','.join(map(urllib.quote, columns))
+            for k, l in filterspec.items():
+                qd[urllib.quote(k)] = ','.join(map(urllib.quote, l))
+            url = '&'.join([k+'='+v for k,v in qd.items()])
+            url += '&:pagesize=%s' % pagesize
+            if search_text:
+                url += '&search_text=%s' % search_text
+            qname = self.form['name'].value
+            chgd = []
+            if qname != queries.get(self.nodeid, 'name'):
+                chgd.append('name')
+            if url != queries.get(self.nodeid, 'url'):
+                chgd.append('url')
+            if chgd:
+                queries.set(self.nodeid, name=qname, url=url)
+                message = _('%(changes)s edited ok')%{'changes': ', '.join(chgd)}
+            else:
+                message = _('nothing changed')
+        else:
+            message = None
+        nm = queries.get(self.nodeid, 'name')
+        self.pagehead('%s: %s'%(self.classname.capitalize(), nm), message)
+
+        # use the template to display the item
+        item = htmltemplate.ItemTemplate(self, self.instance.TEMPLATES,
+            self.classname)
+        item.render(self.nodeid)
+        self.pagefoot()
+        
     def _changenode(self, props):
         ''' change the node based on the contents of the form
         '''
@@ -954,7 +1061,7 @@
 
         if self.user not in ('admin', node_user):
             raise Unauthorised
-
+        
         #
         # perform any editing
         #
@@ -1497,6 +1604,9 @@
 
 #
 # $Log: not supported by cvs2svn $
+# Revision 1.140  2002/07/14 23:17:15  richard
+# cleaned up structure
+#
 # Revision 1.139  2002/07/14 06:14:40  richard
 # Some more TODOs
 #

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