Changeset 3107

Show
Ignore:
Timestamp:
01/20/08 01:44:43 (10 months ago)
Author:
ixokai
Message:

Bumped version to 0.2.
Basic functionality for tickets and wiki notifications appear functional and complete.
Normalized session/authentication handling throughout the system to support anonymous-announcements and authenticated-announcements.
Updated the wiki and ticket templates to be more complete.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • announcerplugin/0.11/announcerplugin/api.py

    r3064 r3107  
    3939         
    4040        Each subscription that is returned is in the form of: 
    41             ('transport', 'name', 'address') 
     41            ('transport', 'name', authenticated, 'address') 
    4242         
    4343        The transport should be one that a distributor (and formatter) can 
     
    195195    """Handles mapping Trac usernames to addresses for distributors to use.""" 
    196196     
    197     def get_address_for_name(name): 
     197    def get_address_for_name(name, authenticated): 
    198198        """Accepts a session name, and returns an address. 
    199199         
     
    343343                if ('*' in categories) or (evt.category in categories): 
    344344                    supported_subscribers.append(sp) 
    345          
     345             
    346346            self.log.debug( 
    347347                "AnnouncementSystem found the following subscribers capable of " 
     
    349349                ', '.join([ss.__class__.__name__ for ss in supported_subscribers])) 
    350350            ) 
    351          
     351             
    352352            subscriptions = set() 
    353353            for sp in supported_subscribers: 
     
    355355                    x for x in sp.get_subscriptions_for_event(evt) if x 
    356356                ) 
    357          
     357             
    358358            self.log.debug( 
    359359                "AnnouncementSystem has found the following subscriptions: %s" % ( 
    360360                    ', '.join( 
    361                         ['(%s via %s)' % ((s[1] or s[2]), s[0]) for s in subscriptions] 
     361                        ['[%s(%s) via %s]' % ((s[1] or s[3]), s[2] and 'authenticated' or 'not authenticated',s[0]) for s in subscriptions] 
    362362                    ) 
    363363                ) 
    364364            ) 
    365          
     365             
    366366            packages = {} 
    367             for transport, target, address in subscriptions: 
     367            for transport, sid, authenticated, address in subscriptions: 
    368368                if transport not in packages: 
    369369                    packages[transport] = set() 
    370370             
    371                 packages[transport].add((target,address)) 
     371                packages[transport].add((sid,authenticated,address)) 
    372372             
    373373            for distributor in self.distributors: 
  • announcerplugin/0.11/announcerplugin/distributors/email_distributor.py

    r3051 r3107  
    153153            messages = {} 
    154154 
    155             for name, address in recipients: 
     155            for name, authenticated, address in recipients: 
    156156                if name: 
    157                     format = self._get_preferred_format(event.realm, name
     157                    format = self._get_preferred_format(event.realm, name, authenticated
    158158                else: 
    159159                    format = self._get_default_format() 
     
    164164                if name and not address: 
    165165                    for resolver in self.resolvers: 
    166                         address = resolver.get_address_for_name(name
     166                        address = resolver.get_address_for_name(name, authenticated
    167167                        if address: 
    168                             self.log.debug("EmailDistributor found the address '%s' for '%s' via: %s" % ( 
    169                                     address, name, resolver.__class__.__name__ 
     168                            self.log.debug("EmailDistributor found the address '%s' for '%s (%s)' via: %s" % ( 
     169                                    address, name, authenticated and 'authenticated' or 'not authenticated',  
     170                                    resolver.__class__.__name__ 
    170171                                ) 
    171172                            ) 
     
    173174                             
    174175                if address: 
    175                     messages[format].add((name, address)) 
     176                    messages[format].add((name, authenticated, address)) 
    176177                else: 
    177                     self.log.debug("EmailDistributor was unable to find an address for: %s" % name) 
     178                    self.log.debug("EmailDistributor was unable to find an address for: %s (%s)" % ( 
     179                            name, authenticated and 'authenticated' or 'not authenticated' 
     180                        ) 
     181                    ) 
    178182                     
    179183            for format in messages.keys(): 
     
    181185                    self.log.debug( 
    182186                        "EmailDistributor is sending event as '%s' to: %s" % ( 
    183                             format, ', '.join( 
    184                                 ('%s <%s>' % (name, address) for name, address in messages[format]) 
    185                             ) 
     187                            format, ', '.join(x[2] for x in messages[format]) 
    186188                        ) 
    187189                    ) 
     
    191193        return self.default_email_format 
    192194         
    193     def _get_preferred_format(self, realm, sid): 
     195    def _get_preferred_format(self, realm, sid, authenticated): 
    194196        db = self.env.get_db_cnx() 
    195197        cursor = db.cursor() 
     
    199201              FROM session_attribute 
    200202             WHERE sid=%s 
    201                AND authenticated=1 
     203               AND authenticated=%s 
    202204               AND name=%s 
    203         """, (sid, 'announcer_email_format_%s' % realm)) 
     205        """, (sid, authenticated, 'announcer_email_format_%s' % realm)) 
    204206                 
    205207        result = cursor.fetchone() 
    206208        if result: 
    207209            chosen = result[0] 
    208             self.log.debug("EmailDistributor determined the preferred format for '%s' is: %s" % (sid, chosen)) 
     210            self.log.debug("EmailDistributor determined the preferred format for '%s (%s)' is: %s" % ( 
     211                    sid, authenticated and 'authenticated' or 'not authenticated', chosen 
     212                ) 
     213            ) 
    209214            return chosen 
    210215        else: 
     
    257262        start = time.time() 
    258263         
    259         package = (self.smtp_from, [x[1] for x in recipients if x], rootMessage.as_string() ) 
     264        package = (self.smtp_from, [x[2] for x in recipients if x], rootMessage.as_string() ) 
    260265        if self.use_threaded_delivery: 
    261266            self._deliveryQueue.put(package) 
  • announcerplugin/0.11/announcerplugin/formatters/ticket_email.py

    r3046 r3107  
    3131    implements(IAnnouncementFormatter) 
    3232         
    33     ticket_email_subject = Option('announcer', 'ticket_email_subject', "Ticket #${ticket.id}: ${ticket['summary']}") 
     33    ticket_email_subject = Option('announcer', 'ticket_email_subject',  
     34        "Ticket #${ticket.id}: ${ticket['summary']} {% if action %}[${action}]{% end %}") 
    3435     
    3536    def get_format_transport(self): 
     
    6970        if transport == "email": 
    7071            if realm == "ticket": 
     72                if event.changes: 
     73                    if 'status' in event.changes: 
     74                        action = 'Status -> %s' % (event.target['status']) 
     75                    else: 
     76                        action = None 
    7177                template = NewTextTemplate(self.ticket_email_subject) 
    72                 return template.generate(ticket=event.target, event=event).render() 
     78                return template.generate(ticket=event.target, event=event, action=action).render() 
    7379                 
    7480    def format(self, transport, realm, style, event): 
  • announcerplugin/0.11/announcerplugin/formatters/wiki_email.py

    r3047 r3107  
    3131    implements(IAnnouncementFormatter) 
    3232         
    33     wiki_email_subject = Option('announcer', 'wiki_email_subject', "Wiki ${page.name} changed") 
     33    wiki_email_subject = Option('announcer', 'wiki_email_subject', "Page: ${page.name} ${action}") 
    3434     
    3535    def get_format_transport(self): 
     
    7070            if realm == "wiki": 
    7171                template = NewTextTemplate(self.wiki_email_subject) 
    72                 return template.generate(page=event.target, event=event).render() 
     72                return template.generate(page=event.target, event=event, action=event.category).render() 
    7373                 
    7474    def format(self, transport, realm, style, event): 
     
    8181 
    8282    def _format_plaintext(self, event): 
     83        page = event.target 
    8384        data = dict( 
    84             page = event.target, 
     85            action = event.category, 
     86            page = page, 
    8587            author = event.author, 
    8688            comment = event.comment, 
    8789            category = event.category, 
    88             page_link = self.env.abs_href('page', event.target.name), 
     90            page_link = self.env.abs_href('wiki', page.name), 
    8991            project_name = self.env.project_name, 
    9092            project_desc = self.env.project_description, 
     
    9294        ) 
    9395         
     96        if page.version: 
     97            data["changed"] = True 
     98            data["diff_link"] = self.env.abs_href('wiki', page.name, action="diff", version=page.version) 
     99             
     100         
    94101        chrome = Chrome(self.env)         
    95102        dirs = [] 
    96103        for provider in chrome.template_providers: 
    97104            dirs += provider.get_templates_dirs() 
    98  
     105             
    99106        templates = TemplateLoader(dirs, variable_lookup='lenient') 
    100  
     107         
    101108        template = templates.load('wiki_email_plaintext.txt', cls=NewTextTemplate) 
    102  
     109         
    103110        if template: 
    104111            stream = template.generate(**data) 
    105112            output = stream.render('text') 
    106  
     113             
    107114        return output 
    108115         
  • announcerplugin/0.11/announcerplugin/pref.py

    r3070 r3107  
    2525         
    2626    def get_preference_panels(self, req): 
    27         if req.authname and req.authname != 'anonymous': 
    28             yield ('announcer', 'Announcements') 
     27        yield ('announcer', 'Announcements') 
    2928         
    3029    def _get_boxes(self, req): 
  • announcerplugin/0.11/announcerplugin/producers/wiki.py

    r3086 r3107  
    2424     
    2525    def wiki_page_added(self, page): 
     26        history = list(page.get_history())[0] 
    2627        announcer = AnnouncementSystem(page.env) 
    2728        announcer.send( 
    2829            WikiChangeEvent("wiki", "created", page, 
    29                 author=page.author             
     30                author=history[2], version=history[0]   
    3031            ) 
    3132        )         
     
    4041        ) 
    4142         
    42     def wiki_page_deleted(page): 
     43    def wiki_page_deleted(self, page): 
    4344        announcer = AnnouncementSystem(page.env) 
    4445        announcer.send( 
     
    4647        ) 
    4748         
    48     def wiki_page_version_deleted(page): 
     49    def wiki_page_version_deleted(self, page): 
    4950        announcer = AnnouncementSystem(page.env) 
    5051        announcer.send( 
  • announcerplugin/0.11/announcerplugin/resolvers/defaultdomain.py

    r3046 r3107  
    1111        """Default host/domain to append to address that do not specify one""") 
    1212     
    13     def get_address_for_name(self, name): 
     13    def get_address_for_name(self, name, authenticated): 
    1414        if self.smtp_default_domain: 
    1515            return '%s@%s' % (name, self.smtp_default_domain) 
  • announcerplugin/0.11/announcerplugin/resolvers/sessionemail.py

    r3041 r3107  
    77    implements(IAnnouncementAddressResolver) 
    88     
    9     def get_address_for_name(self, name): 
     9    def get_address_for_name(self, name, authenticated): 
    1010        db = self.env.get_db_cnx() 
    1111        cursor = db.cursor() 
    12          
    1312        cursor.execute(""" 
    14             SELECT value, authenticated 
     13            SELECT value 
    1514              FROM session_attribute 
    1615             WHERE sid=%s 
     16               AND authenticated=%s 
    1717               AND name=%s 
    18         """, (name, 'email')) 
    19                  
    20         for record in sorted(cursor.fetchall(), key=lambda x: x[1]): 
    21             return record[0] 
     18        """, (name, authenticated and 1 or 0, 'email')) 
     19         
     20        result = cursor.fetchone() 
     21        if result: 
     22            return result[0] 
    2223             
    2324        return None 
  • announcerplugin/0.11/announcerplugin/resolvers/specified.py

    r3046 r3107  
    99    implements(IAnnouncementAddressResolver, IAnnouncementPreferenceProvider) 
    1010     
    11     def get_address_for_name(self, name): 
     11    def get_address_for_name(self, name, authenticated): 
    1212        db = self.env.get_db_cnx() 
    1313        cursor = db.cursor() 
     
    2929    # IAnnouncementDistributor 
    3030    def get_announcement_preference_boxes(self, req): 
    31         yield "emailaddress", "Announcement Email Address" 
     31        if req.authname != "anonymous": 
     32            yield "emailaddress", "Announcement Email Address" 
    3233         
    3334    def render_announcement_preference_box(self, req, panel): 
  • announcerplugin/0.11/announcerplugin/subscribers/rulefilters.py

    r3064 r3107  
    137137        ) 
    138138        return "prefs_announcer_rules.html", data  
    139          
  • announcerplugin/0.11/announcerplugin/subscribers/ticket_compat.py

    r3086 r3107  
    2929    def get_subscriptions_for_event(self, event): 
    3030        self.log.debug("StaticTicketSubscriber added '%s' because of rule: smtp_always_bcc" % self.bcc) 
    31         yield ('email', None, self.bcc) 
     31        yield ('email', None, False, self.bcc) 
    3232 
    3333class LegacyTicketSubscriber(Component): 
     
    103103                    ## TODO: Is this an option? 
    104104                    self.log.debug("LegacyTicketSubscriber added '%s' because of rule: component owner" % (component.owner,)) 
    105                     yield ('email', component.owner, None) 
    106                                                      
     105                    yield ('email', component.owner, True, None) 
     106                     
    107107                if self.always_notify_owner and ticket['owner'] and not self._check_opt_out('notify_owner', ticket['owner']):                    
    108                     self.log.debug("LegacyTicketSubscriber added '%s' because of rule: always_notify_owner" % ticket['owner']) 
    109                     yield ('email', ticket['owner'], None) 
     108                    owner = ticket['owner'] 
     109                    if '@' in owner: 
     110                        name, authenticated, address = None, False, owner 
     111                    else: 
     112                        name, authenticated, address = owner, True, None 
     113                     
     114                    self.log.debug( 
     115                        "LegacyTicketSubscriber added '%s (%s)' because of rule: always_notify_owner" % ( 
     116                            owner, authenticated and 'authenticated' or 'not authenticated' 
     117                        ) 
     118                    ) 
     119                    yield ('email', name, authenticated, address) 
    110120                     
    111121                if self.always_notify_reporter and ticket['reporter'] and not self._check_opt_out('notify_reporter', ticket['reporter']): 
    112                     self.log.debug("LegacyTicketSubscriber added '%s' because of rule: always_notify_reporter" % ticket['reporter']) 
    113                     yield ('email', ticket['reporter'], None) 
     122                    reporter = ticket['reporter'] 
     123                    if '@' in reporter: 
     124                        name, authenticated, address = None, False, reporter 
     125                    else: 
     126                        name, authenticated, address = reporter, True, None 
     127                     
     128                    self.log.debug( 
     129                        "LegacyTicketSubscriber added '%s (%s)' because of rule: always_notify_reporter" % ( 
     130                            reporter, authenticated and 'authenticated' or 'not authenticated' 
     131                        ) 
     132                    ) 
     133                    yield ('email', name, authenticated, address) 
    114134                     
    115135                if self.always_notify_updater and event.author and not self._check_opt_out('notify_updater', event.author): 
    116                     self.log.debug("LegacyTicketSubscriber added '%s' because of rule: always_notify_updater" % event.author) 
    117                     yield ('email', event.author, None) 
     136                    self.log.debug("LegacyTicketSubscriber added '%s (authenticated)' because of rule: always_notify_updater" % event.author) 
     137                    yield ('email', event.author, True, None) 
     138             
    118139        return 
    119140         
     
    147168    def get_subscription_categories(self, realm): 
    148169        if realm == 'ticket': 
    149             return ('changed', 'attachment added') 
     170            yield 'changed' 
     171            yield 'attachment added' 
     172        return 
    150173         
    151174    def get_subscriptions_for_event(self, event): 
     
    167190                    if name or address: 
    168191                        self.log.debug("CarbonCopySubscriber added '%s <%s>' because of rule: carbon copied" % (name,address)) 
    169                         yield ('email', name, address) 
     192                        yield ('email', name, name and True or False, address) 
     193         
  • announcerplugin/0.11/announcerplugin/subscribers/ticket_groups.py

    r3047 r3107  
    1919        return ('ticket',) 
    2020     
    21     def get_subscription_categories(self, *args): 
    22         return ('changed', 'created', 'attachment added') 
     21    def get_subscription_categories(self, realm): 
     22        if realm == "ticket": 
     23            yield 'changed' 
     24            yield 'created' 
     25            yield 'attachment added' 
    2326     
    2427    def get_subscriptions_for_event(self, event): 
     
    3134                        member = None 
    3235                        for member in self._get_membership(chunk[1:]): 
    33                             self.log.debug("JoinableGroupSubscriber added '%s' because of opt-in to group: %s" % (member[1], chunk[1:])) 
     36                            self.log.debug( 
     37                                "JoinableGroupSubscriber added '%s (%s)' because of opt-in to group: %s" % ( 
     38                                    member[1], member[2] and 'authenticated' or 'not authenticated', chunk[1:] 
     39                                ) 
     40                            ) 
    3441                            yield member 
    3542                         
     
    4249         
    4350        cursor.execute(""" 
    44             SELECT sid  
     51            SELECT sid, authenticated 
    4552              FROM session_attribute 
    46              WHERE authenticated=1 
    4753               AND name=%s 
    4854               AND value=%s 
     
    5056         
    5157        for result in cursor.fetchall(): 
    52             yield ("email", result[0], None) 
     58            if result[1] in (1, '1', True): 
     59                authenticated = True 
     60            else: 
     61                authenticated = False 
     62            yield ("email", result[0], authenticated, None) 
    5363 
    5464    def get_announcement_preference_boxes(self, req): 
     65        if req.authname == "anonymous" and 'email' not in req.session: 
     66            return 
     67             
    5568        if self.joinable_groups: 
    5669            yield "joinable_groups", "Joinable Groups (Opt-In)" 
     70             
    5771        return 
    58  
     72         
    5973    def render_announcement_preference_box(self, req, panel): 
    6074        cfg = self.config 
  • announcerplugin/0.11/announcerplugin/subscribers/watchers.py

    r3090 r3107  
    136136        self._add_notice(req) 
    137137         
    138         if req.authname != "anonymous"
     138        if req.authname != "anonymous" or (req.authname == 'anonymous' and 'email' in req.session)
    139139            for pattern in self.watchable_paths: 
    140140                path = self.normalise_resource(req.path_info) 
    141141                if re.match(pattern, path): 
    142142                    realm, _ = path.split('/', 1) 
    143      
     143                     
    144144                    if '%s_VIEW' % realm.upper() not in req.perm: 
    145145                        return handler 
     
    147147                    self.render_watcher(req) 
    148148                    break 
    149  
     149                     
    150150        return handler 
    151  
     151         
    152152    def post_process_request(self, req, template, data, content_type): 
    153153        return (template, data, content_type) 
     
    181181         
    182182    # IWikiChangeListener 
    183     def wiki_page_added(self, page): 
    184         pass 
    185          
    186     def wiki_page_changed(self, page, version, t, comment, author, ipnr): 
    187         pass 
    188          
    189     def wiki_page_deleted(page): 
     183    def wiki_page_added(*args): 
     184        pass 
     185         
     186    def wiki_page_changed(*args): 
     187        pass 
     188         
     189    def wiki_page_deleted(self, page): 
    190190        db = self.env.get_db_cnx() 
    191191 
     
    202202        db.commit() 
    203203 
    204     def wiki_page_version_deleted(page): 
     204    def wiki_page_version_deleted(*args): 
    205205        pass 
    206206 
    207207    # ITicketChangeListener 
    208208     
    209     def ticket_created(self, ticket): 
    210         pass 
    211          
    212     def ticket_changed(self, ticket, comment, author, old_values): 
     209    def ticket_created(*args): 
     210        pass 
     211         
     212    def ticket_changed(*args): 
    213213        pass 
    214214         
     
    243243                 
    244244                cursor.execute(""" 
    245                     SELECT transport, sid 
     245                    SELECT transport, sid, authenticated 
    246246                      FROM subscriptions 
    247247                     WHERE enabled=1 AND managed=%s 
     
    251251                """, ('watcher', event.realm, '*', self._get_target_identifier(event.realm, event.target))) 
    252252             
    253                 for transport, sid in cursor.fetchall(): 
    254                     self.log.debug("WatchSubscriber added '%s' because of rule: watched" % (sid,)) 
    255                     yield (transport, sid, None) 
     253                for transport, sid, authenticated in cursor.fetchall(): 
     254                    self.log.debug("WatchSubscriber added '%s (%s)' because of rule: watched" % ( 
     255                        sid,authenticated and 'authenticated' or 'not authenticated' 
     256                        ) 
     257                    ) 
     258                    yield (transport, sid, authenticated, None) 
    256259                     
    257260    def _get_target_identifier(self, realm, target): 
  • announcerplugin/0.11/announcerplugin/subscribers/wiki.py

    r3091 r3107  
    1111    def get_subscription_realms(self): 
    1212        return ('wiki',) 
    13      
    14     def get_subscription_categories(self, *args): 
    15         return ('changed', 'created', 'attachment added', 'deleted', 'version deleted') 
    16      
     13         
     14    def get_subscription_categories(self, realm): 
     15        if realm == "wiki": 
     16            return ('changed', 'created', 'attachment added', 'deleted', 'version deleted') 
     17        else: 
     18            return tuple() 
     19             
    1720    def get_subscriptions_for_event(self, event): 
    1821        if event.realm == 'wiki': 
    1922            if event.category in self.get_subscription_categories(event.realm): 
    2023                page = event.target 
    21                 for name in self._get_membership(page.name):                     
    22                     yield ('email', name, None) 
    23                              
     24                for name, authenticated in self._get_membership(page.name): 
     25                    yield ('email', name, authenticated, None) 
     26         
    2427    def _get_membership(self, name): 
    2528        db = self.env.get_db_cnx() 
     
    2730         
    2831        cursor.execute(""" 
    29             SELECT sid, value 
     32            SELECT sid, authenticated, value 
    3033              FROM session_attribute 
    31              WHERE authenticated=1 
    32                AND name=%s 
     34             WHERE name=%s 
    3335        """, ('announcer_wiki_interests', )) 
    3436         
    35         for result in cursor.fetchall(): 
    36             for raw in result[1].split(' '): 
     37        for sid, authenticated, value in cursor.fetchall(): 
     38            for raw in value.split(' '): 
    3739                pat = urllib.unquote(raw) 
    3840                if re.match(pat, name): 
    3941                    self.log.debug( 
    40                         "GeneralWikiSubscriber added '%s' because name '%s' matches pattern: %s" % ( 
    41                             result[0], name, pat 
     42                        "GeneralWikiSubscriber added '%s (%s)' because name '%s' matches pattern: %s" % ( 
     43                            sid, authenticated and 'authenticated' or 'not authenticated', name, pat 
    4244                        ) 
    4345                    ) 
    44                     yield result[0] 
    45  
     46                    yield sid, authenticated 
     47                     
    4648    def get_announcement_preference_boxes(self, req): 
    4749        yield "general_wiki", "General Wiki Announcements" 
    48  
     50         
    4951    def render_announcement_preference_box(self, req, panel): 
    5052        sess = req.session 
  • announcerplugin/0.11/announcerplugin/templates/ticket_email_mimic.html

    r3046 r3107  
    145145    </div> 
    146146    <py:if test="has_changes"> 
    147       <div class="changetitle" style="font-size: small; margin: 1em;">Changes (by ${author}):</div> 
     147      <div class="changetitle" style="font-size: small; margin: 1em;">Changes: (by <strong>${author}</strong>)</div> 
    148148      <ul> 
    149149        <li py:for="change in short_changes" class="changeitem" style="font-size: small;"> 
     
    167167    </py:if> 
    168168    <py:if test="comment"> 
    169       <div class="commentstitle" style="font-size: small; margin: 1em;">Comments:</div> 
     169      <div class="commentstitle" style="font-size: small; margin: 1em;">Comments: <span py:if="not has_changes">(by <strong>${author}</strong>)</span></div> 
    170170      <div class="comments" style="font-size: small; margin: 0 0 0 2em; font-style: italic;">${comment}</div> 
    171171    </py:if> 
  • announcerplugin/0.11/announcerplugin/templates/wiki_email_plaintext.txt

    r3047 r3107  
    1  
    2  * The user '${author}' has changed the ${page.name} page. 
     1{% choose %}\ 
     2{% when action == "created" %} * The user '${author}' has created the page: ${page.name}. {% end %}\ 
     3{% when action == "changed" %} * The user '${author}' has changed the page: ${page.name}. 
     4 * Diff link: <URL:${diff_link}>  
     5{% end %}\ 
     6{% when action == "attachment added" %} * The user '${author}' has added the attachment '${event.attachment.name}' to the page: ${page.name}. {% end %}\ 
     7{% when action == "version deleted" %} * The page '${page.name}' has been reverted to its previous version. {% end %}\ 
     8{% when action == "deleted" %} * The '${page.name}' has been deleted. {% end %}\ 
     9{% end %} 
    310 
    411-- 
  • announcerplugin/0.11/setup.py

    r3064 r3107  
    3232setup( 
    3333    name = 'AnnouncerPlugin',  
    34     version = '0.1', 
     34    version = '0.2', 
    3535    author = 'Stephen Hansen', 
    3636    author_email = 'shansen@advpubtech.com', 
     
    4747        'trac.plugins': [ 
    4848            'announcerplugin = announcerplugin', 
    49             # 'announcerplugin.api = announcerplugin.api', 
    50             # 'announcerplugin.producers = announcerplugin.producers', 
    51             # 'announcerplugin.producers.ticket = announcerplugin.producers.ticket', 
    52             # 'announcerplugin.producers.attachment = announcerplugin.producers.attachment', 
    53             # 'announcerplugin.subscribers = announcerplugin.subscribers', 
    54             # 'announcerplugin.subscribers.ticket = announcerplugin.subscribers.ticket', 
    55             # 'announcerplugin.subscribers.ticket_compat = announcerplugin.subscribers.ticket_compat', 
    56             # 'announcerplugin.pref = announcerplugin.pref' 
    5749        ]     
    5850    }