Changeset 790
- Timestamp:
- 05/26/06 11:59:41 (3 years ago)
- Files:
-
- discussionplugin/0.9/tracdiscussion/core.py (modified) (14 diffs)
- discussionplugin/0.9/tracdiscussion/htdocs/css/discussion.css (modified) (2 diffs)
- discussionplugin/0.9/tracdiscussion/templates/discussion-header.cs (modified) (3 diffs)
- discussionplugin/0.9/tracdiscussion/templates/forum-add.cs (modified) (1 diff)
- discussionplugin/0.9/tracdiscussion/templates/forum-list.cs (modified) (6 diffs)
- discussionplugin/0.9/tracdiscussion/templates/message-list.cs (modified) (7 diffs)
- discussionplugin/0.9/tracdiscussion/templates/topic-add.cs (modified) (2 diffs)
- discussionplugin/0.9/tracdiscussion/templates/topic-list.cs (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
discussionplugin/0.9/tracdiscussion/core.py
r785 r790 5 5 from trac.Timeline import ITimelineEventProvider 6 6 from trac.perm import IPermissionRequestor 7 from trac.util import Markup, format_datetime 7 from trac.util import Markup, format_datetime, pretty_timedelta 8 8 import re, os, time 9 9 … … 16 16 IPermissionRequestor) 17 17 18 # ITimelineEventProvider methods19 # def get_timeline_events(self, req, start, stop, filters):20 # if 'discussion' in filters:21 # # TODO Complete timeline magic22 # pass23 #24 # def get_timeline_filters(self, req):25 # if req.perm.has_permission('DISCUSSION_VIEW'):26 # yield ('discussion', 'Discussion changes')27 28 18 # IPermissionRequestor methods 29 19 def get_permission_actions(self): … … 52 42 # IRequestHandler methods 53 43 def match_request(self, req): 54 match = re.match(r'''/discussion(?:/?$|/( [a-zA-Z]+[-a-zA-Z]+)(?:/?$|/(\d+))(?:/?$|/(\d+)))$''',44 match = re.match(r'''/discussion(?:/?$|/(\d+)(?:/?$|/(\d+))(?:/?$|/(\d+)))$''', 55 45 req.path_info) 56 46 if match: … … 115 105 mode = 'message-list' 116 106 elif action == 'delete': 117 mode = 'message-delete' 107 if reply == '-1': 108 mode = 'topic-delete' 109 else: 110 mode = 'message-delete' 118 111 else: 119 112 mode = 'message-list' … … 130 123 else: 131 124 mode = 'topic-post-add' 125 elif action == 'delete': 126 mode = 'forum-delete' 132 127 else: 133 128 # Display list of topics … … 163 158 moderators = req.args.get('moderators').split(' ') 164 159 165 # Add new forum and display forum list160 # Add new forum 166 161 self.add_forum(cursor, name, subject, description, moderators) 162 163 # Display forum list 164 req.hdf['discussion.forums'] = self.get_forums(cursor, req) 165 mode = 'forum-list' 166 elif mode == 'forum-delete': 167 req.perm.assert_permission('DISCUSSION_MODIFY') 168 169 # Delete current forum 170 self.delete_forum(cursor, forum['id']) 171 172 # Display forum list 167 173 req.hdf['discussion.forums'] = self.get_forums(cursor, req) 168 174 mode = 'forum-list' … … 194 200 # Add new topic and display topic list 195 201 self.add_topic(cursor, forum['id'], subject, author, body) 202 req.hdf['discussion.topics'] = self.get_topics(cursor, forum['id'], 203 req) 204 mode = 'topic-list' 205 elif mode == 'topic-delete': 206 req.perm.assert_permission('DISCUSSION_MODERATE') 207 208 # Delete message 209 self.delete_topic(cursor, forum['id'], topic['id']) 210 211 # Display topics 196 212 req.hdf['discussion.topics'] = self.get_topics(cursor, forum['id'], 197 213 req) … … 232 248 topic['id'], req) 233 249 mode = 'message-list' 234 235 250 elif mode == 'message-delete': 236 251 req.perm.assert_permission('DISCUSSION_MODERATE') 237 252 238 # Get request value239 reply = req.args.get('reply')240 241 253 # Delete message 242 254 self.delete_message(cursor, forum['id'], topic['id'], reply) 243 255 244 # Display topics or messages 245 if reply == '-1': 246 req.hdf['discussion.topics'] = self.get_topics(cursor, forum['id'], 247 req) 248 mode = 'topic-list' 249 else: 250 req.hdf['discussion.messages'] = self.get_messages(cursor, 251 topic['id'], req) 252 mode = 'message-list' 256 # Display or messages 257 req.hdf['discussion.messages'] = self.get_messages(cursor, 258 topic['id'], req) 259 mode = 'message-list' 253 260 254 261 req.hdf['discussion.forum'] = forum … … 285 292 columns = ('name', 'moderators', 'id', 'time', 'subject', 'description') 286 293 cursor.execute('SELECT name, moderators, id, time, subject, description' 287 ' FROM forum WHERE name=%s', [id])294 ' FROM forum WHERE id = %s', [id]) 288 295 for row in cursor: 289 296 row = dict(zip(columns, row)) … … 295 302 def get_forums(self, cursor, req): 296 303 columns = ('moderators', 'id', 'time', 'subject', 'name', 297 'description', 'topics', 'replies' )304 'description', 'topics', 'replies', 'lastreply') 298 305 cursor.execute('SELECT moderators, id, time, subject, name,' 299 306 ' description, (SELECT COUNT(id) FROM topic t WHERE' 300 307 ' t.forum = forum.id), (SELECT COUNT(id) FROM message m WHERE m.forum' 301 ' = forum.id) FROM forum ORDER BY subject') 308 ' = forum.id), (SELECT MAX(time) FROM message m WHERE m.forum =' 309 ' forum.id) FROM forum ORDER BY subject') 302 310 forums = [] 303 311 for row in cursor: … … 305 313 row['moderators'] = wiki_to_oneliner(row['moderators'], self.env) 306 314 row['description'] = wiki_to_oneliner(row['description'], self.env) 315 if row['lastreply']: 316 row['lastreply'] = pretty_timedelta(row['lastreply']) 317 else: 318 row['lastreply'] = 'No replies' 307 319 row['time'] = format_datetime(row['time']) 308 320 forums.append(row) … … 310 322 311 323 def get_topics(self, cursor, forum, req): 312 columns = ('id', 'forum', 'time', 'subject', 'body', 'author', 'replies') 324 columns = ('id', 'forum', 'time', 'subject', 'body', 'author', 325 'replies', 'lastreply') 313 326 cursor.execute('SELECT id, forum, time, subject, body, author, (SELECT' 314 ' COUNT(id) FROM message m WHERE m.topic = topic.id) FROM topic' 327 ' COUNT(id) FROM message m WHERE m.topic = topic.id), (SELECT' 328 ' MAX(time) FROM message m WHERE m.topic = topic.id) FROM topic' 315 329 ' WHERE forum = %s ORDER BY time', [forum]) 316 330 topics = [] … … 319 333 row['author'] = wiki_to_oneliner(row['author'], self.env) 320 334 row['body'] = wiki_to_html(row['body'], self.env, req) 335 if row['lastreply']: 336 row['lastreply'] = pretty_timedelta(row['lastreply']) 337 else: 338 row['lastreply'] = 'No replies' 321 339 row['time'] = format_datetime(row['time']) 322 340 topics.append(row) … … 372 390 (forum, topic, replyto, str(int(time.time())), author, body)) 373 391 392 def delete_forum(self, cursor, forum): 393 cursor.execute('DELETE FROM message WHERE forum = "%s"' % (forum)) 394 cursor.execute('DELETE FROM topic WHERE forum = "%s"' % (forum)) 395 cursor.execute('DELETE FROM forum WHERE id = "%s"' % (forum)) 396 397 def delete_topic(self, cursor, forum, topic): 398 cursor.execute('DELETE FROM message WHERE forum = "%s" AND topic = "%s"' 399 % (forum, topic)) 400 cursor.execute('DELETE FROM topic WHERE id = "%s"' % (topic)) 401 374 402 def delete_message(self, cursor, forum, topic, message): 375 # Delete whole topic? 376 self.log.debug(message) 377 self.log.debug(topic) 378 if message == '-1': 379 cursor.execute('DELETE FROM message WHERE forum = "%s" AND topic = "%s"' 380 % (forum, topic)) 381 cursor.execute('DELETE FROM topic WHERE id = "%s"' % (topic)) 382 else: 383 # Get message replies 384 cursor.execute('SELECT id FROM message WHERE replyto = "%s"' 385 % (message)) 386 replies = [] 387 for row in cursor: 388 replies.append(row[0]) 389 390 # Delete all replies 391 for reply in replies: 392 self.delete_message(cursor, forum, topic, reply) 393 394 # Delete message itself 395 cursor.execute('DELETE FROM message WHERE id = "%s"' % (message)) 403 # Get message replies 404 cursor.execute('SELECT id FROM message WHERE replyto = "%s"' 405 % (message)) 406 replies = [] 407 for row in cursor: 408 replies.append(row[0]) 409 410 # Delete all replies 411 for reply in replies: 412 self.delete_message(cursor, forum, topic, reply) 413 414 # Delete message itself 415 cursor.execute('DELETE FROM message WHERE id = "%s"' % (message)) discussionplugin/0.9/tracdiscussion/htdocs/css/discussion.css
r785 r790 38 38 } 39 39 40 .forum-list .moderators, .forum-list .lastreply, .forum-list.founded,41 .forum-list .topics, .forum-list.replies40 .forum-list td.moderators, .forum-list td.lastreply, .forum-list td.founded, 41 .forum-list td.topics, .forum-list td.replies 42 42 { 43 43 text-align: center; … … 50 50 51 51 /* Topic list */ 52 .topic-list .author, .topic-list .founded, .topic-list .replies 52 .topic-list td.author, .topic-list td.lastreply, .topic-list td.founded, 53 .topic-list td.replies 53 54 { 54 55 text-align: center; discussionplugin/0.9/tracdiscussion/templates/discussion-header.cs
r775 r790 5 5 <h2>Wiki Navigation</h2> 6 6 <ul> 7 <?cs if:discussion.forum. name?>7 <?cs if:discussion.forum.id ?> 8 8 <?cs if:discussion.topic.id ?> 9 9 <li> … … 12 12 <?cs if:discussion.message.id ?> 13 13 <li> 14 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum. name?>">14 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>"> 15 15 <?cs var:discussion.forum.subject ?> 16 16 </a> 17 17 </li> 18 18 <li class="last"> 19 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum. name?>/<?cs var:discussion.topic.id ?>">19 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:discussion.topic.id ?>"> 20 20 <?cs var:discussion.topic.subject ?> 21 21 </a> … … 23 23 <?cs else ?> 24 24 <li class="last"> 25 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum. name?>">25 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>"> 26 26 <?cs var:discussion.forum.subject ?> 27 27 </a> discussionplugin/0.9/tracdiscussion/templates/forum-add.cs
r775 r790 34 34 <input type="submit" name="submit" value="Submit"/> 35 35 <input type="submit" name="cancel" value="Cancel"/> 36 <input type="hidden" name="action" value="post-add"/> 36 37 </div> 37 <input type="hidden" name="action" value="post-add"/>38 38 </fieldset> 39 39 </form> discussionplugin/0.9/tracdiscussion/templates/forum-list.cs
r785 r790 17 17 <tr class="<?cs if:name(forum) % #2 ?>even<?cs else ?>odd<?cs /if ?>"> 18 18 <td class="title"> 19 <a href="<?cs var:trac.href.discussion ?>/<?cs var:forum. name?>">19 <a href="<?cs var:trac.href.discussion ?>/<?cs var:forum.id ?>"> 20 20 <div class="subject"><?cs var:forum.subject ?></div> 21 21 <div class="description"><?cs var:forum.description ?></div> … … 23 23 </td> 24 24 <td class="moderators"> 25 <a class="table" href="<?cs var:trac.href.discussion ?>/<?cs var:forum. name?>">25 <a class="table" href="<?cs var:trac.href.discussion ?>/<?cs var:forum.id ?>"> 26 26 <div class="row"> 27 27 <div class="cell"><?cs var:forum.moderators ?></div> … … 30 30 </td> 31 31 <td class="lastreply"> 32 <a class="table" href="<?cs var:trac.href.discussion ?>/<?cs var:forum. name?>">32 <a class="table" href="<?cs var:trac.href.discussion ?>/<?cs var:forum.id ?>"> 33 33 <div class="row"> 34 <div class="cell"> Not implemented</div>34 <div class="cell"><?cs var:forum.lastreply ?></div> 35 35 </div> 36 36 </a> 37 37 </td> 38 38 <td class="founded"> 39 <a class="table" href="<?cs var:trac.href.discussion ?>/<?cs var:forum. name?>">39 <a class="table" href="<?cs var:trac.href.discussion ?>/<?cs var:forum.id ?>"> 40 40 <div class="row"> 41 41 <div class="cell"><?cs var:forum.time ?></div> … … 44 44 </td> 45 45 <td class="topics"> 46 <a class="table" href="<?cs var:trac.href.discussion ?>/<?cs var:forum. name?>">46 <a class="table" href="<?cs var:trac.href.discussion ?>/<?cs var:forum.id ?>"> 47 47 <div class="row"> 48 48 <div class="cell"><?cs var:forum.topics ?></div> … … 51 51 </td> 52 52 <td class="replies"> 53 <a class="table" href="<?cs var:trac.href.discussion ?>/<?cs var:forum. name?>">53 <a class="table" href="<?cs var:trac.href.discussion ?>/<?cs var:forum.id ?>"> 54 54 <div class="row"> 55 55 <div class="cell"><?cs var:forum.replies ?></div> … … 63 63 64 64 <?cs if:trac.acl.DISCUSSION_MODIFY ?> 65 < form method="post" action="<?cs var:trac.href.discussion ?>">66 < div class="buttons">65 <div class="buttons"> 66 <form method="post" action="<?cs var:trac.href.discussion ?>"> 67 67 <input type="submit" name="newforum" value="New Forum"/> 68 </div>69 < input type="hidden" name="action" value="add"/>70 </ form>68 <input type="hidden" name="action" value="add"/> 69 </form> 70 </div> 71 71 <?cs /if ?> 72 72 discussionplugin/0.9/tracdiscussion/templates/message-list.cs
r785 r790 18 18 Reply: 19 19 </legend> 20 <form method="post" action="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum. name?>/<?cs var:discussion.topic.id ?>">20 <form method="post" action="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:discussion.topic.id ?>"> 21 21 <div class="field"> 22 22 <label for="author">Author:</label><br/> … … 30 30 <input type="submit" name="preview" value="Preview"/> 31 31 <input type="submit" name="submit" value="Reply"/> 32 <input type="button" name="cancel" value="Cancel" onClick="location.href = '<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum. name?>/<?cs var:discussion.topic.id ?>'"/>32 <input type="button" name="cancel" value="Cancel" onClick="location.href = '<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:discussion.topic.id ?>'"/> 33 33 </div> 34 34 <input type="hidden" name="reply" value="<?cs var:args.reply ?>"/> … … 46 46 </div> 47 47 <div class="controls"> 48 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum. name?>/<?cs var:discussion.topic.id ?>?action=add;reply=<?cs var:message.id ?>">Reply</a>48 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:discussion.topic.id ?>?action=add;reply=<?cs var:message.id ?>">Reply</a> 49 49 <?cs if:trac.acl.DISCUSSION_MODERATE ?> 50 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum. name?>/<?cs var:discussion.topic.id ?>?action=delete;reply=<?cs var:message.id ?>">Delete</a>50 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:discussion.topic.id ?>?action=delete;reply=<?cs var:message.id ?>">Delete</a> 51 51 <?cs /if ?> 52 52 </div> … … 55 55 </div> 56 56 </li> 57 <?cs if:discussion.messages.0.body || (args.action == "add") ?>57 <?cs if:discussion.messages.0.body || (args.action == "add") || (args.action == "post-add") ?> 58 58 <ul> 59 59 <?cs call:display_topic(message.replies) ?> … … 81 81 </div> 82 82 <div class="controls"> 83 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum. name?>/<?cs var:discussion.topic.id ?>?action=add;reply=-1">Reply</a>83 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:discussion.topic.id ?>?action=add;reply=-1">Reply</a> 84 84 </div> 85 85 <div class="author"> … … 87 87 </div> 88 88 </div> 89 <?cs if:discussion.messages.0.body || (args.action == "add") ?>89 <?cs if:discussion.messages.0.body || (args.action == "add") || (args.action == "post-add") ?> 90 90 <div class="replies"> 91 91 <ul> … … 103 103 104 104 <?cs if:trac.acl.DISCUSSION_MODERATE ?> 105 < form method="post" action="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.name ?>/<?cs var:discussion.topic.id ?>">106 < div class="buttons">107 <input type="submit" name="deletetopic" value="Delete Topic" />108 </div>109 <input type="hidden" name="action" value="delete"/>110 < input type="hidden" name="reply" value="-1">111 </ form>105 <div class="buttons"> 106 <form method="post" action="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:discussion.topic.id ?>"> 107 <input type="submit" name="deletetopic" value="Delete Topic" onClick="return confirm('Do you realy want to delete this topic?')"/> 108 <input type="hidden" name="action" value="delete"/> 109 <input type="hidden" name="reply" value="-1"> 110 </form> 111 </div> 112 112 <?cs /if ?> 113 113 discussionplugin/0.9/tracdiscussion/templates/topic-add.cs
r783 r790 21 21 <?cs /if ?> 22 22 23 <form class="add_form" method="post" action="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum. name?>">23 <form class="add_form" method="post" action="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>"> 24 24 <fieldset> 25 25 <legend> … … 42 42 <input type="submit" name="submit" value="Submit"/> 43 43 <input type="submit" name="cancel" value="Cancel"/> 44 <input type="hidden" name="action" value="post-add"/> 44 45 </div> 45 <input type="hidden" name="action" value="post-add"/>46 46 </fieldset> 47 47 </form> discussionplugin/0.9/tracdiscussion/templates/topic-list.cs
r785 r790 12 12 <th class="subject">Subject</th> 13 13 <th class="author">Author</th> 14 <th class="lastreply">Last Reply</th> 14 15 <th class="founded">Founded</th> 15 16 <th class="replies">Replies</th> … … 20 21 <tr class="<?cs if:name(topic) % #2 ?>even<?cs else ?>odd<?cs /if ?>"> 21 22 <td class="subject"> 22 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum. name?>/<?cs var:topic.id ?>">23 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:topic.id ?>"> 23 24 <div class="subject"><?cs var:topic.subject ?></div> 24 25 </a> 25 26 </td> 26 27 <td class="author"> 27 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum. name?>/<?cs var:topic.id ?>">28 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:topic.id ?>"> 28 29 <div class="author" ><?cs var:topic.author ?></div> 29 30 </a> 30 31 </td> 32 <td class="lastreply"> 33 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:topic.id ?>"> 34 <div class="lastreply"><?cs var:topic.lastreply ?></div> 35 </a> 36 </td> 31 37 <td class="founded"> 32 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum. name?>/<?cs var:topic.id ?>">38 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:topic.id ?>"> 33 39 <div class="founded" ><?cs var:topic.time ?></div> 34 40 </a> 35 41 </td> 36 42 <td class="replies"> 37 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum. name?>/<?cs var:topic.id ?>">43 <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:topic.id ?>"> 38 44 <div class="replies" ><?cs var:topic.replies ?></div> 39 45 </a> … … 44 50 </table> 45 51 46 < form method="post" action="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.name ?>">47 < div class="buttons">52 <div class="buttons"> 53 <form method="post" action="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>"> 48 54 <input type="submit" name="newtopic" value="New Topic"/> 49 </div> 50 <input type="hidden" name="action" value="add"/> 51 </form> 55 <input type="hidden" name="action" value="add"/> 56 </form> 57 <?cs if:trac.acl.DISCUSSION_MODIFY ?> 58 <form method="post" action="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>"> 59 <input type="submit" name="deleteforum" value="Delete Forum" onClick="return confirm('Do you realy want to delete this forum?')"/> 60 <input type="hidden" name="action" value="delete"> 61 </form> 62 <?cs /if ?> 63 </div> 52 64 53 65 <?cs include "footer.cs" ?>
