Changeset 3373

Show
Ignore:
Timestamp:
03/16/08 16:53:29 (6 months ago)
Author:
Blackhex
Message:
  • mickem's spam filter patch applied to 0.10 branch
Files:

Legend:

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

    r1987 r3373  
    1515    'TracDiscussion.admin = tracdiscussion.admin', 
    1616    'TracDiscussion.search = tracdiscussion.search', 
    17     'TracDiscussion.notification = tracdiscussion.notification']}, 
     17    'TracDiscussion.notification = tracdiscussion.notification', 
     18    'TracDiscussion.spamfilter = tracdiscussion.spamfilter']}, 
    1819  install_requires = ['TracWebAdmin'], 
    1920  keywords = 'trac discussion', 
  • discussionplugin/0.10/tracdiscussion/admin.py

    r2541 r3373  
    11# -*- coding: utf8 -*- 
    22 
    3 from tracdiscussion.api import * 
     3import time 
     4 
    45from trac.core import * 
    5 from trac.perm import IPermissionRequestor 
    66from trac.web.chrome import add_stylesheet 
    77from trac.wiki import wiki_to_html, wiki_to_oneliner 
     8 
     9from trac.perm import IPermissionRequestor 
    810from webadmin.web_ui import IAdminPageProvider 
    9 import time 
     11 
     12from tracdiscussion.api import * 
    1013 
    1114class DiscussionWebAdmin(Component): 
     
    1518    """ 
    1619    implements(IAdminPageProvider) 
     20 
     21    # Extension points. 
     22    discussion_manipulators = ExtensionPoint(IDiscussionManipulator) 
    1723 
    1824    # IAdminPageProvider 
  • discussionplugin/0.10/tracdiscussion/api.py

    r2836 r3373  
    11# -*- coding: utf8 -*- 
    22 
    3 from tracdiscussion.notification import * 
     3import time 
     4 
    45from trac.core import * 
    56from trac.web.chrome import add_stylesheet 
     
    89from trac.util import format_datetime, pretty_timedelta 
    910from trac.util.text import to_unicode 
    10 import time 
     11 
     12from tracdiscussion.notification import * 
     13 
     14class InvalidDiscussionPost(TracError): 
     15    """Exception raised when a ticket fails validation.""" 
     16 
     17class IDiscussionManipulator(Interface): 
     18    """Miscellaneous manipulation of forum posts.""" 
     19 
     20    def validate_message(self, req, author, body): 
     21        """Validate a new message post in a topic. 
     22 
     23        Must return a list of `(field, message)` tuples, one for each problem 
     24        detected. `field` can be `None` to indicate an overall problem with the 
     25        ticket. Therefore, a return value of `[]` means everything is OK.""" 
     26 
     27    def validate_topic(self, req, author, subject, body): 
     28        """Validate a new topic. 
     29 
     30        Must return a list of `(field, message)` tuples, one for each problem 
     31        detected. `field` can be `None` to indicate an overall problem with the 
     32        ticket. Therefore, a return value of `[]` means everything is OK.""" 
    1133 
    1234class DiscussionApi(object): 
     
    1436        self.env = component.env 
    1537        self.log = component.log 
     38        self.discussion_manipulators = component.discussion_manipulators 
    1639 
    1740    # Main request processing function 
     
    533556                new_time = int(time.time()) 
    534557 
     558                # Manipulate new topic. 
     559                for manipulator in self.discussion_manipulators: 
     560                    for field, message in manipulator.validate_topic(req, 
     561                      new_author, new_subject, new_body): 
     562                        if field: 
     563                            raise InvalidDiscussionPost("The field %s in" 
     564                              " message is invalid: %s" % (field, message)) 
     565                        else: 
     566                            raise InvalidDiscussionPost("Invalid post: %s" % 
     567                              message) 
     568 
    535569                # Add topic. 
    536570                self.add_topic(cursor, forum['id'], new_subject, new_time, 
     
    642676                new_body = req.args.get('body') 
    643677                new_time = int(time.time()) 
     678 
     679                # Custom validation rules 
     680                for manipulator in self.discussion_manipulators: 
     681                    for field, message in manipulator.validate_message(req, 
     682                      new_author, new_body): 
     683                        if field: 
     684                            raise InvalidDiscussionPost("The field %s in" 
     685                              " message is invalid: %s" % (field, message)) 
     686                        else: 
     687                            raise InvalidDiscussionPost("Invalid post: %s" % 
     688                              message) 
    644689 
    645690                # Add message. 
  • discussionplugin/0.10/tracdiscussion/core.py

    r2541 r3373  
    11# -*- coding: utf8 -*- 
    22 
     3import re 
     4 
     5from trac.core import * 
     6from trac.config import Option 
     7from trac.util.html import html 
     8 
     9from trac.perm import IPermissionRequestor 
     10from trac.web.main import IRequestHandler 
     11from trac.web.chrome import INavigationContributor, ITemplateProvider 
     12 
    313from tracdiscussion.api import * 
    4 from trac.core import * 
    5 from trac.web.chrome import INavigationContributor, ITemplateProvider 
    6 from trac.web.main import IRequestHandler 
    7 from trac.config import Option 
    8 from trac.perm import IPermissionRequestor 
    9 from trac.util.html import html 
    10 import re 
    1114 
    1215class DiscussionCore(Component): 
     
    1720    implements(INavigationContributor, IRequestHandler, ITemplateProvider, 
    1821      IPermissionRequestor) 
     22 
     23    # Extension points. 
     24    discussion_manipulators = ExtensionPoint(IDiscussionManipulator) 
    1925 
    2026    title = Option('discussion', 'title', 'Discussion', 
  • discussionplugin/0.10/tracdiscussion/init.py

    r1482 r3373  
    33from trac.core import * 
    44from trac.db import * 
     5 
    56from trac.env import IEnvironmentSetupParticipant 
    67 
  • discussionplugin/0.10/tracdiscussion/search.py

    r2166 r3373  
    33from trac.core import * 
    44from trac.config import Option 
    5 from trac.Search import ISearchSource, shorten_result 
     5from trac.Search import shorten_result 
    66from trac import util 
     7 
     8from trac.Search import ISearchSource 
    79 
    810class DiscussionSearch(Component): 
  • discussionplugin/0.10/tracdiscussion/timeline.py

    r1987 r3373  
    11# -*- coding: utf8 -*- 
    22 
     3import time 
     4 
    35from trac.core import * 
    4 from trac.Timeline import ITimelineEventProvider 
    56from trac.wiki import wiki_to_html, wiki_to_oneliner 
    67from trac.util import Markup 
    78from trac.util.html import html 
    8 import time 
     9 
     10from trac.Timeline import ITimelineEventProvider 
    911 
    1012class DiscussionTimeline(Component): 
     
    1618 
    1719    # ITimelineEventProvider 
     20 
    1821    def get_timeline_events(self, req, start, stop, filters): 
    1922        self.log.debug("start: %s, stop: %s, filters: %s" % (start, stop, 
  • discussionplugin/0.10/tracdiscussion/wiki.py

    r2836 r3373  
    2323    implements(IWikiSyntaxProvider, IWikiMacroProvider, IRequestFilter) 
    2424 
     25    # Extension points. 
     26    discussion_manipulators = ExtensionPoint(IDiscussionManipulator) 
     27 
    2528    # IWikiSyntaxProvider methods 
     29 
    2630    def get_link_resolvers(self): 
    2731        yield ('forum', self._discussion_link) 
     
    3337 
    3438    # IWikiMacroProvider methods 
     39 
    3540    def get_macros(self): 
    3641        yield 'ViewTopic'