Changeset 1088
- Timestamp:
- 08/06/06 11:36:35 (2 years ago)
- Files:
-
- discussionplugin/0.9/tracdiscussion/api.py (modified) (19 diffs)
- discussionplugin/0.9/tracdiscussion/htdocs/css/admin.css (modified) (1 diff)
- discussionplugin/0.9/tracdiscussion/htdocs/css/discussion.css (modified) (6 diffs)
- discussionplugin/0.9/tracdiscussion/templates/admin-forum-list.cs (modified) (1 diff)
- discussionplugin/0.9/tracdiscussion/templates/admin-group-list.cs (modified) (1 diff)
- discussionplugin/0.9/tracdiscussion/templates/discussion-header.cs (modified) (1 diff)
- discussionplugin/0.9/tracdiscussion/templates/forum-list.cs (modified) (2 diffs)
- discussionplugin/0.9/tracdiscussion/templates/message-list.cs (modified) (5 diffs)
- discussionplugin/0.9/tracdiscussion/templates/topic-list.cs (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
discussionplugin/0.9/tracdiscussion/api.py
r1077 r1088 136 136 elif action == 'delete': 137 137 return ['message-delete', 'message-list'] 138 elif action == 'set-display': 139 return ['message-set-display', 'message-list'] 138 140 else: 139 141 return ['message-list'] … … 157 159 elif action == 'delete': 158 160 return ['message-delete', 'message-list'] 161 elif action == 'set-display': 162 return ['message-set-display', 'message-list'] 159 163 else: 160 164 return ['message-list'] … … 182 186 self.req.hdf['discussion.no_display'] = True 183 187 return ['topic-delete', 'message-list'] 188 elif action == 'set-display': 189 return ['message-set-display', 'message-list'] 184 190 else: 185 191 return ['message-list'] … … 207 213 elif action == 'post-move': 208 214 return ['topic-post-move', 'topic-list'] 215 elif action == 'set-display': 216 return ['message-set-display', 'message-list'] 209 217 else: 210 218 return ['message-list'] … … 279 287 self.req.perm.assert_permission('DISCUSSION_ADMIN') 280 288 289 # Get form values 290 order = self.req.args.get('order') or 'id' 291 desc = self.req.args.get('desc') 292 293 # Prepare ORDER BY statement 294 order_by = 'ORDER BY ' + order 295 if desc: 296 order_by = order_by + ' DESC' 297 else: 298 order_by = order_by + ' ASC' 299 281 300 # Display groups. 301 self.req.hdf['discussion.order'] = order 302 self.req.hdf['discussion.desc'] = desc 282 303 if group: 283 304 self.req.hdf['discussion.name'] = group['name'] 284 305 self.req.hdf['discussion.description'] = group['description'] 285 self.req.hdf['discussion.groups'] = self.get_groups( )306 self.req.hdf['discussion.groups'] = self.get_groups(order_by) 286 307 287 308 elif mode == 'group-add': … … 322 343 # Delete selected groups. 323 344 if selection: 324 for group in selection:325 self.delete_group(group )345 for group_id in selection: 346 self.delete_group(group_id) 326 347 327 348 elif mode == 'forum-list': 328 349 self.req.perm.assert_permission('DISCUSSION_VIEW') 329 350 351 # Get form values 352 order = self.req.args.get('order') or 'id' 353 desc = self.req.args.get('desc') 354 355 # Prepare ORDER BY statement 356 order_by = 'ORDER BY ' + order 357 if desc: 358 order_by = order_by + ' DESC' 359 else: 360 order_by = order_by + ' ASC' 361 330 362 # Display forums. 363 self.req.hdf['discussion.order'] = order 364 self.req.hdf['discussion.desc'] = desc 331 365 self.req.hdf['discussion.groups'] = self.get_groups() 332 self.req.hdf['discussion.forums'] = self.get_forums( )366 self.req.hdf['discussion.forums'] = self.get_forums(order_by) 333 367 334 368 elif mode == 'admin-forum-list': 335 369 self.req.perm.assert_permission('DISCUSSION_ADMIN') 336 370 371 # Get form values 372 order = self.req.args.get('order') or 'id' 373 desc = self.req.args.get('desc') 374 375 # Prepare ORDER BY statement 376 order_by = 'ORDER BY ' + order 377 if desc: 378 order_by = order_by + ' DESC' 379 else: 380 order_by = order_by + ' ASC' 381 337 382 # Display forums. 383 self.req.hdf['discussion.order'] = order 384 self.req.hdf['discussion.desc'] = desc 385 self.log.debug(forum) 338 386 if forum: 339 387 self.req.hdf['discussion.name'] = forum['name'] … … 344 392 self.req.hdf['discussion.users'] = self.get_users() 345 393 self.req.hdf['discussion.groups'] = self.get_groups() 346 self.req.hdf['discussion.forums'] = self.get_forums( )394 self.req.hdf['discussion.forums'] = self.get_forums(order_by) 347 395 348 396 elif mode == 'forum-add': … … 407 455 # Delete selected forums. 408 456 if selection: 409 for forum in selection:410 self.delete_forum(forum )457 for forum_id in selection: 458 self.delete_forum(forum_id) 411 459 412 460 elif mode == 'topic-list': 413 461 self.req.perm.assert_permission('DISCUSSION_VIEW') 414 462 463 # Get form values 464 order = self.req.args.get('order') or 'id' 465 desc = self.req.args.get('desc') 466 467 # Prepare ORDER BY statement 468 order_by = 'ORDER BY ' + order 469 if desc: 470 order_by = order_by + ' DESC' 471 else: 472 order_by = order_by + ' ASC' 473 415 474 # Display topics. 416 self.req.hdf['discussion.topics'] = self.get_topics(forum['id']) 475 self.req.hdf['discussion.order'] = order 476 self.req.hdf['discussion.desc'] = desc 477 self.req.hdf['discussion.topics'] = self.get_topics(forum['id'], 478 order_by) 417 479 418 480 elif mode == 'topic-add': … … 513 575 new_body = Markup(self.req.args.get('body')) 514 576 515 # Display message list. 577 # Get time when topic was visited from session. 578 visited = eval(self.req.session.get('visited-topics') or '{}') 579 self.log.debug(visited) 580 if visited.has_key(topic['id']): 581 visit_time = int(visited[topic['id']]) 582 else: 583 visit_time = 0 584 585 # Update this topic visit time and save to session. 586 visited[topic['id']] = int(time.time()) 587 self.req.session['visited-topics'] = str(visited) 588 589 # Mark new topic. 590 if int(topic['time']) > visit_time: 591 topic['new'] = True 592 593 # Prepare display of topic 516 594 if new_author: 517 595 self.req.hdf['discussion.author'] = wiki_to_oneliner( … … 523 601 self.req.hdf['discussion.body'] = wiki_to_html(new_body, 524 602 self.env, self.req) 525 self.req.hdf['discussion.messages'] = self.get_messages(topic['id']) 603 604 # Prepare display of messages 605 display = self.req.session.get('message-list-display') 606 self.req.hdf['discussion.display'] = display 607 if display == 'flat-asc': 608 self.req.hdf['discussion.messages'] = self.get_flat_messages( 609 topic['id'], visit_time) 610 elif display == 'flat-desc': 611 self.req.hdf['discussion.messages'] = self.get_flat_messages( 612 topic['id'], visit_time, 'ORDER BY time DESC') 613 else: 614 self.req.hdf['discussion.messages'] = self.get_messages( 615 topic['id'], visit_time) 526 616 527 617 elif mode == 'message-quote': … … 546 636 new_author, new_body) 547 637 else: 548 self.add_message(forum['id'], topic['id'], '-1', new_author, new_body) 638 self.add_message(forum['id'], topic['id'], '-1', new_author, 639 new_body) 549 640 550 641 elif mode == 'message-edit': … … 576 667 # Delete message. 577 668 self.delete_message(message['id']) 669 670 elif mode == 'message-set-display': 671 self.req.perm.assert_permission('DISCUSSION_VIEW') 672 673 # Get form values 674 display = self.req.args.get('display') 675 676 # Set message list display mode to session 677 self.req.session['message-list-display'] = display 578 678 579 679 # Get one item functions … … 686 786 # Get list functions 687 787 688 def get_groups(self ):788 def get_groups(self, order_by = 'ORDER BY id ASC'): 689 789 # Get count of forums without group 690 790 sql = "SELECT COUNT(id) FROM forum WHERE forum_group = 0" … … 700 800 columns = ('id', 'name', 'description', 'forums') 701 801 sql = "SELECT id, name, description, (SELECT COUNT(id) FROM forum f" \ 702 " WHERE f.forum_group = forum_group.id) FROM forum_group "802 " WHERE f.forum_group = forum_group.id) FROM forum_group " + order_by 703 803 self.log.debug(sql) 704 804 self.cursor.execute(sql) … … 710 810 return groups 711 811 712 def get_forums(self ):812 def get_forums(self, order_by = 'ORDER BY subject ASC'): 713 813 columns = ('id', 'name', 'author', 'time', 'moderators', 'group', 714 814 'subject', 'description', 'topics', 'replies', 'lastreply', … … 716 816 sql = "SELECT id, name, author, time, moderators, forum_group," \ 717 817 " subject, description, (SELECT COUNT(id) FROM topic t WHERE" \ 718 " t.forum = forum.id), (SELECT COUNT(id) FROM message m WHERE" \ 719 " m.forum = forum.id), (SELECT MAX(time) FROM message m WHERE" \ 720 " m.forum = forum.id), (SELECT MAX(time) FROM topic t WHERE" \ 721 " t.forum = forum.id) FROM forum ORDER BY subject" 818 " t.forum = forum.id) AS topics, (SELECT COUNT(id) FROM message m" \ 819 " WHERE m.forum = forum.id) AS replies, (SELECT MAX(time) FROM" \ 820 " message m WHERE m.forum = forum.id) AS lasttopic, (SELECT" \ 821 " MAX(time) FROM topic t WHERE t.forum = forum.id) AS lastreply" \ 822 " FROM forum " + order_by 722 823 self.log.debug(sql) 723 824 self.cursor.execute(sql) … … 739 840 return forums 740 841 741 def get_topics(self, forum ):842 def get_topics(self, forum, order_by = 'ORDER BY time ASC'): 742 843 columns = ('id', 'forum', 'time', 'subject', 'body', 'author', 743 844 'replies', 'lastreply') 744 845 sql = "SELECT id, forum, time, subject, body, author, (SELECT" \ 745 " COUNT(id) FROM message m WHERE m.topic = topic.id) , (SELECT" \746 " MAX(time) FROM message m WHERE m.topic = topic.id) FROM topic" \747 " WHERE forum = %s ORDER BY time"846 " COUNT(id) FROM message m WHERE m.topic = topic.id) AS replies," \ 847 " (SELECT MAX(time) FROM message m WHERE m.topic = topic.id) AS" \ 848 " lastreply FROM topic WHERE forum = %s " + order_by 748 849 self.log.debug(sql % (forum,)) 749 850 self.cursor.execute(sql, (forum,)) … … 761 862 return topics 762 863 763 def get_messages(self, topic ):864 def get_messages(self, topic, time, order_by = 'ORDER BY time ASC'): 764 865 columns = ('id', 'replyto', 'time', 'author', 'body') 765 866 sql = "SELECT id, replyto, time, author, body FROM message WHERE" \ 766 " topic = %s ORDER BY time"867 " topic = %s " + order_by 767 868 self.log.debug(sql % (topic,)) 768 869 self.cursor.execute(sql, (topic,)) 769 770 870 messagemap = {} 771 871 messages = [] 772 773 872 for row in self.cursor: 774 873 row = dict(zip(columns, row)) 775 874 row['author'] = wiki_to_oneliner(row['author'], self.env) 776 875 row['body'] = wiki_to_html(row['body'], self.env, self.req) 876 if int(row['time']) > time: 877 row['new'] = True 777 878 row['time'] = format_datetime(row['time']) 778 879 messagemap[row['id']] = row … … 791 892 parent['replies'] = [message] 792 893 return messages; 894 895 def get_flat_messages(self, topic, time, order_by = 'ORDER BY time ASC'): 896 columns = ('id', 'replyto', 'time', 'author', 'body') 897 sql = "SELECT id, replyto, time, author, body FROM message WHERE" \ 898 " topic = %s " + order_by 899 self.log.debug(sql % (topic,)) 900 self.cursor.execute(sql, (topic,)) 901 messages = [] 902 for row in self.cursor: 903 row = dict(zip(columns, row)) 904 row['author'] = wiki_to_oneliner(row['author'], self.env) 905 row['body'] = wiki_to_html(row['body'], self.env, self.req) 906 if int(row['time']) > time: 907 row['new'] = True 908 row['time'] = format_datetime(row['time']) 909 messages.append(row) 910 return messages 793 911 794 912 def get_users(self): discussionplugin/0.9/tracdiscussion/htdocs/css/admin.css
r1072 r1088 21 21 } 22 22 23 .listing td.id, .listing td.moderators, .listing td. group23 .listing td.id, .listing td.moderators, .listing td.forum_group 24 24 { 25 25 text-align: center; discussionplugin/0.9/tracdiscussion/htdocs/css/discussion.css
r1077 r1088 23 23 24 24 .forum-list td.id, .forum-list td.moderators, .forum-list td.lasttopic, 25 .forum-list td.lastreply, .forum-list td. founded, .forum-list td.topics,25 .forum-list td.lastreply, .forum-list td.time, .forum-list td.topics, 26 26 .forum-list td.replies 27 27 { … … 53 53 /* Topic list */ 54 54 .topic-list td.id, .topic-list td.author, .topic-list td.lastreply, 55 .topic-list td. founded, .topic-list td.replies55 .topic-list td.time, .topic-list td.replies 56 56 { 57 57 text-align: center; … … 63 63 } 64 64 65 .topic-add form.add_form 66 { 67 margin: 1em; 68 } 69 65 70 /* Message list */ 66 71 .message-list div.topic … … 69 74 margin-bottom: 0em; 70 75 border: 1px solid #d7d7d7; 76 } 77 78 .message-list div.topic.new 79 { 80 border: 2px solid #b00; 71 81 } 72 82 … … 105 115 border-left: 1px solid #d7d7d7; 106 116 border-bottom: 1px solid #d7d7d7; 117 } 118 119 .message-list div.replies.new 120 { 121 border-right: 2px solid #b00; 122 border-left: 2px solid #b00; 123 border-bottom: 2px solid #b00; 107 124 } 108 125 … … 162 179 border: 1px dashed #b00; 163 180 } 181 182 .message-list div.replies li.new div.body 183 { 184 border: 2px solid #b00; 185 } 186 187 .message-list div.set-display 188 { 189 text-align: center; 190 margin-top: 2em; 191 } 192 193 .message-list div.set-display a 194 { 195 margin: 0.5em; 196 } discussionplugin/0.9/tracdiscussion/templates/admin-forum-list.cs
r1072 r1088 121 121 <tr> 122 122 <th class="sel"> </th> 123 < th class="id">ID</th>124 < th class="name">Name</th>125 < th class="subject">Subject</th>126 < th class="description">Description</th>127 < th class="moderators">Moderators</th>123 <?cs call:sortable_th(discussion.order, discussion.desc, 'id', 'ID', discussion.href + '/forum' + '?') ?> 124 <?cs call:sortable_th(discussion.order, discussion.desc, 'name', 'Name', discussion.href + '/forum' + '?') ?> 125 <?cs call:sortable_th(discussion.order, discussion.desc, 'subject', 'Subject', discussion.href + '/forum' + '?') ?> 126 <?cs call:sortable_th(discussion.order, discussion.desc, 'description', 'Description', discussion.href + '/forum' + '?') ?> 127 <?cs call:sortable_th(discussion.order, discussion.desc, 'moderators', 'Moderators', discussion.href + '/forum' + '?') ?> 128 128 <?cs if:discussion.groups.1.id ?> 129 < th class="group">Group</th>129 <?cs call:sortable_th(discussion.order, discussion.desc, 'forum_group', 'Group', discussion.href + '/forum' + '?') ?> 130 130 <?cs /if ?> 131 131 </tr> discussionplugin/0.9/tracdiscussion/templates/admin-group-list.cs
r1072 r1088 51 51 <tr> 52 52 <th class="sel"> </th> 53 < th class="id">ID</th>54 < th class="name">Name</th>55 < th class="description">Description</th>53 <?cs call:sortable_th(discussion.order, discussion.desc, 'id', 'ID', discussion.href + '/group' + '?') ?> 54 <?cs call:sortable_th(discussion.order, discussion.desc, 'name', 'Name', discussion.href + '/group' + '?') ?> 55 <?cs call:sortable_th(discussion.order, discussion.desc, 'description', 'Description', discussion.href + '/group' + '?') ?> 56 56 </tr> 57 57 </thead> discussionplugin/0.9/tracdiscussion/templates/discussion-header.cs
r1066 r1088 1 1 <?cs include "header.cs" ?> 2 <?cs include "macros.cs" ?>3 2 4 3 <div id="ctxtnav" class="nav"> discussionplugin/0.9/tracdiscussion/templates/forum-list.cs
r1071 r1088 1 <?cs include "macros.cs" ?> 2 1 3 <?cs def:display_group(group, forums) ?> 2 4 <table class="listing"> … … 11 13 <?cs /if ?> 12 14 <tr> 13 < th class="id">ID</th>14 < th class="subject">Forum</th>15 < th class="moderators">Moderators</th>16 < th class="lasttopic">Last Topic</th>17 < th class="lastreply">Last Reply</th>18 < th class="founded">Founded</th>19 < th class="topics">Topics</th>20 < th class="replies">Replies</th>15 <?cs call:sortable_th(discussion.order, discussion.desc, 'id', 'ID', discussion.href + '?') ?> 16 <?cs call:sortable_th(discussion.order, discussion.desc, 'subject', 'Forum', discussion.href + '?') ?> 17 <?cs call:sortable_th(discussion.order, discussion.desc, 'moderators', 'Moderators', discussion.href + '?') ?> 18 <?cs call:sortable_th(discussion.order, discussion.desc, 'lasttopic', 'Last Topic', discussion.href + '?') ?> 19 <?cs call:sortable_th(discussion.order, discussion.desc, 'lastreply', 'Last Reply', discussion.href + '?') ?> 20 <?cs call:sortable_th(discussion.order, discussion.desc, 'time', 'Founded', discussion.href + '?') ?> 21 <?cs call:sortable_th(discussion.order, discussion.desc, 'topics', 'Topics', discussion.href + '?') ?> 22 <?cs call:sortable_th(discussion.order, discussion.desc, 'replies', 'Replies', discussion.href + '?') ?> 21 23 </tr> 22 24 </thead> discussionplugin/0.9/tracdiscussion/templates/message-list.cs
r1077 r1088 83 83 <?cs /def ?> 84 84 85 <?cs def:display_set_display() ?> 86 <div class="set-display"> 87 <a href="<?cs var:discussion.href ?>?discussion_action=set-display;display=tree">Tree View</a> 88 <a href="<?cs var:discussion.href ?>?discussion_action=set-display;display=flat-desc">Flat View (newer first)</a> 89 <a href="<?cs var:discussion.href ?>?discussion_action=set-display;display=flat-asc">Flat View (older first)</a> 90 </div> 91 <?cs /def ?> 92 85 93 <?cs def:display_topic(messages) ?> 86 94 <?cs each:message = messages ?> 87 <li >95 <li <?cs if:message.new ?>class="new"<?cs /if ?>> 88 96 <a name="<?cs var:message.id ?>"></a> 89 97 <div class="id"> … … 121 129 <?cs /if ?> 122 130 </li> 123 <?cs if:message.replies.0.id || args.discussion_action && ( args.discussion_action != 'delete') && (args.discussion_action != 'edit') && (args.discussion_action != 'post-edit') ?>131 <?cs if:message.replies.0.id || args.discussion_action && ((args.discussion_action == 'add') || (args.discussion_action == 'quote') || (args.discussion_action == 'post-add')) ?> 124 132 <ul> 125 133 <?cs if:message.replies.0.id ?> 126 134 <?cs call:display_topic(message.replies) ?> 127 135 <?cs /if ?> 128 <?cs if:(args.message == message.id) && !args.submit && args.discussion_action && (args.discussion_action != "delete") && (args.discussion_action != 'edit') && (args.discussion_action != 'post-edit') ?>136 <?cs if:(args.message == message.id) && !args.submit && (args.discussion_action && (args.discussion_action == 'add') || (args.discussion_action == 'quote') || (args.discussion_action == 'post-add')) ?> 129 137 <?cs if:args.preview ?> 130 138 <?cs call:display_preview() ?> … … 150 158 151 159 <?cs if:trac.acl.DISCUSSION_VIEW ?> 152 <a name="-1"></a>153 160 <?cs if:!discussion.no_display && discussion.topic.id ?> 154 <div class="topic"> 161 <?cs call:display_set_display() ?> 162 <a name="-1"></a> 163 <div class="topic <?cs if:discussion.topic.new ?>new<?cs /if ?>"> 155 164 <div class="header"> 156 165 <div class="subject"> … … 190 199 <?cs /if ?> 191 200 </div> 192 <?cs if:discussion.messages.0.id || args.discussion_action && ( args.discussion_action != "delete") && (args.discussion_action != 'edit') && (args.discussion_action != 'post-edit') ?>193 <div class="replies ">201 <?cs if:discussion.messages.0.id || args.discussion_action && ((args.discussion_action == 'add') || (args.discussion_action == 'quote') || (args.discussion_action == 'post-add')) ?> 202 <div class="replies <?cs if:discussion.topic.new ?>new<?cs /if ?>"> 194 203 <ul> 195 204 <?cs if:discussion.messages.0.id ?> 196 205 <?cs call:display_topic(discussion.messages) ?> 197 206 <?cs /if ?> 198 <?cs if:!args.message && !args.submit && args.discussion_action && ( args.discussion_action != "delete") && (args.discussion_action != 'edit') && (args.discussion_action != 'post-edit') ?>207 <?cs if:!args.message && !args.submit && args.discussion_action && ((args.discussion_action == 'add') || (args.discussion_action == 'quote') || (args.discussion_action == 'post-add')) ?> 199 208 <?cs if:args.preview ?> 200 209 <?cs call:display_preview() ?> … … 205 214 </div> 206 215 <?cs /if ?> 216 <?cs call:display_set_display() ?> 207 217 <?cs else?> 208 218 <span>No discussion for this page created.</span> discussionplugin/0.9/tracdiscussion/templates/topic-list.cs
r1071 r1088 1 <?cs include "macros.cs" ?> 1 2 <?cs include "discussion-header.cs" ?> 2 3 … … 12 13 <thead> 13 14 <tr> 14 < th class="id">ID</th>15 < th class="subject">Subject</th>16 < th class="author">Author</th>17 < th class="lastreply">Last Reply</th>18 < th class="founded">Founded</th>19 < th class="replies">Replies</th>15 <?cs call:sortable_th(discussion.order, discussion.desc, 'id', 'ID', discussion.href + '/' + discussion.forum.id + '?') ?> 16 <?cs call:sortable_th(discussion.order, discussion.desc, 'subject', 'Subject', discussion.href + '/' + discussion.forum.id + '?') ?> 17 <?cs call:sortable_th(discussion.order, discussion.desc, 'author', 'Author', discussion.href + '/' + discussion.forum.id + '?') ?> 18 <?cs call:sortable_th(discussion.order, discussion.desc, 'lastreply', 'Last Reply', discussion.href + '/' + discussion.forum.id + '?') ?> 19 <?cs call:sortable_th(discussion.order, discussion.desc, 'time', 'Founded', discussion.href + '/' + discussion.forum.id + '?') ?> 20 <?cs call:sortable_th(discussion.order, discussion.desc, 'replies', 'Replies', discussion.href + '/' + discussion.forum.id + '?') ?> 20 21 </tr> 21 22 </thead>
