Edgewall Software

Ticket #7316: 7316-timeline-render-refact-r7595.diff

File 7316-timeline-render-refact-r7595.diff, 13.7 KB (added by cboos, 3 years ago)

add an extra abbreviated optional parameter to render_timeline_event, so that the timeline.rss can explicitly force full content

  • trac/attachment.py

     
    4242                            INavigationContributor 
    4343from trac.web.href import Href 
    4444from trac.wiki.api import IWikiSyntaxProvider 
    45 from trac.wiki.formatter import format_to_oneliner 
     45from trac.wiki.formatter import format_to 
    4646 
    4747 
    4848class InvalidAttachment(TracError): 
     
    464464            if 'ATTACHMENT_VIEW' in req.perm(attachment): 
    465465                yield ('attachment', time, author, (attachment, descr), self) 
    466466 
    467     def render_timeline_event(self, context, field, event): 
     467    def render_timeline_event(self, context, field, event, abbreviated=None): 
    468468        attachment, descr = event[3] 
    469469        if field == 'url': 
    470470            return self.get_resource_url(attachment, context.href) 
     
    474474            return tag(tag.em(os.path.basename(attachment.id)), 
    475475                       _(" attached to "), tag.em(name, title=title)) 
    476476        elif field == 'description': 
    477             return format_to_oneliner(self.env, context(attachment.parent), 
    478                                       descr) 
     477            if abbreviated is None: 
     478                abbreviated = self.config['timeline'] \ 
     479                        .getbool('abbreviated_messages') 
     480            flavor, options = (('html', {}),  
     481                               ('oneliner', {'shorten': True}))[abbreviated] 
     482            return format_to(self.env, flavor, context(attachment.parent), 
     483                             descr, **options) 
    479484    
    480485    def get_search_results(self, req, resource_realm, terms): 
    481486        """Return a search result generator suitable for ISearchSource. 
  • trac/ticket/web_ui.py

     
    125125        but keeps the old behavior for upgraded environments (i.e. 'no'). 
    126126        (''since 0.11'').""") 
    127127 
     128    def _must_preserve_newlines(self): 
     129        preserve_newlines = self.preserve_newlines 
     130        if preserve_newlines == 'default': 
     131            preserve_newlines = self.env.get_version(initial=True) >= 21 # 0.11 
     132        return preserve_newlines in _TRUE_VALUES 
     133    must_preserve_newlines = property(_must_preserve_newlines) 
     134 
    128135    # IContentConverter methods 
    129136 
    130137    def get_supported_conversions(self): 
     
    322329                    req, ticket_realm, start, stop): 
    323330                    yield event 
    324331 
    325     def render_timeline_event(self, context, field, event): 
     332    def render_timeline_event(self, context, field, event, abbreviated=None): 
    326333        ticket, verb, info, summary, status, resolution, type, \ 
    327334                description, comment, cid = event[3] 
    328335        if field == 'url': 
     
    339346            descr = message = '' 
    340347            if status == 'new': 
    341348                message = description 
    342                 flavor = self.timeline_newticket_formatter 
    343349            else: 
    344350                descr = info 
    345351                message = comment 
     352            flavor = 'html' 
     353            options = {'escape_newlines': self.must_preserve_newlines} 
     354            if abbreviated is None: 
     355                if status == 'new':  
     356                    flavor = self.timeline_newticket_formatter 
     357                else: 
     358                    abbreviated = self.config['timeline'] \ 
     359                        .getbool('abbreviated_messages') 
     360            if abbreviated: 
    346361                flavor = 'oneliner' 
    347             if message: 
    348                 if self.config['timeline'].getbool('abbreviated_messages'): 
    349                     message = shorten_line(message) 
    350                 descr += format_to(self.env, flavor, context(resource=ticket), 
    351                                    message) 
     362            if flavor == 'oneliner': # may come from newticket_formatter 
     363                options = {'shorten': True} 
     364            descr += format_to(self.env, flavor, context(resource=ticket), 
     365                               message, **options) 
    352366            return descr 
    353367 
    354368    # Internal methods 
     
    578592        return 'ticket.html', data, None 
    579593 
    580594    def _prepare_data(self, req, ticket, absurls=False): 
    581         preserve_newlines = self.preserve_newlines 
    582         if preserve_newlines == 'default': 
    583             preserve_newlines = self.env.get_version(initial=True) >= 21 # 0.11 
    584         preserve_newlines = preserve_newlines in _TRUE_VALUES 
    585595        return {'ticket': ticket, 
    586596                'context': Context.from_request(req, ticket.resource, 
    587597                                                absurls=absurls), 
    588                 'preserve_newlines': preserve_newlines} 
     598                'preserve_newlines': self.must_preserve_newlines} 
    589599 
    590600    def _toggle_cc(self, req, cc): 
    591601        """Return an (action, recipient) tuple corresponding to a change 
  • trac/ticket/roadmap.py

     
    4242from trac.web.chrome import add_link, add_stylesheet, add_warning, \ 
    4343                            INavigationContributor 
    4444from trac.wiki.api import IWikiSyntaxProvider 
    45 from trac.wiki.formatter import format_to_html 
     45from trac.wiki.formatter import format_to 
    4646 
    4747class ITicketGroupStatsProvider(Interface): 
    4848    def get_ticket_group_stats(ticket_ids): 
     
    525525                req, milestone_realm, start, stop): 
    526526                yield event 
    527527                 
    528     def render_timeline_event(self, context, field, event): 
     528    def render_timeline_event(self, context, field, event, abbreviated=None): 
    529529        milestone, description = event[3] 
    530530        if field == 'url': 
    531531            return context.href.milestone(milestone.id) 
    532532        elif field == 'title': 
    533533            return tag('Milestone ', tag.em(milestone.id), ' completed') 
    534534        elif field == 'description': 
    535             return format_to_html(self.env, context(resource=milestone), 
    536                                   shorten_line(description)) 
     535            if abbreviated is None: 
     536                abbreviated = self.config['timeline'] \ 
     537                        .getbool('abbreviated_messages') 
     538            flavor, options = (('html', {}),  
     539                               ('oneliner', {'shorten': True}))[abbreviated] 
     540            return format_to(self.env, flavor, context(resource=milestone), 
     541                             description, **options) 
    537542 
    538543    # IRequestHandler methods 
    539544 
  • trac/versioncontrol/web_ui/changeset.py

     
    4747from trac.web.chrome import add_ctxtnav, add_link, add_script, add_stylesheet, \ 
    4848                            prevnext_nav, INavigationContributor, Chrome 
    4949from trac.wiki import IWikiSyntaxProvider, WikiParser 
    50 from trac.wiki.formatter import format_to_html 
     50from trac.wiki.formatter import format_to 
    5151 
    5252 
    5353class IPropertyDiffRenderer(Interface): 
     
    813813                           (permitted_changesets, chgset.message or '', 
    814814                            show_location, show_files)) 
    815815 
    816     def render_timeline_event(self, context, field, event): 
     816    def render_timeline_event(self, context, field, event, abbreviated=None): 
    817817        changesets, message, show_location, show_files = event[3] 
    818818        rev_b, rev_a = changesets[0].rev, changesets[-1].rev 
    819819         
     
    824824                return context.href.log(rev=rev_b, stop_rev=rev_a) 
    825825             
    826826        elif field == 'description': 
    827             if not self.timeline_long_messages: 
    828                 message = shorten_line(message) 
     827            if abbreviated is None: 
     828                abbreviated = not self.timeline_long_messages 
     829            flavor, options = (('html', {'escape_newlines': True}),  
     830                               ('oneliner', {'shorten': True}))[abbreviated] 
    829831            if self.wiki_format_messages: 
    830832                markup = '' 
    831833            else: 
     
    861863                        files = files[:show_files] + [tag.li(u'\u2026')] 
    862864                    markup = tag(tag.ul(files, class_="changes"), markup) 
    863865            if message: 
    864                 markup += format_to_html(self.env, context, message) 
     866                markup += format_to(self.env, flavor, context, message,  
     867                                    **options) 
    865868            return markup 
    866869 
    867870        if rev_a == rev_b: 
  • trac/wiki/web_ui.py

     
    4141                            INavigationContributor, ITemplateProvider 
    4242from trac.web import IRequestHandler 
    4343from trac.wiki.api import IWikiPageManipulator, WikiSystem 
    44 from trac.wiki.formatter import format_to_oneliner 
     44from trac.wiki.formatter import format_to 
    4545from trac.wiki.model import WikiPage 
    4646  
    4747class InvalidWikiPage(TracError): 
     
    592592                req, wiki_realm, start, stop): 
    593593                yield event 
    594594 
    595     def render_timeline_event(self, context, field, event): 
     595    def render_timeline_event(self, context, field, event, abbreviated=None): 
    596596        wiki_page, comment = event[3] 
    597597        if field == 'url': 
    598598            return context.href.wiki(wiki_page.id, version=wiki_page.version) 
     
    600600            return tag(tag.em(get_resource_name(self.env, wiki_page)), 
    601601                       wiki_page.version > 1 and ' edited' or ' created') 
    602602        elif field == 'description': 
    603             if self.config['timeline'].getbool('abbreviated_messages'): 
    604                 comment = shorten_line(comment) 
    605             markup = format_to_oneliner(self.env, context(resource=wiki_page), 
    606                                         comment) 
     603            if abbreviated is None: 
     604                abbreviated = self.config['timeline'] \ 
     605                        .getbool('abbreviated_messages') 
     606            flavor, options = (('html', {}),  
     607                               ('oneliner', {'shorten': True}))[abbreviated] 
     608            markup = format_to(self.env, flavor, context(resource=wiki_page), 
     609                               comment, **options) 
    607610            if wiki_page.version > 1: 
    608611                diff_href = context.href.wiki( 
    609612                    wiki_page.id, version=wiki_page.version, action='diff') 
  • trac/timeline/api.py

     
    6464        `markup` are not context dependent. 
    6565        """ 
    6666 
    67     def render_timeline_event(context, field, event): 
     67    def render_timeline_event(context, field, event, abbreviated=None): 
    6868        """Display the title of the event in the given context. 
    6969 
    7070        :param context: the rendering `Context` object that can be used for 
     
    7373                      be rendered: can be the 'title', the 'description' or 
    7474                      the 'url' 
    7575        :param event: the event tuple, as returned by `get_timeline_events` 
     76        :param abbreviated: when the flag is set to True, the renderer should  
     77                            follow this hint in preference to its default way 
     78                            of deciding whether the content should be  
     79                            abbreviated or not. 
     80 
    7681        """ 
    7782 
    7883 
  • trac/timeline/web_ui.py

     
    3030from trac.mimeview import Context 
    3131from trac.perm import IPermissionRequestor 
    3232from trac.timeline.api import ITimelineEventProvider 
     33from trac.util import arity 
    3334from trac.util.compat import sorted 
    3435from trac.util.datefmt import format_date, format_datetime, parse_date, \ 
    3536                              to_timestamp, utc, pretty_timedelta 
     
    278279        if len(event) == 6: # 0.10 events 
    279280            kind, url, title, date, author, markup = event 
    280281            data = {'url': url, 'title': title, 'description': markup} 
    281             render = lambda field, context: data.get(field) 
     282            render = lambda field, context, abbreviated=None: data.get(field) 
    282283        else: # 0.11 events 
    283284            if len(event) == 5: # with special provider 
    284285                kind, date, author, data, provider = event 
    285286            else: 
    286287                kind, date, author, data = event 
    287             render = lambda field, context: provider.render_timeline_event( 
    288                 context, field, event) 
     288            if arity(provider.render_timeline_event) == 2: # 0.11 renderers 
     289                render = lambda field, context, abbreviated=None: \ 
     290                        provider.render_timeline_event(context, field, event) 
     291            else: # 0.11.2, optional `abbreviated=None` argument 
     292                render = lambda field, context, abbreviated=None: \ 
     293                    provider.render_timeline_event(context, field, event, 
     294                                                   abbreviated) 
    289295        if isinstance(date, datetime): 
    290296            dateuid = to_timestamp(date) 
    291297        else: 
  • trac/timeline/templates/timeline.rss

     
    2727      </py:with> 
    2828      <guid isPermaLink="false">${abs_url}/${event.dateuid}</guid> 
    2929      <description>${ 
    30         unicode(event.render('description', context)) 
     30        unicode(event.render('description', context, abbreviated=False)) 
    3131      }</description> 
    3232      <category>$event.kind</category> 
    3333    </item>