Changeset 790

Show
Ignore:
Timestamp:
05/26/06 11:59:41 (3 years ago)
Author:
Blackhex
Message:

DiscussionPlugin:

Whole forum deletion and showing last reply time.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • discussionplugin/0.9/tracdiscussion/core.py

    r785 r790  
    55from trac.Timeline import ITimelineEventProvider 
    66from trac.perm import IPermissionRequestor 
    7 from trac.util import Markup, format_datetime 
     7from trac.util import Markup, format_datetime, pretty_timedelta 
    88import re, os, time 
    99 
     
    1616      IPermissionRequestor) 
    1717 
    18     # ITimelineEventProvider methods 
    19 #    def get_timeline_events(self, req, start, stop, filters): 
    20 #        if 'discussion' in filters: 
    21 #            # TODO Complete timeline magic 
    22 #            pass 
    23 # 
    24 #    def get_timeline_filters(self, req): 
    25 #        if req.perm.has_permission('DISCUSSION_VIEW'): 
    26 #            yield ('discussion', 'Discussion changes') 
    27  
    2818    # IPermissionRequestor methods 
    2919    def get_permission_actions(self): 
     
    5242    # IRequestHandler methods 
    5343    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+)))$''', 
    5545          req.path_info) 
    5646        if match: 
     
    115105                    mode = 'message-list' 
    116106            elif action == 'delete': 
    117                 mode = 'message-delete' 
     107                if reply == '-1': 
     108                    mode = 'topic-delete' 
     109                else: 
     110                    mode = 'message-delete' 
    118111            else: 
    119112                mode = 'message-list' 
     
    130123                else: 
    131124                    mode = 'topic-post-add' 
     125            elif action == 'delete': 
     126                mode = 'forum-delete' 
    132127            else: 
    133128                # Display list of topics 
     
    163158            moderators = req.args.get('moderators').split(' ') 
    164159 
    165             # Add new forum and display forum list 
     160            # Add new forum 
    166161            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 
    167173            req.hdf['discussion.forums'] = self.get_forums(cursor, req) 
    168174            mode = 'forum-list' 
     
    194200            # Add new topic and display topic list 
    195201            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 
    196212            req.hdf['discussion.topics'] = self.get_topics(cursor, forum['id'], 
    197213              req) 
     
    232248              topic['id'], req) 
    233249            mode = 'message-list' 
    234  
    235250        elif mode == 'message-delete': 
    236251            req.perm.assert_permission('DISCUSSION_MODERATE') 
    237252 
    238             # Get request value 
    239             reply = req.args.get('reply') 
    240  
    241253            # Delete message 
    242254            self.delete_message(cursor, forum['id'], topic['id'], reply) 
    243255 
    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' 
    253260 
    254261        req.hdf['discussion.forum'] = forum 
     
    285292        columns = ('name', 'moderators', 'id', 'time', 'subject', 'description') 
    286293        cursor.execute('SELECT name, moderators, id, time, subject, description' 
    287           ' FROM forum WHERE name=%s', [id]) 
     294          ' FROM forum WHERE id = %s', [id]) 
    288295        for row in cursor: 
    289296            row = dict(zip(columns, row)) 
     
    295302    def get_forums(self, cursor, req): 
    296303        columns = ('moderators', 'id', 'time', 'subject', 'name', 
    297           'description', 'topics', 'replies'
     304          'description', 'topics', 'replies', 'lastreply'
    298305        cursor.execute('SELECT moderators, id, time, subject, name,' 
    299306          ' description, (SELECT COUNT(id) FROM topic t WHERE' 
    300307          ' 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') 
    302310        forums = [] 
    303311        for row in cursor: 
     
    305313            row['moderators'] = wiki_to_oneliner(row['moderators'], self.env) 
    306314            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' 
    307319            row['time'] = format_datetime(row['time']) 
    308320            forums.append(row) 
     
    310322 
    311323    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') 
    313326        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' 
    315329          ' WHERE forum = %s ORDER BY time', [forum]) 
    316330        topics = [] 
     
    319333            row['author'] = wiki_to_oneliner(row['author'], self.env) 
    320334            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' 
    321339            row['time'] = format_datetime(row['time']) 
    322340            topics.append(row) 
     
    372390          (forum, topic, replyto, str(int(time.time())), author, body)) 
    373391 
     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 
    374402    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  
    3838} 
    3939 
    40 .forum-list .moderators, .forum-list .lastreply, .forum-list .founded, 
    41 .forum-list .topics, .forum-list .replies 
     40.forum-list td.moderators, .forum-list td.lastreply, .forum-list td.founded, 
     41.forum-list td.topics, .forum-list td.replies 
    4242{ 
    4343  text-align: center; 
     
    5050 
    5151/* 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 
    5354{ 
    5455  text-align: center; 
  • discussionplugin/0.9/tracdiscussion/templates/discussion-header.cs

    r775 r790  
    55  <h2>Wiki Navigation</h2> 
    66  <ul> 
    7     <?cs if:discussion.forum.name ?> 
     7    <?cs if:discussion.forum.id ?> 
    88      <?cs if:discussion.topic.id ?> 
    99        <li> 
     
    1212        <?cs if:discussion.message.id ?> 
    1313          <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 ?>"> 
    1515              <?cs var:discussion.forum.subject ?> 
    1616            </a> 
    1717          </li> 
    1818          <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 ?>"> 
    2020              <?cs var:discussion.topic.subject ?> 
    2121            </a> 
     
    2323        <?cs else ?> 
    2424          <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 ?>"> 
    2626              <?cs var:discussion.forum.subject ?> 
    2727            </a> 
  • discussionplugin/0.9/tracdiscussion/templates/forum-add.cs

    r775 r790  
    3434      <input type="submit" name="submit" value="Submit"/> 
    3535      <input type="submit" name="cancel" value="Cancel"/> 
     36      <input type="hidden" name="action" value="post-add"/> 
    3637    </div> 
    37     <input type="hidden" name="action" value="post-add"/> 
    3838  </fieldset> 
    3939</form> 
  • discussionplugin/0.9/tracdiscussion/templates/forum-list.cs

    r785 r790  
    1717      <tr class="<?cs if:name(forum) % #2 ?>even<?cs else ?>odd<?cs /if ?>"> 
    1818        <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 ?>"> 
    2020            <div class="subject"><?cs var:forum.subject ?></div> 
    2121            <div class="description"><?cs var:forum.description ?></div> 
     
    2323        </td> 
    2424        <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 ?>"> 
    2626            <div class="row"> 
    2727              <div class="cell"><?cs var:forum.moderators ?></div> 
     
    3030        </td> 
    3131        <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 ?>"> 
    3333            <div class="row"> 
    34               <div class="cell">Not implemented</div> 
     34              <div class="cell"><?cs var:forum.lastreply ?></div> 
    3535            </div> 
    3636          </a> 
    3737        </td> 
    3838        <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 ?>"> 
    4040            <div class="row"> 
    4141              <div class="cell"><?cs var:forum.time ?></div> 
     
    4444        </td> 
    4545        <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 ?>"> 
    4747            <div class="row"> 
    4848              <div class="cell"><?cs var:forum.topics ?></div> 
     
    5151        </td> 
    5252        <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 ?>"> 
    5454            <div class="row"> 
    5555              <div class="cell"><?cs var:forum.replies ?></div> 
     
    6363 
    6464<?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 ?>"> 
    6767      <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
    7171<?cs /if ?> 
    7272 
  • discussionplugin/0.9/tracdiscussion/templates/message-list.cs

    r785 r790  
    1818         Reply: 
    1919      </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 ?>"> 
    2121        <div class="field"> 
    2222          <label for="author">Author:</label><br/> 
     
    3030          <input type="submit" name="preview" value="Preview"/> 
    3131          <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 ?>'"/> 
    3333        </div> 
    3434        <input type="hidden" name="reply" value="<?cs var:args.reply ?>"/> 
     
    4646      </div> 
    4747      <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> 
    4949        <?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> 
    5151        <?cs /if ?> 
    5252      </div> 
     
    5555      </div> 
    5656    </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") ?> 
    5858      <ul> 
    5959        <?cs call:display_topic(message.replies) ?> 
     
    8181    </div> 
    8282    <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> 
    8484    </div> 
    8585    <div class="author"> 
     
    8787    </div> 
    8888  </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") ?> 
    9090    <div class="replies"> 
    9191      <ul> 
     
    103103 
    104104<?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
    112112<?cs /if ?> 
    113113 
  • discussionplugin/0.9/tracdiscussion/templates/topic-add.cs

    r783 r790  
    2121<?cs /if ?> 
    2222 
    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 ?>"> 
    2424  <fieldset> 
    2525    <legend> 
     
    4242      <input type="submit" name="submit" value="Submit"/> 
    4343      <input type="submit" name="cancel" value="Cancel"/> 
     44      <input type="hidden" name="action" value="post-add"/> 
    4445    </div> 
    45     <input type="hidden" name="action" value="post-add"/> 
    4646  </fieldset> 
    4747</form> 
  • discussionplugin/0.9/tracdiscussion/templates/topic-list.cs

    r785 r790  
    1212        <th class="subject">Subject</th> 
    1313        <th class="author">Author</th> 
     14        <th class="lastreply">Last Reply</th> 
    1415        <th class="founded">Founded</th> 
    1516        <th class="replies">Replies</th> 
     
    2021        <tr class="<?cs if:name(topic) % #2 ?>even<?cs else ?>odd<?cs /if ?>"> 
    2122          <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 ?>"> 
    2324              <div class="subject"><?cs var:topic.subject ?></div> 
    2425            </a> 
    2526          </td> 
    2627          <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 ?>"> 
    2829              <div class="author" ><?cs var:topic.author ?></div> 
    2930            </a> 
    3031          </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> 
    3137          <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 ?>"> 
    3339              <div class="founded" ><?cs var:topic.time ?></div> 
    3440            </a> 
    3541          </td> 
    3642          <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 ?>"> 
    3844              <div class="replies" ><?cs var:topic.replies ?></div> 
    3945            </a> 
     
    4450  </table> 
    4551 
    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 ?>"> 
    4854      <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> 
    5264 
    5365<?cs include "footer.cs" ?>