Edgewall Software

Ticket #4964: trac-with-userfilter.diff

File trac-with-userfilter.diff, 6.4 KB (added by yotamrubin@…, 5 years ago)

The userfilter patch

  • templates/timeline.cs

    diff -ru mytrac/templates/timeline.cs mytrac-with-userfilter/templates/timeline.cs
    old new  
    11<?cs include "header.cs"?> 
     2<?cs include "macros.cs" ?> 
    23 
    34<div id="ctxtnav" class="nav"></div> 
    45 
     
    1213  <label><input type="text" size="3" name="daysback" value="<?cs 
    1314    var:timeline.daysback ?>" /> days back</label>. 
    1415 </div> 
     16 <?cs if:len(timeline.known_users) ?> 
     17 <div> 
     18 
     19  <label>View changes made by user: </label> 
     20         <?cs call:hdf_select(timeline.known_users, 'username', 0, 1) ?> 
     21 </div> 
     22 <?cs /if ?> 
     23 
    1524 <fieldset><?cs 
    1625  each:filter = timeline.filters ?> 
    1726   <label><input type="checkbox" name="<?cs var:filter.name ?>"<?cs 
  • trac/Timeline.py

    diff -ru mytrac/trac/Timeline.py mytrac-with-userfilter/trac/Timeline.py
    old new  
    8989    def match_request(self, req): 
    9090        return re.match(r'/timeline/?', req.path_info) is not None 
    9191 
    92     def process_request(self, req): 
    93         req.perm.assert_permission('TIMELINE_VIEW') 
     92    def _add_known_users_to_request(self, req): 
     93        user_list = list(self.env.get_known_users()) 
    9494 
    95         format = req.args.get('format') 
    96         maxrows = int(req.args.get('max', 0)) 
     95        # TODO: Add an empty user 
     96        for index, (username, name, email) in enumerate(user_list): 
     97           req.hdf["timeline.known_users.%d" % (index,)] = username 
    9798 
    98         # Parse the from date and adjust the timestamp to the last second of 
    99         # the day 
    100         t = time.localtime() 
     99    def _parse_timeline_range(self, req): 
     100        current_time = time.localtime() 
    101101        if req.args.has_key('from'): 
    102102            try: 
    103                 t = time.strptime(req.args.get('from'), '%x') 
     103                current_time = time.strptime(req.args.get('from'), '%x') 
    104104            except: 
    105105                pass 
    106106 
    107         fromdate = time.mktime((t[0], t[1], t[2], 23, 59, 59, t[6], t[7], t[8])) 
     107        fromdate = time.mktime((current_time[0], current_time[1], 
     108                                current_time[2], 23, 59, 59, current_time[6], 
     109                                current_time[7], current_time[8])) 
    108110        try: 
    109111            daysback = max(0, int(req.args.get('daysback', ''))) 
    110112        except ValueError: 
     
    112114        req.hdf['timeline.from'] = format_date(fromdate) 
    113115        req.hdf['timeline.daysback'] = daysback 
    114116 
     117        return daysback, fromdate 
     118 
     119 
     120    def _get_filters(self, req): 
    115121        available_filters = [] 
    116122        for event_provider in self.event_providers: 
    117123            available_filters += event_provider.get_timeline_filters(req) 
     
    134140                    req.session[key] = '1' 
    135141                elif req.session.has_key(key): 
    136142                    del req.session[key] 
     143                     
     144        user_filter = req.args.get("username") 
     145        return filters, available_filters, user_filter 
     146  
    137147 
    138         stop = fromdate 
    139         start = stop - (daysback + 1) * 86400 
    140  
     148    def _get_events(self, req, filters, available_filters, start, stop): 
    141149        events = [] 
     150        maxrows = int(req.args.get('max', 0)) 
     151 
    142152        for event_provider in self.event_providers: 
    143153            try: 
    144154                events += event_provider.get_timeline_events(req, start, stop, 
     
    151161        if maxrows and len(events) > maxrows: 
    152162            del events[maxrows:] 
    153163 
    154         req.hdf['title'] = 'Timeline' 
     164        return events 
    155165 
    156         # Get the email addresses of all known users 
     166 
     167    def _populate_request_with_events(self, req, events, format, user_filter): 
    157168        email_map = {} 
     169 
    158170        for username, name, email in self.env.get_known_users(): 
    159171            if email: 
    160172                email_map[username] = email 
    161173 
    162         idx = 0 
    163         for kind, href, title, date, author, message in events: 
     174        for index, (kind, href, title, date, author, message) in enumerate(events): 
     175            # Do not display the event if the user is not explicitly mentioned in the filter 
     176            if user_filter and author not in user_filter: 
     177                continue 
     178             
    164179            event = {'kind': kind, 'title': title, 'href': href, 
    165180                     'author': author or 'anonymous', 
    166181                     'date': format_date(date), 
     
    183198                        event['author.email'] = email_map[author] 
    184199                event['date'] = http_date(date) 
    185200 
    186             req.hdf['timeline.events.%s' % idx] = event 
    187             idx += 1 
     201            req.hdf['timeline.events.%s' % index] = event 
     202            index += 1 
    188203 
     204    def _populate_request_with_filters(self, req, filters, available_filters): 
     205        for index, (enabled, label) in enumerate(available_filters): 
     206            req.hdf['timeline.filters.%d' % index] = {'name': label, 
     207                'label': label, 'enabled': int(enabled in filters)} 
     208 
     209    def process_request(self, req): 
     210        req.perm.assert_permission('TIMELINE_VIEW') 
     211 
     212        format = req.args.get('format') 
     213 
     214        filters, available_filters, user_filter = self._get_filters(req) 
     215        print user_filter, "FUCK FUCK" 
     216        self._add_known_users_to_request(req) 
     217        self._populate_request_with_filters(req, filters, available_filters) 
     218 
     219        # Parse the from date and adjust the timestamp to the last second of 
     220        # the day 
     221 
     222  
     223        daysback, fromdate = self._parse_timeline_range(req) 
     224        stop = fromdate 
     225        start = stop - (daysback + 1) * (60 * 60 * 24) 
     226        events = self._get_events(req, filters, available_filters, start, stop,) 
     227        self._populate_request_with_events(req, events, format, user_filter) 
     228         
     229        req.hdf['title'] = 'Timeline' 
     230 
     231        # Get the email addresses of all known users 
     232        # TODO: Agh 
    189233        if format == 'rss': 
    190234            return 'timeline_rss.cs', 'application/rss+xml' 
    191235 
     
    194238                                     daysback=90, max=50, format='rss') 
    195239        add_link(req, 'alternate', rss_href, 'RSS Feed', 'application/rss+xml', 
    196240                 'rss') 
    197         for idx,fltr in enumerate(available_filters): 
    198             req.hdf['timeline.filters.%d' % idx] = {'name': fltr[0], 
    199                 'label': fltr[1], 'enabled': int(fltr[0] in filters)} 
    200  
    201241        return 'timeline.cs', None 
    202242 
    203243    def _provider_failure(self, exc, req, ep, current_filters, all_filters):