Changeset 2352

Show
Ignore:
Timestamp:
06/29/07 16:47:01 (1 year ago)
Author:
Blackhex
Message:

DiscussionPlugin:

Partial commit because of commition error.

Files:

Legend:

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

    r1987 r2352  
    66setup( 
    77  name = 'TracDiscussion', 
    8   version = '0.5', 
     8  version = '0.6', 
    99  packages = ['tracdiscussion', 'tracdiscussion.db'], 
    10   package_data = {'tracdiscussion' : ['templates/*.cs', 'htdocs/css/*.css']}, 
     10  package_data = {'tracdiscussion' : ['templates/*.html', 'templates/*.txt', 'htdocs/css/*.css']}, 
    1111  entry_points = {'trac.plugins': ['TracDiscussion.core = tracdiscussion.core', 
    1212    'TracDiscussion.init = tracdiscussion.init', 
     
    1616    'TracDiscussion.search = tracdiscussion.search', 
    1717    'TracDiscussion.notification = tracdiscussion.notification']}, 
    18   install_requires = ['TracWebAdmin'], 
     18  install_requires = [''], 
    1919  keywords = 'trac discussion', 
    20   author = 'Alec Thomas, Radek Bartoň', 
    21   author_email = 'trac-hacks@swapoff.org', 
     20  author = 'Radek Bartoň, Alec Thomas', 
     21  author_email = 'blackhex@post.cz', 
    2222  url = 'http://trac-hacks.swapoff.org/wiki/DiscussionPlugin', 
    2323  description = 'Discussion forum plugin for Trac', 
  • discussionplugin/0.11/tracdiscussion/admin.py

    r1482 r2352  
    11# -*- coding: utf8 -*- 
    22 
    3 from tracdiscussion.api import * 
     3import time 
     4 
    45from trac.core import * 
    5 from trac.perm import IPermissionRequestor 
     6from trac.context import Context 
    67from trac.web.chrome import add_stylesheet 
    78from trac.wiki import wiki_to_html, wiki_to_oneliner 
    8 from webadmin.web_ui import IAdminPageProvider 
    9 import time 
     9 
     10from trac.perm import IPermissionRequestor 
     11from trac.admin import IAdminPanelProvider 
     12 
     13from tracdiscussion.api import * 
    1014 
    1115class DiscussionWebAdmin(Component): 
     
    1418        via WebAdminPlugin. 
    1519    """ 
    16     implements(IAdminPageProvider) 
     20    implements(IAdminPanelProvider) 
    1721 
    1822    # IAdminPageProvider 
    19     def get_admin_pages(self, req): 
     23    def get_admin_panels(self, req): 
    2024        if req.perm.has_permission('DISCUSSION_ADMIN'): 
    2125            yield ('discussion', 'Discussion System', 'group', 'Forum Groups') 
    2226            yield ('discussion', 'Discussion System', 'forum', 'Forums') 
    2327 
    24     def process_admin_request(self, req, category, page, path_info): 
     28    def render_admin_panel(self, req, category, page, path_info): 
    2529        # Prepare request object 
    2630        if page == 'forum': 
     
    3236            if path_info: 
    3337                req.args['group'] = path_info 
    34         req.args['component'] = 'admin' 
    3538 
    36         # Get database access 
    37         db = self.env.get_db_cnx() 
    38         cursor = db.cursor() 
     39        # Create request context. 
     40        context = Context(self.env, req)('discussion-admin') 
     41        context.cursor = context.db.cursor() 
     42 
     43        # Process request. 
     44        api = DiscussionApi() 
     45        content = api.process_discussion(context) 
     46        context.db.commit() 
    3947 
    4048        # Retrun page content 
    41         api = DiscussionApi(self, req) 
    42         content = api.render_discussion(req, cursor) 
    43         db.commit() 
    4449        return content 
  • discussionplugin/0.11/tracdiscussion/api.py

    r2273 r2352  
    11# -*- coding: utf8 -*- 
    22 
     3import time, datetime 
     4 
     5from trac.core import * 
     6from trac.web.chrome import add_stylesheet, add_script 
     7from trac.wiki.formatter import format_to_html, format_to_oneliner 
     8from trac.perm import PermissionError 
     9from trac.util.datefmt import format_datetime, pretty_timedelta, FixedOffset 
     10 
     11from genshi.template import TemplateLoader 
     12 
    313from tracdiscussion.notification import * 
    4 from trac.core import * 
    5 from trac.web.chrome import add_stylesheet 
    6 from trac.wiki import wiki_to_html, wiki_to_oneliner 
    7 from trac.perm import PermissionError 
    8 from trac.util import format_datetime, pretty_timedelta 
    9 import time 
     14 
     15utc = FixedOffset(0, 'UTC') 
    1016 
    1117class DiscussionApi(object): 
    12     def __init__(self, component, req): 
    13         self.env = component.env 
    14         self.log = component.log 
     18 
     19    def __init__(self): 
     20        self.data = {} 
    1521 
    1622    # Main request processing function 
    1723 
    18     def render_discussion(self, req, cursor): 
    19         # Get request mode 
    20         group, forum, topic, message = self._get_items(req, cursor) 
    21         modes = self._get_modes(req, group, forum, topic, message) 
    22         self.log.debug('modes: %s' % modes) 
     24    def process_discussion(self, context): 
     25        # Get request items and modes. 
     26        group, forum, topic, message = self._get_items(context) 
     27        modes = self._get_modes(context, group, forum, topic, message) 
     28 
     29        # Debug 
     30        context.env.log.debug(group) 
     31        context.env.log.debug(forum) 
     32        context.env.log.debug(topic) 
     33        context.env.log.debug(message) 
     34        context.env.log.debug(modes) 
    2335 
    2436        # Determine moderator rights. 
     37        is_moderator = forum and (context.req.authname in forum['moderators']) \ 
     38          or context.req.perm.has_permission('DISCUSSION_ADMIN') 
     39 
     40        # Add CSS styles 
     41        add_stylesheet(context.req, 'common/css/wiki.css') 
     42        add_stylesheet(context.req, 'discussion/css/discussion.css') 
     43        add_stylesheet(context.req, 'discussion/css/admin.css') 
     44 
     45        add_script(context.req, 'common/js/trac.js') 
     46        add_script(context.req, 'common/js/search.js') 
     47        add_script(context.req, 'common/js/wikitoolbar.js') 
     48 
     49        # Perform mode actions 
     50        self._do_action(context, modes, group, forum, topic, message, 
     51          is_moderator) 
     52 
     53        # Fill up template data struture. 
     54        self.data['authname'] = context.req.authname 
     55        self.data['is_moderator'] = is_moderator 
     56        self.data['group'] = group 
     57        self.data['forum'] = forum 
     58        self.data['topic'] = topic 
     59        self.data['message'] = message 
     60        self.data['mode'] = modes[-1] 
     61        self.data['time'] = format_datetime(datetime.datetime.now(utc)) 
     62        self.data['realm'] = context.realm 
     63 
     64        # Convert group, forum topic and message values for pressentation. 
     65        if group: 
     66            group['name'] = format_to_oneliner(context, group['name']) 
     67            group['description'] = format_to_oneliner(context, 
     68              group['description']) 
    2569        if forum: 
    26             is_moderator = (req.authname in forum['moderators']) or \ 
    27               req.perm.has_permission('DISCUSSION_ADMIN') 
    28         else: 
    29             is_moderator = req.perm.has_permission('DISCUSSION_ADMIN') 
    30  
    31         # Perform mode actions 
    32         self._do_action(req, cursor, modes, group, forum, topic, message, 
    33           is_moderator) 
    34  
    35         # Add CSS styles 
    36         add_stylesheet(req, 'common/css/wiki.css') 
    37         add_stylesheet(req, 'discussion/css/discussion.css') 
    38         add_stylesheet(req, 'discussion/css/admin.css') 
    39  
    40         # Fill up HDF structure and return template 
    41         req.hdf['discussion.authname'] = req.authname 
    42         req.hdf['discussion.is_moderator'] = is_moderator 
    43         if group: 
    44             group['name'] = wiki_to_oneliner(group['name'], self.env) 
    45             group['description'] = wiki_to_oneliner(group['description'], 
    46               self.env) 
    47             req.hdf['discussion.group'] = group 
    48         if forum: 
    49             forum['name'] = wiki_to_oneliner(forum['name'], self.env) 
    50             forum['description'] = wiki_to_oneliner(forum['description'], 
    51               self.env) 
    52             forum['subject'] = wiki_to_oneliner(forum['subject'], self.env) 
     70            forum['name'] = format_to_oneliner(context, forum['name']) 
     71            forum['subject'] = format_to_oneliner(context, forum['subject']) 
     72            forum['description'] = format_to_oneliner(context, 
     73              forum['description']) 
    5374            forum['time'] = format_datetime(forum['time']) 
    54             req.hdf['discussion.forum'] = forum 
    5575        if topic: 
    56             topic['subject'] = wiki_to_oneliner(topic['subject'], self.env
    57             topic['author'] = wiki_to_oneliner(topic['author'], self.env
    58             topic['body'] = wiki_to_html(topic['body'], self.env, req
     76            topic['subject'] = format_to_oneliner(context, topic['subject']
     77            topic['author'] = format_to_oneliner(context, topic['author']
     78            topic['body'] = format_to_html(context, topic['body']
    5979            topic['time'] = format_datetime(topic['time']) 
    60             req.hdf['discussion.topic'] = topic 
    6180        if message: 
    62             message['author'] = wiki_to_oneliner(message['author'], self.env
    63             message['body'] = wiki_to_html(message['body'], self.env, req
     81            message['author'] = format_to_oneliner(context, message['author']
     82            message['body'] = format_to_html(context, message['body']
    6483            message['time'] = format_datetime(message['time']) 
    65             req.hdf['discussion.message'] = message 
    66         req.hdf['discussion.mode'] = modes[-1] 
    67         req.hdf['discussion.time'] = format_datetime(time.time()) 
    68         return modes[-1] + '.cs', None 
    69  
    70     def _get_items(self, req, cursor): 
     84 
     85        # Return template and data. 
     86        return modes[-1] + '.html', {'discussion' : self.data} 
     87 
     88    def _get_items(self, context): 
    7189        group, forum, topic, message = None, None, None, None 
    7290 
    7391        # Populate active group 
    74         if req.args.has_key('group'): 
    75             group_id = int(req.args.get('group') or 0) 
    76             group = self.get_group(cursor, group_id) 
     92        if context.req.args.has_key('group'): 
     93            group_id = int(context.req.args.get('group') or 0) 
     94            group = self.get_group(context, group_id) 
    7795 
    7896        # Populate active forum 
    79         if req.args.has_key('forum'): 
    80             forum_id = int(req.args.get('forum') or 0) 
    81             forum = self.get_forum(cursor, forum_id) 
     97        if context.req.args.has_key('forum'): 
     98            forum_id = int(context.req.args.get('forum') or 0) 
     99            forum = self.get_forum(context, forum_id) 
    82100 
    83101        # Populate active topic 
    84         if req.args.has_key('topic'): 
    85             topic_id = int(req.args.get('topic') or 0) 
    86             topic = self.get_topic(cursor, topic_id) 
     102        if context.req.args.has_key('topic'): 
     103            topic_id = int(context.req.args.get('topic') or 0) 
     104            topic = self.get_topic(context, topic_id) 
    87105 
    88106        # Populate active topic 
    89         if req.args.has_key('message'): 
    90             message_id = int(req.args.get('message') or 0) 
    91             message = self.get_message(cursor, message_id) 
    92  
    93         self.log.debug('group: %s' % group) 
    94         self.log.debug('forum: %s' % forum) 
    95         self.log.debug('topic: %s' % topic) 
    96         self.log.debug('message: %s' % message) 
     107        if context.req.args.has_key('message'): 
     108            message_id = int(context.req.args.get('message') or 0) 
     109            message = self.get_message(context, message_id) 
     110 
    97111        return group, forum, topic, message 
    98112 
    99     def _get_modes(self, req, group, forum, topic, message): 
     113    def _get_modes(self, context, group, forum, topic, message): 
    100114        # Get action 
    101         component = req.args.get('component') 
    102         action = req.args.get('discussion_action') 
    103         preview = req.args.has_key('preview'); 
    104         submit = req.args.has_key('submit'); 
    105         self.log.debug('component: %s' % component) 
    106         self.log.debug('action: %s' % action) 
    107  
    108         if component == 'admin': 
    109             req.hdf['discussion.href'] = req.href.admin('discussion') 
    110         elif component == 'wiki': 
    111             req.hdf['discussion.href'] = req.href(req.path_info) 
    112         else: 
    113             req.hdf['discussion.href'] = req.href.discussion() 
    114         req.hdf['discussion.component'] = component 
     115        action = context.req.args.get('discussion_action') 
     116        preview = context.req.args.has_key('preview'); 
     117        submit = context.req.args.has_key('submit'); 
    115118 
    116119        # Determine mode 
    117120        if message: 
    118             if component == 'admin': 
     121            if context.realm == 'discussion-admin': 
    119122                pass 
    120             elif component == 'wiki': 
     123            elif context.realm == 'discussion-wiki': 
    121124                if action == 'add': 
    122                     return ['wiki-message-list'] 
     125                    return ['message-add', 'wiki-message-list'] 
    123126                elif action == 'quote': 
    124127                    return ['message-quote', 'wiki-message-list'] 
     
    143146            else: 
    144147                if action == 'add': 
    145                     return ['message-list'] 
     148                    return ['message-add', 'message-list'] 
    146149                elif action == 'quote': 
    147150                    return ['message-quote', 'message-list'] 
     
    165168                    return ['message-list'] 
    166169        if topic: 
    167             if component == 'admin': 
     170            if context.realm == 'discussion-admin': 
    168171                pass 
    169             elif component == 'wiki': 
     172            elif context.realm == 'discussion-wiki': 
    170173                if action == 'add': 
    171                     return ['wiki-message-list'] 
     174                    return ['message-add', 'wiki-message-list'] 
    172175                elif action == 'quote': 
    173176                    return ['topic-quote','wiki-message-list'] 
     
    190193            else: 
    191194                if action == 'add': 
    192                     return ['message-list'] 
     195                    return ['message-add', 'message-list'] 
    193196                elif action == 'quote': 
    194197                    return ['topic-quote', 'message-list'] 
     
    216219                    return ['message-list'] 
    217220        elif forum: 
    218             if component == 'admin': 
     221            if context.realm == 'discussion-admin': 
    219222                if action == 'post-edit': 
    220223                    return ['forum-post-edit', 'admin-forum-list'] 
    221224                else: 
    222225                    return ['admin-forum-list'] 
    223             elif component == 'wiki': 
     226            elif context.realm == 'discussion-wiki': 
    224227                return ['wiki-message-list'] 
    225228            else: 
     
    236239                    return ['topic-list'] 
    237240        elif group: 
    238             if component == 'admin': 
     241            if context.realm == 'discussion-admin': 
    239242                if action == 'post-add': 
    240243                    return ['forum-post-add', 'admin-forum-list'] 
     
    248251                    else: 
    249252                        return ['admin-forum-list'] 
    250             elif component == 'wiki': 
     253            elif context.realm == 'discussion-wiki': 
    251254                return ['wiki-message-list'] 
    252255            else: 
     
    256259                    return ['forum-list'] 
    257260        else: 
    258             if component == 'admin': 
     261            if context.realm == 'discussion-admin': 
    259262                if action == 'post-add': 
    260263                    return ['group-post-add', 'admin-group-list'] 
     
    263266                else: 
    264267                    return ['admin-group-list'] 
    265             elif component == 'wiki': 
     268            elif context.realm == 'discussion-wiki': 
    266269                return ['wiki-message-list'] 
    267270            else: 
     
    273276                    return ['forum-list'] 
    274277 
    275     def _do_action(self, req, cursor, modes, group, forum, topic, message, 
     278    def _do_action(self, context, modes, group, forum, topic, message, 
    276279      is_moderator): 
    277280        for mode in modes: 
    278             self.log.debug('doing %s mode action' % (mode,)) 
    279281            if mode == 'group-list': 
    280                 req.perm.assert_permission('DISCUSSION_VIEW') 
     282                context.req.perm.assert_permission('DISCUSSION_VIEW') 
    281283 
    282284                # Display groups. 
    283                 req.hdf['discussion.groups'] = self.get_groups(req, cursor
     285                self.data['groups'] = self.get_groups(context
    284286 
    285287            elif mode == 'admin-group-list': 
    286                 req.perm.assert_permission('DISCUSSION_ADMIN') 
     288                context.req.perm.assert_permission('DISCUSSION_ADMIN') 
    287289 
    288290                # Get form values 
    289                 order = req.args.get('order') or 'id' 
    290                 desc = req.args.get('desc') 
     291                order = context.req.args.get('order') or 'id' 
     292                desc = context.req.args.get('desc') 
     293 
     294                # Prepare values for edit form. 
     295                if group: 
     296                    self.data['name'] = group['name'] 
     297                    self.data['description'] = group['description'] 
    291298 
    292299                # Display groups. 
    293                 req.hdf['discussion.order'] = order 
    294                 req.hdf['discussion.desc'] = desc 
    295                 if group: 
    296                     req.hdf['discussion.name'] = group['name'] 
    297                     req.hdf['discussion.description'] = \ 
    298                       group['description'] 
    299                 req.hdf['discussion.groups'] = self.get_groups(req, cursor, order, desc) 
     300                self.data['order'] = order 
     301                self.data['desc'] = desc 
     302                self.data['groups'] = self.get_groups(context, order, desc) 
    300303 
    301304            elif mode == 'group-add': 
    302                 req.perm.assert_permission('DISCUSSION_ADMIN') 
     305                context.req.perm.assert_permission('DISCUSSION_ADMIN') 
    303306 
    304307            elif mode == 'group-post-add': 
    305                 req.perm.assert_permission('DISCUSSION_ADMIN') 
     308                context.req.perm.assert_permission('DISCUSSION_ADMIN') 
    306309 
    307310                # Get form values. 
    308                 new_name = req.args.get('name') 
    309                 new_description = req.args.get('description') 
     311                new_name = context.req.args.get('name') 
     312                new_description = context.req.args.get('description') 
    310313 
    311314                # Add new group. 
    312                 self.add_group(cursor, new_name, new_description) 
     315                self.add_group(context, new_name, new_description) 
    313316 
    314317            elif mode == 'group-post-edit': 
    315                 req.perm.assert_permission('DISCUSSION_ADMIN') 
     318                context.req.perm.assert_permission('DISCUSSION_ADMIN') 
    316319 
    317320                # Get form values. 
    318                 new_group = int(req.args.get('group') or 0) 
    319                 new_name = req.args.get('name') 
    320                 new_description = req.args.get('description') 
     321                new_group = int(context.req.args.get('group') or 0) 
     322                new_name = context.req.args.get('name') 
     323                new_description = context.req.args.get('description') 
    321324 
    322325                # Edit group. 
    323                 self.edit_group(cursor, new_group, new_name, new_description) 
     326                self.edit_group(context, new_group, new_name, new_description) 
    324327 
    325328            elif mode == 'group-delete': 
    326                 req.perm.assert_permission('DISCUSSION_ADMIN') 
     329                context.req.perm.assert_permission('DISCUSSION_ADMIN') 
    327330 
    328331            elif mode == 'groups-delete': 
    329                 req.perm.assert_permission('DISCUSSION_ADMIN') 
     332                context.req.perm.assert_permission('DISCUSSION_ADMIN') 
    330333 
    331334                # Get selected groups. 
    332                 selection = req.args.get('selection') 
     335                selection = context.req.args.get('selection') 
    333336                if isinstance(selection, (str, unicode)): 
    334337                    selection = [selection] 
     
    337340                if selection: 
    338341                    for group_id in selection: 
    339                         self.delete_group(cursor, int(group_id)) 
     342                        self.delete_group(context, int(group_id)) 
    340343 
    341344            elif mode == 'forum-list': 
    342                 req.perm.assert_permission('DISCUSSION_VIEW') 
     345                context.req.perm.assert_permission('DISCUSSION_VIEW') 
    343346 
    344347                # Get form values 
    345                 order = req.args.get('order') or 'id' 
    346                 desc = req.args.get('desc') 
     348                order = context.req.args.get('order') or 'id' 
     349                desc = context.req.args.get('desc') 
    347350 
    348351                # Display forums. 
    349                 req.hdf['discussion.order'] = order 
    350                 req.hdf['discussion.desc'] = desc 
    351                 req.hdf['discussion.groups'] = self.get_groups(req, cursor
    352                 req.hdf['discussion.forums'] = self.get_forums(req, cursor, 
    353                   order, desc) 
     352                self.data['order'] = order 
     353                self.data['desc'] = desc 
     354                self.data['groups'] = self.get_groups(context
     355                self.data['forums'] = self.get_forums(context, order, desc) 
     356                self.data['forum'] = None 
    354357 
    355358            elif mode == 'admin-forum-list': 
    356                 req.perm.assert_permission('DISCUSSION_ADMIN') 
     359                context.req.perm.assert_permission('DISCUSSION_ADMIN') 
     360 
     361                # Get ordering arguments values 
     362                order = context.req.args.get('order') or 'id' 
     363                desc = context.req.args.get('desc') 
     364 
     365                # Prepare values for edit form. 
     366                if forum: 
     367                    self.data['name'] = forum['name'] 
     368                    self.data['subject'] = forum['subject'] 
     369                    self.data['description'] = forum['description'] 
     370                    self.data['moderators'] = forum['moderators'] 
     371                    self.data['group'] = forum['group'] 
     372 
     373                # Display forums. 
     374                self.data['order'] = order 
     375                self.data['desc'] = desc 
     376                self.data['users'] = self.get_users(context) 
     377                self.data['groups'] = self.get_groups(context) 
     378                self.data['forums'] = self.get_forums(context, order, desc) 
     379 
     380            elif mode == 'forum-add': 
     381                context.req.perm.assert_permission('DISCUSSION_ADMIN') 
     382 
     383                # Display Add Forum form. 
     384                self.data['users'] = self.get_users(context) 
     385                self.data['groups'] = self.get_groups(context) 
     386 
     387            elif mode == 'forum-post-add': 
     388                context.req.perm.assert_permission('DISCUSSION_ADMIN') 
    357389 
    358390                # Get form values 
    359                 order = req.args.get('order') or 'id' 
    360                 desc = req.args.get('desc') 
    361  
    362                 # Display forums. 
    363                 req.hdf['discussion.order'] = order 
    364                 req.hdf['discussion.desc'] = desc 
    365                 self.log.debug(forum) 
    366                 if forum: 
    367                     req.hdf['discussion.name'] = forum['name'] 
    368                     req.hdf['discussion.subject'] = forum['subject'] 
    369                     req.hdf['discussion.description'] = \ 
    370                       forum['description'] 
    371                     req.hdf['discussion.moderators'] = forum['moderators'] 
    372                     req.hdf['discussion.group'] = forum['group'] 
    373                 req.hdf['discussion.users'] = self.get_users() 
    374                 req.hdf['discussion.groups'] = self.get_groups(req, cursor) 
    375                 req.hdf['discussion.forums'] = self.get_forums(req, cursor, 
    376                   order, desc) 
    377  
    378             elif mode == 'forum-add': 
    379                 req.perm.assert_permission('DISCUSSION_ADMIN') 
    380  
    381                 # Display Add Forum form. 
    382                 req.hdf['discussion.users'] = self.get_users() 
    383                 req.hdf['discussion.groups'] = self.get_groups(req, cursor) 
    384  
    385             elif mode == 'forum-post-add': 
    386                 req.perm.assert_permission('DISCUSSION_ADMIN') 
    387  
    388                 # Get form values 
    389                 new_name = req.args.get('name') 
    390                 new_author = req.authname 
    391                 new_subject = req.args.get('subject') 
    392                 new_description = req.args.get('description') 
    393                 new_moderators = req.args.get('moderators') 
    394                 new_group = int(req.args.get('group') or 0) 
     391                new_name = context.req.args.get('name') 
     392                new_author = context.req.authname 
     393                new_subject = context.req.args.get('subject') 
     394                new_description = context.req.args.get('description') 
     395                new_moderators = context.req.args.get('moderators') 
     396                new_group = int(context.req.args.get('group') or 0) 
    395397                if not new_moderators: 
    396398                    new_moderators = [] 
     
    399401 
    400402                # Perform new forum add. 
    401                 self.add_forum(cursor, new_name, new_author, new_subject, 
     403                self.add_forum(context, new_name, new_author, new_subject, 
    402404                   new_description, new_moderators, new_group) 
    403405 
    404406            elif mode == 'forum-post-edit': 
    405                 req.perm.assert_permission('DISCUSSION_ADMIN') 
     407                context.req.perm.assert_permission('DISCUSSION_ADMIN') 
    406408 
    407409                # Get form values. 
    408                 new_forum = int(req.args.get('forum') or 0) 
    409                 new_name = req.args.get('name') 
    410                 new_subject = req.args.get('subject') 
    411                 new_description = req.args.get('description') 
    412                 new_moderators = req.args.get('moderators') 
    413                 new_group = int(req.args.get('group') or 0) 
     410                new_forum = int(context.req.args.get('forum') or 0) 
     411                new_name = context.req.args.get('name') 
     412                new_subject = context.req.args.get('subject') 
     413                new_description = context.req.args.get('description') 
     414                new_moderators = context.req.args.get('moderators') 
     415                new_group = int(context.req.args.get('group') or 0) 
    414416                if not new_moderators: 
    415417                    new_moderators = [] 
     
    418420 
    419421                # Perform forum edit. 
    420                 self.edit_forum(cursor, new_forum, new_name, new_subject, 
     422                self.edit_forum(context, new_forum, new_name, new_subject, 
    421423                  new_description, new_moderators, new_group) 
    422424 
    423425            elif mode == 'forum-delete': 
    424                 req.perm.assert_permission('DISCUSSION_ADMIN') 
     426                context.req.perm.assert_permission('DISCUSSION_ADMIN') 
    425427 
    426428                # Delete forum 
    427                 self.delete_forum(cursor, forum['id']) 
     429                self.delete_forum(context, forum['id']) 
    428430 
    429431            elif mode == 'forums-delete': 
    430                 req.perm.assert_permission('DISCUSSION_ADMIN') 
     432                context.req.perm.assert_permission('DISCUSSION_ADMIN') 
    431433 
    432434                # Get selected forums. 
    433                 selection = req.args.get('selection') 
     435                selection = context.req.args.get('selection') 
    434436                if isinstance(selection, (str, unicode)): 
    435437                    selection = [selection] 
     
    438440                if selection: 
    439441                    for forum_id in selection: 
    440                         self.delete_forum(cursor, int(forum_id)) 
     442                        self.delete_forum(context, int(forum_id)) 
    441443 
    442444            elif mode == 'topic-list': 
    443                 req.perm.assert_permission('DISCUSSION_VIEW') 
     445                context.req.perm.assert_permission('DISCUSSION_VIEW') 
    444446 
    445447                # Get form values 
    446                 order = req.args.get('order') or 'id' 
    447                 desc = req.args.get('desc') 
     448                order = context.req.args.get('order') or 'id' 
     449                desc = context.req.args.get('desc') 
    448450 
    449451                # Display topics. 
    450                 req.hdf['discussion.order'] = order 
    451                 req.hdf['discussion.desc'] = desc 
    452                 req.hdf['discussion.topics'] = self.get_topics(req, cursor
    453                   forum['id'], order, desc) 
     452                self.data['order'] = order 
     453                self.data['desc'] = desc 
     454                self.data['topics'] = self.get_topics(context, forum['id']
     455                  order, desc) 
    454456 
    455457            elif mode == 'topic-add': 
    456                 req.perm.assert_permission('DISCUSSION_APPEND') 
     458                context.req.perm.assert_permission('DISCUSSION_APPEND') 
    457459 
    458460                # Get form values. 
    459                 new_subject = req.args.get('subject') 
    460                 new_author = req.args.get('author') 
    461                 new_body = req.args.get('body') 
     461                new_subject = context.req.args.get('subject') 
     462                new_author = context.req.args.get('author') 
     463                new_body = context.req.args.get('body') 
    462464 
    463465                # Display Add Topic form. 
    464466                if new_subject: 
    465                     req.hdf['discussion.subject'] = wiki_to_oneliner( 
    466                       new_subject, self.env
     467                    self.data['subject'] = format_to_oneliner(context, 
     468                      new_subject
    467469                if new_author: 
    468                     req.hdf['discussion.author'] = wiki_to_oneliner( 
    469                      new_author, self.env
     470                    self.data['author'] = format_to_oneliner(context, 
     471                      new_author
    470472                if new_body: 
    471                     req.hdf['discussion.body'] = wiki_to_html(new_body, 
    472                       self.env, req) 
     473                    self.data['body'] = format_to_html(context, new_body) 
    473474 
    474475            elif mode == 'topic-quote': 
    475                 req.perm.assert_permission('DISCUSSION_APPEND') 
     476                context.req.perm.assert_permission('DISCUSSION_APPEND') 
    476477 
    477478                # Prepare old content. 
     
    479480                for I in xrange(len(lines)): 
    480481                    lines[I] = '> %s' % (lines[I]) 
    481                 req.hdf['args.body'] = '\n'.join(lines) 
     482                context.req.args['body'] = '\n'.join(lines) 
     483 
     484                # Signalise that message is being added. 
     485                context.req.args['message'] = message and  message['id'] or '-1' 
    482486 
    483487            elif mode == 'topic-post-add': 
    484                 req.perm.assert_permission('DISCUSSION_APPEND') 
     488                context.req.perm.assert_permission('DISCUSSION_APPEND') 
    485489 
    486490                # Get form values. 
    487                 new_subject = req.args.get('subject') 
    488                 new_author = req.args.get('author') 
    489                 new_body = req.args.get('body') 
     491                new_subject = context.req.args.get('subject') 
     492                new_author = context.req.args.get('author') 
     493                new_body = context.req.args.get('body') 
    490494                new_time = int(time.time()) 
    491495 
    492496                # Add topic. 
    493                 self.log.debug(new_body) 
    494                 self.add_topic(cursor, forum['id'], new_subject, new_time, 
     497                self.add_topic(context, forum['id'], new_subject, new_time, 
    495498                  new_author, new_body) 
    496499 
    497500                # Get new popic and notify about creation. 
    498                 new_topic = self.get_topic_by_time(cursor, new_time) 
    499                 self.log.debug(new_topic) 
    500                 to = self.get_topic_to_recipients(cursor, new_topic['id']) 
    501                 cc = self.get_topic_cc_recipients(cursor, new_topic['id']) 
    502                 notifier = DiscussionNotifyEmail(self.env) 
    503                 notifier.notify(req, cursor, mode, forum, new_topic, None, to, 
    504                   cc) 
     501                new_topic = self.get_topic_by_time(context, new_time) 
     502                to = self.get_topic_to_recipients(context, new_topic['id']) 
     503                cc = self.get_topic_cc_recipients(context, new_topic['id']) 
     504                notifier = DiscussionNotifyEmail(context.env) 
     505                notifier.notify(context, mode, forum, new_topic, None, to, cc) 
    505506 
    506507            elif mode == 'topic-edit': 
    507                 req.perm.assert_permission('DISCUSSION_APPEND') 
    508                 if not is_moderator and (topic['author'] != req.authname): 
     508                context.req.perm.assert_permission('DISCUSSION_APPEND') 
     509                if not is_moderator and (topic['author'] != 
     510                  context.req.authname): 
    509511                    raise PermissionError('Topic edit') 
    510512 
    511513                # Prepare form values. 
    512                 req.args['subject'] = topic['subject'] 
    513                 req.args['body'] = topic['body'] 
    514                 req.hdf['args.subject'] = topic['subject'] 
    515                 req.hdf['args.body'] = topic['body'] 
     514                context.req.args['subject'] = topic['subject'] 
     515                context.req.args['body'] = topic['body'] 
    516516 
    517517            elif mode == 'topic-post-edit': 
    518                 req.perm.assert_permission('DISCUSSION_APPEND') 
    519                 if not is_moderator and (topic['author'] != req.authname): 
     518                context.req.perm.assert_permission('DISCUSSION_APPEND') 
     519                if not is_moderator and (topic['author'] !=  
     520                  context.req.authname): 
    520521                    raise PermissionError('Topic edit') 
    521522 
    522523                # Get form values. 
    523                 new_subject = req.args.get('subject') 
    524                 new_body = req.args.get('body') 
     524                new_subject = context.req.args.get('subject') 
     525                new_body = context.req.args.get('body') 
    525526 
    526527                # Edit topic. 
    527528                topic['subject'] = new_subject 
    528529                topic['body'] = new_body 
    529                 self.edit_topic(cursor, topic['id'], topic['forum'], 
    530                   new_subject, new_body
     530                self.edit_topic(context, topic['id'], topic['forum'], 
     531                  topic['subject'], topic['body']
    531532 
    532533            elif mode == 'topic-move': 
    533                 req.perm.assert_permission('DISCUSSION_MODERATE') 
     534                context.req.perm.assert_permission('DISCUSSION_MODERATE') 
    534535                if not is_moderator: 
    535536                    raise PermissionError('Forum moderate') 
    536537 
    537538                # Display Move Topic form 
    538                 req.hdf['discussion.forums'] = self.get_forums(req, cursor
     539                self.data['forums'] = self.get_forums(context
    539540 
    540541            elif mode == 'topic-post-move': 
    541                 req.perm.assert_permission('DISCUSSION_MODERATE') 
     542                context.req.perm.assert_permission('DISCUSSION_MODERATE') 
    542543                if not is_moderator: 
    543544                    raise PermissionError('Forum moderate') 
    544545 
    545546                # Get form values 
    546                 new_forum = int(req.args.get('new_forum') or 0) 
     547                new_forum = int(context.req.args.get('new_forum') or 0) 
    547548 
    548549                # Move topic. 
    549                 self.set_forum(cursor, topic['id'], new_forum) 
     550                self.set_forum(context, topic['id'], new_forum) 
    550551 
    551552            elif mode == 'topic-delete': 
    552                 req.perm.assert_permission('DISCUSSION_MODERATE') 
     553                context.req.perm.assert_permission('DISCUSSION_MODERATE') 
    553554                if not is_moderator: 
    554555                    raise PermissionError('Forum moderate') 
    555556 
    556557                # Delete topic. 
    557                 self.delete_topic(cursor, topic['id']) 
     558                self.delete_topic(context, topic['id']) 
    558559 
    559560            elif mode == 'message-list': 
    560                 req.perm.assert_permission('DISCUSSION_VIEW') 
    561                 self._prepare_message_list(req, cursor, topic) 
     561                context.req.perm.assert_permission('DISCUSSION_VIEW') 
     562                self._prepare_message_list(context, topic) 
    562563 
    563564            elif mode == 'wiki-message-list': 
    564565                if topic: 
    565                     self._prepare_message_list(req, cursor, topic) 
     566                    self._prepare_message_list(context, topic) 
     567 
     568            elif mode == 'message-add': 
     569                context.req.perm.assert_permission('DISCUSSION_APPEND') 
     570 
     571                # Signalise that message is being added. 
     572                context.req.args['message'] = message and  message['id'] or '-1' 
    566573 
    567574            elif mode == 'message-quote': 
    568                 req.perm.assert_permission('DISCUSSION_APPEND') 
     575                context.req.perm.assert_permission('DISCUSSION_APPEND') 
    569576 
    570577                # Prepare old content. 
     
    572579                for I in xrange(len(lines)): 
    573580                    lines[I] = '> %s' % (lines[I]) 
    574                 req.hdf['args.body'] = '\n'.join(lines) 
     581                context.req.args['body'] = '\n'.join(lines) 
    575582 
    576583            elif mode == 'message-post-add': 
    577                 req.perm.assert_permission('DISCUSSION_APPEND')&n