Changeset 2430

Show
Ignore:
Timestamp:
07/09/07 05:22:25 (1 year ago)
Author:
coderanger
Message:

MasterTicketsPlugin:

  • Add database/model for storing links.
  • Proof-of-concept for new field injection mechanism.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • masterticketsplugin/0.11/mastertickets/web_ui.py

    r2079 r2430  
    11from trac.core import * 
    2 from trac.web.api import IRequestFilter 
     2from trac.web.api import IRequestFilter, ITemplateStreamFilter 
    33from trac.web.chrome import ITemplateProvider, add_stylesheet, add_script 
    44from trac.ticket.api import ITicketManipulator 
    55from trac.ticket.model import Ticket 
    66from trac.util.html import html, Markup 
     7 
     8from genshi.core import Markup 
     9from genshi.builder import tag 
     10from genshi.filters.transform import Transformer  
    711 
    812from util import * 
     
    1115    """Provides support for ticket dependencies.""" 
    1216     
    13     implements(IRequestFilter, ITemplateProvider, ITicketManipulator) 
     17    implements(IRequestFilter, ITemplateStreamFilter, ITemplateProvider, ITicketManipulator) 
    1418     
    1519    # IRequestFilter methods 
     
    1721        return handler 
    1822         
    19     def post_process_request(self, req, template, content_type): 
     23    def post_process_request(self, req, template, data, content_type): 
    2024        if req.path_info.startswith('/ticket'): 
    21             tkt_id = req.path_info[8:
     25            tkt = data['ticket'
    2226             
    23             # jQuery! 
    24             add_script(req, 'mastertickets/jquery.js') 
     27            data['field_types']['blocking'] = 'text' 
     28            data['fields'].append({ 
     29                'label': 'Blocking', 
     30                'name': 'blocking', 
     31                'optional': False, 
     32                'options': [], 
     33                'skip': False, 
     34                'type': 'text', 
     35            }) 
     36            tkt['blocking'] = '1, 2' 
     37            data['mastertickets'] = { 
     38                'field_values': { 
     39                    'blocking': tag.b('Foobar'), 
     40                }, 
     41            } 
    2542             
    26             # Add in the 'Blocked by' field 
    27             blocking_ids = blocked_by(self.env, tkt_id) 
    28             if blocking_ids: 
    29                 req.hdf['ticket.blockedby'] = ', '.join([str(x) for x in blocking_ids]) 
    30                 req.hdf['ticket.fields.blockedby'] = { 
    31                     'value': '', 
    32                     'custom': 1, 
    33                     'type': 'text', 
    34                     'label': 'Blocked By', 
    35                     'order': 10, # Force this to be at the end, since I am going to disappear it. 
    36                 } 
    37                 add_stylesheet(req, 'mastertickets/ticket.css') 
    38                 add_script(req, 'mastertickets/linkify_blockedby.js') 
    39                  
    40                 # If any blockers are not closed, disable the resovle option 
    41                 img_src, img_alt = 'checkmark.gif', 'Blockers closed' 
    42                 for i in blocking_ids: 
    43                     if Ticket(self.env, i)['status'] != 'closed': 
    44                         if Ticket(self.env, tkt_id)['status'] != 'closed': 
    45                             add_script(req, 'mastertickets/disable_resolve.js') 
    46                             img_src, img_alt = 'x.png', 'Blockers open' 
    47                         else: 
    48                             img_src, img_alt = 'caution.png', 'Blockers open, but current ticket closed' 
    49                           
    50                 # Magic stuff in the footer 
    51                 req.hdf['project.footer'] = Markup(req.hdf['project.footer'] + Markup(html.DIV(html.IMG(class_='blockedby_icon', src=req.href.chrome('mastertickets',img_src), alt=img_alt, title=img_alt), ' ', linkify_ids(self.env, req, blocking_ids), id='linkified_blockedby', style='display:none'))) 
    52                  
    53              
    54             # Linkify the 'Blocks' field 
    55             blocks_ids = req.hdf.get('ticket.blocking') or '' 
    56             blocks_ids = blocks_ids.replace('#', '') 
    57             if blocks_ids: 
    58                 blocks_ids = [x.strip() for x in blocks_ids.split(',')] 
    59                 req.hdf['project.footer'] = Markup(req.hdf['project.footer'] + Markup(html.DIV(linkify_ids(self.env, req, blocks_ids), id='linkified_blocking', style='display:none'))) 
    60                 add_script(req, 'mastertickets/linkify_blocking.js') 
    61              
    62         return template, content_type 
     43        return template, data, content_type 
     44         
     45    # ITemplateStreamFilter methods 
     46    def match_stream(self, req, method, filename, stream, data): 
     47        return req.path_info.startswith('/ticket') 
     48 
     49    def filter_stream(self, req, method, filename, stream, data): 
     50        return stream | Transformer('div[@id="ticket"]/table[@class="properties"]/td[@headers="h_blocking"]/text()').replace(data['mastertickets']['field_values']['blocking']) 
    6351         
    6452    # ITicketManipulator methods 
  • masterticketsplugin/0.11/setup.py

    r2019 r2430  
    66setup( 
    77    name = 'TracMasterTickets', 
    8     version = '1.0', 
     8    version = '2.0', 
    99    packages = ['mastertickets'], 
    1010    package_data = { 'mastertickets': ['htdocs/*.js', 'htdocs/*.css' ] }, 
     
    2020    ], 
    2121     
    22     install_requires = ['TracWebAdmin'], 
     22    install_requires = ['Trac'], 
    2323 
    2424    entry_points = { 
    2525        'trac.plugins': [ 
    2626            'mastertickets.web_ui = mastertickets.web_ui', 
     27            'mastertickets.api = mastertickets.api', 
    2728        ] 
    2829    }