|
15 | 15 | # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE, |
16 | 16 | # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
17 | 17 | # |
18 | | -# $Id: cgi_client.py,v 1.140 2002-07-14 23:17:15 richard Exp $ |
| 18 | +# $Id: cgi_client.py,v 1.141 2002-07-17 12:39:10 gmcm Exp $ |
19 | 19 |
|
20 | 20 | __doc__ = """ |
21 | 21 | WWW request handler (also used in the stand-alone server). |
@@ -193,6 +193,29 @@ def pagehead(self, title, message=None): |
193 | 193 | _('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>') |
194 | 194 | ] |
195 | 195 |
|
| 196 | + if userid: |
| 197 | + # add any personal queries to the menu |
| 198 | + try: |
| 199 | + queries = self.db.getclass('query') |
| 200 | + except KeyError: |
| 201 | + # no query class |
| 202 | + queries = self.instance.dbinit.Class(self.db, |
| 203 | + "query", |
| 204 | + klass=hyperdb.String(), |
| 205 | + name=hyperdb.String(), |
| 206 | + url=hyperdb.String()) |
| 207 | + queries.setkey('name') |
| 208 | +#queries.disableJournalling() |
| 209 | + try: |
| 210 | + qids = self.db.getclass('user').get(userid, 'queries') |
| 211 | + except KeyError, e: |
| 212 | + #self.db.getclass('user').addprop(queries=hyperdb.Multilink('query')) |
| 213 | + qids = [] |
| 214 | + for qid in qids: |
| 215 | + links.append('<a href=%s?%s>%s</a>' % (queries.get(qid, 'klass'), |
| 216 | + queries.get(qid, 'url'), |
| 217 | + queries.get(qid, 'name'))) |
| 218 | + |
196 | 219 | # if they're logged in, include links to their information, and the |
197 | 220 | # ability to add an issue |
198 | 221 | if user_name not in ('', 'anonymous'): |
@@ -222,7 +245,7 @@ def pagehead(self, title, message=None): |
222 | 245 | admin_links = '' |
223 | 246 | if user_name == 'admin': |
224 | 247 | links.append(_('<a href="list_classes">Class List</a>')) |
225 | | - links.append(_('<a href="user">User List</a>')) |
| 248 | + links.append(_('<a href="user?:sort=username">User List</a>')) |
226 | 249 | links.append(_('<a href="newuser">Add User</a>')) |
227 | 250 |
|
228 | 251 | # add the search links |
@@ -251,11 +274,14 @@ def pagehead(self, title, message=None): |
251 | 274 | <body bgcolor=#ffffff> |
252 | 275 | %(message)s |
253 | 276 | <table width=100%% border=0 cellspacing=0 cellpadding=2> |
254 | | -<tr class="location-bar"><td><big><strong>%(title)s</strong></big></td> |
255 | | -<td align=right valign=bottom>%(user_name)s</td></tr> |
256 | | -<tr class="location-bar"> |
257 | | -<td align=left>%(links)s</td> |
258 | | -<td align=right>%(user_info)s</td> |
| 277 | + <tr class="location-bar"> |
| 278 | + <td><big><strong>%(title)s</strong></big></td> |
| 279 | + <td align=right valign=bottom>%(user_name)s</td> |
| 280 | + </tr> |
| 281 | + <tr class="location-bar"> |
| 282 | + <td align=left>%(links)s</td> |
| 283 | + <td align=right>%(user_info)s</td> |
| 284 | + </tr> |
259 | 285 | </table><br> |
260 | 286 | ''')%locals()) |
261 | 287 |
|
@@ -330,14 +356,17 @@ def index_sort(self): |
330 | 356 | x.append('%s%s' % (desc, colnm)) |
331 | 357 | return x |
332 | 358 |
|
333 | | - def index_filterspec(self, filter): |
| 359 | + def index_filterspec(self, filter, classname=None): |
334 | 360 | ''' pull the index filter spec from the form |
335 | 361 |
|
336 | 362 | Links and multilinks want to be lists - the rest are straight |
337 | 363 | strings. |
338 | 364 | ''' |
| 365 | + if classname is None: |
| 366 | + classname = self.classname |
| 367 | + klass = self.db.getclass(classname) |
339 | 368 | filterspec = {} |
340 | | - props = self.db.classes[self.classname].getprops() |
| 369 | + props = klass.getprops() |
341 | 370 | for colnm in filter: |
342 | 371 | widget = ':%s_fs' % colnm |
343 | 372 | try: |
@@ -486,6 +515,34 @@ def list(self, sort=None, group=None, filter=None, columns=None, |
486 | 515 | else: |
487 | 516 | startwith = 0 |
488 | 517 |
|
| 518 | + if self.form.has_key('Query') and self.form['Query'].value == 'Save': |
| 519 | + # format a query string |
| 520 | + qd = {} |
| 521 | + qd[':sort'] = ','.join(map(urllib.quote, sort)) |
| 522 | + qd[':group'] = ','.join(map(urllib.quote, group)) |
| 523 | + qd[':filter'] = ','.join(map(urllib.quote, filter)) |
| 524 | + qd[':columns'] = ','.join(map(urllib.quote, columns)) |
| 525 | + for k, l in filterspec.items(): |
| 526 | + qd[urllib.quote(k)] = ','.join(map(urllib.quote, l)) |
| 527 | + url = '&'.join([k+'='+v for k,v in qd.items()]) |
| 528 | + url += '&:pagesize=%s' % pagesize |
| 529 | + if search_text: |
| 530 | + url += '&search_text=%s' % search_text |
| 531 | + |
| 532 | + # create a query |
| 533 | + d = {} |
| 534 | + d['name'] = self.form[':name'].value |
| 535 | + d['klass'] = self.form[':classname'].value |
| 536 | + d['url'] = url |
| 537 | + qid = self.db.getclass('query').create(**d) |
| 538 | + |
| 539 | + # and add it to the user's query multilink |
| 540 | + uid = self.getuid() |
| 541 | + usercl = self.db.getclass('user') |
| 542 | + queries = usercl.get(uid, 'queries') |
| 543 | + queries.append(qid) |
| 544 | + usercl.set(uid, queries=queries) |
| 545 | + |
489 | 546 | index = htmltemplate.IndexTemplate(self, self.instance.TEMPLATES, cn) |
490 | 547 | try: |
491 | 548 | index.render(filterspec, search_text, filter, columns, sort, |
@@ -665,6 +722,56 @@ def shownode(self, message=None, num_re=re.compile('^\d+$')): |
665 | 722 | showmsg = shownode |
666 | 723 | searchissue = searchnode |
667 | 724 |
|
| 725 | + def showquery(self): |
| 726 | + queries = self.db.getclass(self.classname) |
| 727 | + if self.form.keys(): |
| 728 | + sort = self.index_sort() |
| 729 | + group = self.index_arg(':group') |
| 730 | + filter = self.index_arg(':filter') |
| 731 | + columns = self.index_arg(':columns') |
| 732 | + filterspec = self.index_filterspec(filter, queries.get(self.nodeid, 'klass')) |
| 733 | + if self.form.has_key('search_text'): |
| 734 | + search_text = self.form['search_text'].value |
| 735 | + else: |
| 736 | + search_text = '' |
| 737 | + if self.form.has_key(':pagesize'): |
| 738 | + pagesize = int(self.form[':pagesize'].value) |
| 739 | + else: |
| 740 | + pagesize = 50 |
| 741 | + # format a query string |
| 742 | + qd = {} |
| 743 | + qd[':sort'] = ','.join(map(urllib.quote, sort)) |
| 744 | + qd[':group'] = ','.join(map(urllib.quote, group)) |
| 745 | + qd[':filter'] = ','.join(map(urllib.quote, filter)) |
| 746 | + qd[':columns'] = ','.join(map(urllib.quote, columns)) |
| 747 | + for k, l in filterspec.items(): |
| 748 | + qd[urllib.quote(k)] = ','.join(map(urllib.quote, l)) |
| 749 | + url = '&'.join([k+'='+v for k,v in qd.items()]) |
| 750 | + url += '&:pagesize=%s' % pagesize |
| 751 | + if search_text: |
| 752 | + url += '&search_text=%s' % search_text |
| 753 | + qname = self.form['name'].value |
| 754 | + chgd = [] |
| 755 | + if qname != queries.get(self.nodeid, 'name'): |
| 756 | + chgd.append('name') |
| 757 | + if url != queries.get(self.nodeid, 'url'): |
| 758 | + chgd.append('url') |
| 759 | + if chgd: |
| 760 | + queries.set(self.nodeid, name=qname, url=url) |
| 761 | + message = _('%(changes)s edited ok')%{'changes': ', '.join(chgd)} |
| 762 | + else: |
| 763 | + message = _('nothing changed') |
| 764 | + else: |
| 765 | + message = None |
| 766 | + nm = queries.get(self.nodeid, 'name') |
| 767 | + self.pagehead('%s: %s'%(self.classname.capitalize(), nm), message) |
| 768 | + |
| 769 | + # use the template to display the item |
| 770 | + item = htmltemplate.ItemTemplate(self, self.instance.TEMPLATES, |
| 771 | + self.classname) |
| 772 | + item.render(self.nodeid) |
| 773 | + self.pagefoot() |
| 774 | + |
668 | 775 | def _changenode(self, props): |
669 | 776 | ''' change the node based on the contents of the form |
670 | 777 | ''' |
@@ -954,7 +1061,7 @@ def showuser(self, message=None, num_re=re.compile('^\d+$')): |
954 | 1061 |
|
955 | 1062 | if self.user not in ('admin', node_user): |
956 | 1063 | raise Unauthorised |
957 | | - |
| 1064 | + |
958 | 1065 | # |
959 | 1066 | # perform any editing |
960 | 1067 | # |
@@ -1497,6 +1604,9 @@ def parsePropsFromForm(db, cl, form, nodeid=0, num_re=re.compile('^\d+$')): |
1497 | 1604 |
|
1498 | 1605 | # |
1499 | 1606 | # $Log: not supported by cvs2svn $ |
| 1607 | +# Revision 1.140 2002/07/14 23:17:15 richard |
| 1608 | +# cleaned up structure |
| 1609 | +# |
1500 | 1610 | # Revision 1.139 2002/07/14 06:14:40 richard |
1501 | 1611 | # Some more TODOs |
1502 | 1612 | # |
|
0 commit comments