Changeset 836

Show
Ignore:
Timestamp:
06/08/06 11:03:04 (2 years ago)
Author:
Blackhex
Message:

DiscussionPlugin:

  • Module for WebAdminPlugin.
  • Forum group administration via WebAdminPlugin.
  • Complete database schema creation revritement.
  • Forum author column.
Files:

Legend:

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

    r804 r836  
    77  name = 'TracDiscussion', 
    88  version = '0.2', 
    9   packages = ['tracdiscussion'], 
     9  packages = ['tracdiscussion', 'tracdiscussion.db'], 
    1010  package_data = {'tracdiscussion' : ['templates/*.cs', 'htdocs/css/*.css']}, 
    1111  entry_points = {'trac.plugins': ['TracDiscussion.core = tracdiscussion.core', 
    1212    'TracDiscussion.init = tracdiscussion.init', 
    1313    'TracDiscussion.wiki = tracdiscussion.wiki', 
    14     'TracDiscussion.timeline = tracdiscussion.timeline']}, 
     14    'TracDiscussion.timeline = tracdiscussion.timeline', 
     15    'TracDiscussion.admin = tracdiscussion.admin']}, 
    1516  keywords = 'trac discussion', 
    1617  author = 'Alec Thomas, Radek Bartoň', 
     
    2223All rights reserved. 
    2324 
    24 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 
     25Redistribution and use in source and binary forms, with or without modification, 
     26are permitted provided that the following conditions are met: 
    2527 
    2628    * Redistributions of source code must retain the above copyright notice, 
  • discussionplugin/0.9/tracdiscussion/core.py

    r804 r836  
    5656 
    5757    def process_request(self, req): 
     58        # Get access to database 
    5859        db = self.env.get_db_cnx() 
    5960        cursor = db.cursor() 
    6061 
     62        # CSS styles 
    6163        add_stylesheet(req, 'common/css/wiki.css') 
    6264        add_stylesheet(req, 'discussion/css/discussion.css') 
     
    157159            # Get form values 
    158160            name = req.args.get('name') 
     161            author = req.authname 
    159162            subject = req.args.get('subject') 
    160163            description = req.args.get('description') 
    161             moderators = req.args.get('moderators').split(' ') 
     164            moderators = req.args.get('moderators') 
     165            if moderators: 
     166                moderators = moderators.split(' ') 
     167            else: 
     168                moderators = '' 
    162169 
    163170            # Add new forum 
    164             self.add_forum(cursor, name, subject, description, moderators) 
     171            self.add_forum(cursor, name, author, subject, description, 
     172              moderators) 
    165173 
    166174            # Display forum list 
     
    287295    def get_message(self, cursor, id, req): 
    288296        columns = ('id', 'forum', 'topic', 'replyto', 'time', 'author', 'body') 
    289         cursor.execute('SELECT id, forum, topic, replyto, time, author, body ' 
    290           'FROM message WHERE id = %s' % (id)) 
     297        sql = 'SELECT id, forum, topic, replyto, time, author, body FROM' \ 
     298          ' message WHERE id = %s' % (id) 
     299        self.log.debug(sql) 
     300        cursor.execute(sql) 
    291301        for row in cursor: 
    292302            row = dict(zip(columns, row)) 
     
    298308    def get_topic(self, cursor, id, req): 
    299309        columns = ('id', 'forum', 'time', 'subject', 'body', 'author') 
    300         cursor.execute('SELECT id, forum, time, subject, body, author FROM' 
    301           ' topic WHERE id = %s' % (id)) 
     310        sql = 'SELECT id, forum, time, subject, body, author FROM topic WHERE' \ 
     311          ' id = %s' % (id) 
     312        self.log.debug(sql) 
     313        cursor.execute(sql) 
    302314        for row in cursor: 
    303315            row = dict(zip(columns, row)) 
     
    309321    def get_forum(self, cursor, id, req): 
    310322        columns = ('name', 'moderators', 'id', 'time', 'subject', 'description') 
    311         cursor.execute('SELECT name, moderators, id, time, subject, description' 
    312           ' FROM forum WHERE id = %s' % (id)) 
     323        sql = 'SELECT name, moderators, id, time, subject, description FROM' \ 
     324          ' forum WHERE id = %s' % (id) 
     325        self.log.debug(sql) 
     326        cursor.execute(sql) 
    313327        for row in cursor: 
    314328            row = dict(zip(columns, row)) 
     
    319333 
    320334    def get_forums(self, cursor, req): 
    321         columns = ('moderators', 'id', 'time', 'subject', 'name', 
    322           'description', 'topics', 'replies', 'lastreply', 'lasttopic') 
    323         cursor.execute('SELECT moderators, id, time, subject, name,' 
    324           ' description, (SELECT COUNT(id) FROM topic t WHERE' 
    325           ' t.forum = forum.id), (SELECT COUNT(id) FROM message m WHERE m.forum' 
    326           ' = forum.id), (SELECT MAX(time) FROM message m WHERE m.forum =' 
    327           ' forum.id), (SELECT MAX(time) FROM topic t WHERE t.forum = forum.id)' 
    328           ' FROM forum ORDER BY subject') 
     335        columns = ('id', 'name', 'author', 'time', 'moderators', 'group', 
     336          'subject', 'description', 'topics', 'replies', 'lastreply', 
     337          'lasttopic') 
     338        sql = 'SELECT id, name, author, time, moderators, forum_group,' \ 
     339          ' subject, description, (SELECT COUNT(id) FROM topic t WHERE' \ 
     340          ' t.forum = forum.id), (SELECT COUNT(id) FROM message m WHERE' \ 
     341          ' m.forum = forum.id), (SELECT MAX(time) FROM message m WHERE' \ 
     342          ' m.forum = forum.id), (SELECT MAX(time) FROM topic t WHERE' \ 
     343          ' t.forum = forum.id) FROM forum ORDER BY subject' 
     344        self.log.debug(sql) 
     345        cursor.execute(sql) 
    329346        forums = [] 
    330347        for row in cursor: 
     
    347364        columns = ('id', 'forum', 'time', 'subject', 'body', 'author', 
    348365          'replies', 'lastreply') 
    349         cursor.execute('SELECT id, forum, time, subject, body, author, (SELECT' 
    350           ' COUNT(id) FROM message m WHERE m.topic = topic.id), (SELECT' 
    351           ' MAX(time) FROM message m WHERE m.topic = topic.id) FROM topic' 
    352           ' WHERE forum = %s ORDER BY time' % (forum)) 
     366        sql = 'SELECT id, forum, time, subject, body, author, (SELECT' \ 
     367          ' COUNT(id) FROM message m WHERE m.topic = topic.id), (SELECT' \ 
     368          ' MAX(time) FROM message m WHERE m.topic = topic.id) FROM topic' \ 
     369          ' WHERE forum = %s ORDER BY time' % (forum) 
     370        self.log.debug(sql) 
     371        cursor.execute(sql) 
    353372        topics = [] 
    354373        for row in cursor: 
     
    366385    def get_messages(self, cursor, topic, req): 
    367386        columns = ('id', 'replyto', 'time', 'author', 'body') 
    368         cursor.execute('SELECT id, replyto, time, author, body FROM message' 
    369           ' WHERE topic = "%s" ORDER BY time' % (topic)) 
     387        sql = 'SELECT id, replyto, time, author, body FROM message WHERE' \ 
     388          ' topic = %s ORDER BY time' % (topic) 
     389        self.log.debug(sql) 
     390        cursor.execute(sql) 
    370391 
    371392        messagemap = {} 
     
    394415        users = [] 
    395416        for user in self.env.get_known_users(): 
    396             users.append(user
     417            users.append(user[0]
    397418        return users 
    398419 
    399     def add_forum(self, cursor, name, subject, description, moderators): 
     420    def add_forum(self, cursor, name, author, subject, description, moderators): 
    400421        moderators = ' '.join(moderators) 
    401         cursor.execute('INSERT INTO forum (name, time, moderators, subject,' 
    402           ' description) VALUES ("%s", "%s", "%s", "%s", "%s")' % (name, 
    403           str(int(time.time())), moderators, subject, description)) 
     422        sql = 'INSERT INTO forum (name, author, time, moderators, subject,' \ 
     423          ' description) VALUES ("%s", "%s", %s, "%s", "%s", "%s")' % (name, 
     424          author, str(int(time.time())), moderators, subject, description) 
     425        self.log.debug(sql) 
     426        cursor.execute(sql) 
    404427 
    405428    def add_topic(self, cursor, forum, subject, author, body): 
    406         cursor.execute('INSERT INTO topic (forum, time, author, subject,' 
    407           ' body) VALUES ("%s", "%s", "%s", "%s", "%s")' % (forum, 
    408           str(int(time.time())), author, subject, body)) 
     429        sql = 'INSERT INTO topic (forum, time, author, subject, body) VALUES' \ 
     430          ' (%s, %s, "%s", "%s", "%s")' % (forum, str(int(time.time())), author, 
     431          subject, body) 
     432        self.log.debug(sql) 
     433        cursor.execute(sql) 
    409434 
    410435    def add_message(self, cursor, forum, topic, replyto, author, body): 
    411         cursor.execute('INSERT INTO message (forum, topic, replyto, time,' 
    412           ' author, body) VALUES ("%s", "%s", "%s", "%s", "%s", "%s")' % 
    413           (forum, topic, replyto, str(int(time.time())), author, body)) 
     436        sql = 'INSERT INTO message (forum, topic, replyto, time, author, body)' \ 
     437          ' VALUES (%s, %s, %s, %s, "%s", "%s")' % (forum, topic, replyto, 
     438          str(int(time.time())), author, body) 
     439        self.log.debug(sql) 
     440        cursor.execute(sql) 
    414441 
    415442    def delete_forum(self, cursor, forum): 
    416         cursor.execute('DELETE FROM message WHERE forum = "%s"' % (forum)) 
    417         cursor.execute('DELETE FROM topic WHERE forum = "%s"' % (forum)) 
    418         cursor.execute('DELETE FROM forum WHERE id = "%s"' % (forum)) 
     443        sql = 'DELETE FROM message WHERE forum = %s' % (forum) 
     444        self.log.debug(sql) 
     445        cursor.execute(sql) 
     446        sql = 'DELETE FROM topic WHERE forum = %s' % (forum) 
     447        self.log.debug(sql) 
     448        cursor.execute(sql) 
     449        sql = 'DELETE FROM forum WHERE id = %s' % (forum) 
     450        self.log.debug(sql) 
     451        cursor.execute(sql) 
    419452 
    420453    def delete_topic(self, cursor, forum, topic): 
    421         cursor.execute('DELETE FROM message WHERE forum = "%s" AND topic = "%s"' 
    422           % (forum, topic)) 
    423         cursor.execute('DELETE FROM topic WHERE id = "%s"' % (topic)) 
     454        sql = 'DELETE FROM message WHERE forum = %s AND topic = %s' % (forum, 
     455          topic) 
     456        self.log.debug(sql) 
     457        cursor.execute(sql) 
     458        sql = 'DELETE FROM topic WHERE id = %s' % (topic) 
     459        self.log.debug(sql) 
     460        cursor.execute(sql) 
    424461 
    425462    def delete_message(self, cursor, forum, topic, message): 
    426463        # Get message replies 
    427         cursor.execute('SELECT id FROM message WHERE replyto = "%s"' 
    428           % (message)) 
     464        sql = 'SELECT id FROM message WHERE replyto = %s' % (message) 
     465        self.log.debug(sql) 
     466        cursor.execute(sql) 
    429467        replies = [] 
    430468        for row in cursor: 
     
    436474 
    437475        # Delete message itself 
    438         cursor.execute('DELETE FROM message WHERE id = "%s"' % (message)) 
     476        sql = 'DELETE FROM message WHERE id = %s' % (message) 
     477        self.log.debug(sql) 
     478        cursor.execute(sql) 
  • discussionplugin/0.9/tracdiscussion/init.py

    r775 r836  
    22from trac.db import * 
    33from trac.env import IEnvironmentSetupParticipant 
    4 from tracdiscussion.db import version as discussion_version, schema 
     4 
     5# Last discussion database shcema version 
     6last_db_version = 2 
    57 
    68class DiscussionInit(Component): 
     
    1416    def environment_needs_upgrade(self, db): 
    1517        cursor = db.cursor() 
    16         # Database is up to date? 
    17         try: 
    18             cursor.execute("SELECT value FROM system WHERE name='discussion_version'") 
    19             for row in cursor: 
    20                 return int(row[0]) != discussion_version 
    21             return True 
    22         except: 
    23             return True 
    24         return False 
     18 
     19        # Is database up to date? 
     20        return self._get_db_version(cursor) != last_db_version 
    2521 
    2622    def upgrade_environment(self, db): 
    2723        cursor = db.cursor() 
    28         # Initial table creation 
    29         #try: 
    30         for table in schema: 
    31             queries = db.to_sql(table) 
    32             for query in queries: 
    33                 cursor.execute(query) 
    34         cursor.execute("INSERT INTO system VALUES ('discussion_version', %s)", 
    35           [discussion_version]) 
    36         #except: 
    37           #cursor.execute("UPDATE system SET value = %i WHERE name = 'discussion_version'", discussion_version) 
     24 
     25        # Get current database schema version 
     26        db_version = self._get_db_version(cursor) 
     27 
     28        # Perform incremental upgrades 
     29        for I in range(db_version + 1, last_db_version + 1): 
     30            script_name  = 'db%i' % (I) 
     31            try: 
     32                module = __import__('tracdiscussion.db.%s' % (script_name), 
     33                globals(), locals(), ['do_upgrade']) 
     34                module.do_upgrade(cursor) 
     35            except: 
     36                raise TracError('Error upgrading database to version %i' % I) 
     37 
     38    def _get_db_version(self, cursor): 
     39        try: 
     40            sql = "SELECT value FROM system WHERE name='discussion_version'" 
     41            self.log.debug(sql) 
     42            cursor.execute(sql) 
     43            for row in cursor: 
     44                return int(row[0]) 
     45            return 0 
     46        except: 
     47            return 0 
  • discussionplugin/0.9/tracdiscussion/templates/forum-add.cs

    r790 r836  
    2121    <div class="field"> 
    2222      <label for="moderators">Moderators:</label><br/> 
    23       <?cs if:discussion.users ?> 
     23      <?cs if:discussion.users.0 ?> 
    2424        <select name="moderators" multiple="on"> 
    2525          <?cs each:user = discussion.users ?> 
  • discussionplugin/0.9/tracdiscussion/templates/message-list.cs

    r804 r836  
    5353      </div> 
    5454      <div class="controls"> 
    55         <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:discussion.topic.id ?>#reply?action=add;reply=<?cs var:message.id ?>">Reply</a> 
    56         <?cs if:trac.acl.DISCUSSION_MODERATE && discussion.is_moderator ?> 
    57           <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> 
     55        <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">Reply</a> 
     56        <?cs if:trac.acl.DISCUSSION_MODERATE && discussion.is_moderator ?> 
     57          <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:discussion.topic.id ?>?action=delete;reply=<?cs var:message.id ?>" onClick="return confirm('Do you realy want to delete this reply and all its descendants?')"/>Delete</a> 
    5858        <?cs /if ?> 
    5959      </div> 
     
    8787    </div> 
    8888    <div class="controls"> 
    89       <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:discussion.topic.id ?>#reply?action=add;reply=-1">Reply</a> 
     89      <a href="<?cs var:trac.href.discussion ?>/<?cs var:discussion.forum.id ?>/<?cs var:discussion.topic.id ?>?action=add;reply=-1#reply">Reply</a> 
    9090    </div> 
    9191    <div class="author"> 
  • discussionplugin/0.9/tracdiscussion/timeline.py

    r804 r836  
    1212    implements(ITimelineEventProvider) 
    1313 
    14     # ITimelineEventProvider methods 
     14    # ITimelineEventProvider 
    1515    def get_timeline_events(self, req, start, stop, filters): 
    1616        if 'discussion' in filters: 
     
    7777 
    7878    def _get_changed_forums(self, cursor, start, stop): 
    79         columns = ('id', 'name', 'subject', 'description', 'time') 
    80         cursor.execute('SELECT id, name, subject, description, time' 
    81           ' FROM forum WHERE time BETWEEN %s AND %s' % (start, stop)) 
     79        columns = ('id', 'name', 'author', 'subject', 'description', 'time') 
     80        sql = 'SELECT id, name, author, subject, description, time FROM forum' \ 
     81          ' WHERE time BETWEEN %s AND %s' % (start, stop) 
     82        self.log.debug(sql) 
     83        cursor.execute(sql) 
    8284        for row in cursor: 
    8385            row = dict(zip(columns, row)) 
    84             row['author'] = 'nobody' 
    8586            yield row 
    8687 
    8788    def _get_changed_topics(self, cursor, start, stop): 
    8889        columns = ('id', 'subject', 'author', 'time', 'forum', 'forum_name') 
    89         cursor.execute('SELECT id, subject, author, time, forum, (SELECT name' 
    90           ' FROM forum f WHERE f.id = topic.forum) FROM topic WHERE time' 
    91           ' BETWEEN %s AND %s' % (start, stop)) 
     90        sql = 'SELECT id, subject, author, time, forum, (SELECT name FROM forum' \ 
     91          ' f WHERE f.id = topic.forum) FROM topic WHERE time BETWEEN %s AND %s' \ 
     92          % (start, stop) 
     93        self.log.debug(sql) 
     94        cursor.execute(sql) 
    9295        for row in cursor: 
    9396            row = dict(zip(columns, row)) 
     
    97100        columns = ('id', 'author', 'time', 'forum', 'topic', 'forum_name', 
    98101          'topic_subject') 
    99         cursor.execute('SELECT id, author, time, forum, topic, (SELECT name' 
    100           ' FROM forum f WHERE f.id = message.forum), (SELECT subject FROM' 
    101           ' topic t WHERE t.id = message.topic) FROM message WHERE time' 
    102           ' BETWEEN %s AND %s' % (start, stop)) 
     102        sql = 'SELECT id, author, time, forum, topic, (SELECT name FROM forum f' \ 
     103          ' WHERE f.id = message.forum), (SELECT subject FROM topic t WHERE' \ 
     104          ' t.id = message.topic) FROM message WHERE time BETWEEN %s AND %s' \ 
     105          % (start, stop) 
     106        self.log.debug(sql) 
     107        cursor.execute(sql) 
    103108        for row in cursor: 
    104109            row = dict(zip(columns, row)) 
  • discussionplugin/0.9/tracdiscussion/wiki.py

    r804 r836  
    2626        if ns == 'forum': 
    2727            columns = ('subject',) 
    28             cursor.execute('SELECT subject FROM forum WHERE id = %s', id) 
     28            sql = 'SELECT subject FROM forum WHERE id = %s' % (id) 
     29            self.log.debug(sql) 
     30            cursor.execute(sql) 
    2931            for row in cursor: 
    3032                row = dict(zip(columns, row)) 
     
    3537        elif ns == 'topic': 
    3638            columns = ('forum', 'forum_subject', 'subject') 
    37             cursor.execute('SELECT forum, (SELECT subject FROM forum WHERE id =' 
    38               ' topic.forum), subject FROM topic WHERE id = %s', id) 
     39            sql = 'SELECT forum, (SELECT subject FROM forum WHERE id =' \ 
     40              ' topic.forum), subject FROM topic WHERE id = %s' % (id) 
     41            self.log.debug(sql) 
     42            cursor.execute(sql) 
    3943            for row in cursor: 
    4044                row = dict(zip(columns, row)) 
     
    4751        elif ns == 'message': 
    4852            columns = ('forum', 'topic', 'forum_subject', 'subject') 
    49             cursor.execute('SELECT forum, topic, (SELECT subject FROM forum' 
    50               ' WHERE id = message.forum), (SELECT subject FROM topic WHERE' 
    51               ' id = message.topic) FROM message WHERE id = %s' % (id)) 
     53            sql = 'SELECT forum, topic, (SELECT subject FROM forum WHERE id =' \ 
     54              ' message.forum), (SELECT subject FROM topic WHERE id =' \ 
     55              ' message.topic) FROM message WHERE id = %s' % (id) 
     56            self.log.debug(sql) 
     57            cursor.execute(sql) 
    5258            for row in cursor: 
    5359                row = dict(zip(columns, row))