root/backrefpatch/0.11/backref.patch

Revision 3372, 9.8 kB (checked in by nferchen, 10 months ago)

minimal changes for rev 6696

  • trac/ticket/web_ui.py

    old new  
    476476                         # Store a timestamp for detecting "mid air collisions" 
    477477                         'timestamp': str(ticket.time_changed)}) 
    478478 
     479        data['backrefs'] = self._get_backrefs(context, ticket) 
     480  
    479481        self._insert_ticket_data(req, ticket, data, 
    480482                                 get_reporter_id(req, 'author'), field_changes) 
    481483 
     
    10001002        for key in field_changes: 
    10011003            ticket[key] = field_changes[key]['new'] 
    10021004 
     1005    def _get_backrefs(self, context, ticket): 
     1006        id = ticket.id 
     1007        cursor = context.db.cursor() 
     1008        refs = [] 
     1009 
     1010        cursor.execute("SELECT 'ticket', id, description " 
     1011                       "FROM ticket WHERE description LIKE '%%#%s%%' " 
     1012                       " OR description LIKE '%%ticket:%s%%' " 
     1013                       "UNION " 
     1014                       "SELECT 'ticket', t.id, newvalue " 
     1015                       "FROM ticket_change c JOIN ticket t on c.ticket = t.id " 
     1016                       "WHERE newvalue LIKE '%%#%s%%' " 
     1017                       " OR newvalue LIKE '%%ticket:%s%%' " 
     1018                       "UNION " 
     1019                       "SELECT 'changeset', rev, message " 
     1020                       "FROM revision WHERE message LIKE '%%#%s%%' " 
     1021                       " OR message LIKE '%%ticket:%s%%' " 
     1022                       "UNION " 
     1023                       "SELECT 'wiki', name, text " 
     1024                       "FROM wiki WHERE (text LIKE '%%#%s%%' " 
     1025                       " OR text LIKE '%%ticket:%s%%') " 
     1026                       "AND version = (SELECT max(version) FROM wiki w " 
     1027                       " WHERE w.name = wiki.name) " 
     1028                       "ORDER BY 1 desc, 2" 
     1029                       % ((id,) * 8)) 
     1030 
     1031        for idx, row in enumerate(cursor): 
     1032            rtyp, rid, text = row 
     1033            # check whether the link is an single word 
     1034            if re.search(r"(\W|^)#%s(\W|$)" % id, text): 
     1035                refs.append(context(rtyp, rid))  
     1036        return refs 
     1037 
    10031038    def _prepare_fields(self, req, ticket): 
    10041039        context = Context.from_request(req, ticket.resource) 
    10051040        fields = [] 
  • trac/ticket/templates/ticket.html

    old new  
    186186              </div> 
    187187              <br py:if="not ticket.description" style="clear: both" /> 
    188188            </div> 
     189 
     190            <div py:if="backrefs"> 
     191               <div class="description"> 
     192                    <h3 id="comment:bakref">Referenced by</h3> 
     193                    <div class="searchable"> 
     194                        <py:for each="ref in backrefs"> 
     195                            <a class="new ticket"  
     196                            href="${ref.resource_href(q='#%i ticket:%i' % ((ticket.id, )*2))}"  
     197                            title="${[ref.summary(),''][ref.summary()==ref.shortname()]}" 
     198                            >${ref.shortname()}</a> 
     199                        </py:for> 
     200                    </div> 
     201               </div> 
     202            </div> 
     203 
    189204        </div> 
    190205      </fieldset> 
    191206      <!--! End of ticket box --> 
  • trac/versioncontrol/web_ui/changeset.py

    old new  
    611611                info = None 
    612612            changes.append(info) # the sequence should be immutable 
    613613 
     614        data['backrefs'] = self._get_backrefs(context, rev) 
     615 
    614616        data.update({'has_diffs': has_diffs, 'changes': changes, 'xhr': xhr, 
    615617                     'filestats': filestats, 'annotated': annotated, 
    616618                     'files': files, 'location': self._get_location(files), 
     
    931933                                            old=data['old_rev']) + query 
    932934        return tag.a(label, class_="changeset", title=title, href=href) 
    933935 
     936    def _get_backrefs(self, context, rev): 
     937        cursor = context.db.cursor() 
     938        refs = [] 
     939 
     940        cursor.execute("SELECT 'ticket', id, description " 
     941                       "FROM ticket WHERE description LIKE '%%[%s]%%' " 
     942                       " OR description LIKE '%%r%s%%' " 
     943                       " OR description LIKE '%%changeset:%s%%' " 
     944                       "UNION " 
     945                       "SELECT 'ticket', t.id, newvalue " 
     946                       "FROM ticket_change c JOIN ticket t on c.ticket = t.id " 
     947                       "WHERE newvalue LIKE '%%[%s%%' " 
     948                       " OR newvalue LIKE '%%r:%s%%' " 
     949                       " OR newvalue LIKE '%%changeset:%s%%' " 
     950                       "UNION " 
     951                       "SELECT 'changeset', rev, message " 
     952                       "FROM revision WHERE message LIKE '%%[%s]%%' " 
     953                       " OR message LIKE '%%r:%s%%' " 
     954                       " OR message LIKE '%%changeset:%s%%' " 
     955                       "UNION " 
     956                       "SELECT 'wiki', name, text " 
     957                       "FROM wiki WHERE (text LIKE '%%[%s]%%' " 
     958                       " OR text LIKE '%%r:%s%%' " 
     959                       " OR text LIKE '%%changeset:%s%%' ) " 
     960                       " AND version = (SELECT max(version) FROM wiki w " 
     961                       " WHERE w.name = wiki.name) " 
     962                       "ORDER BY 1 desc, 2" 
     963                       % ((rev,) * 12)) 
     964 
     965        for idx, row in enumerate(cursor): 
     966            rtyp, rid, text = row 
     967            # check whether the link is an single word 
     968            if re.search(r"(\W|^)(\[|r:|changeset:)%s\]?(\W|$)" % id, text) or 1: 
     969                refs.append(context(rtyp, rid))  
     970        return refs 
     971 
    934972    # ISearchSource methods 
    935973 
    936974    def get_search_filters(self, req): 
  • trac/versioncontrol/templates/changeset.html

    old new  
    116116            </py:when> 
    117117            <py:otherwise><pre>${changeset.message}</pre></py:otherwise> 
    118118          </dd> 
     119 
     120          <py:if test="backrefs"> 
     121             <dt class="property message">Referenced&nbsp;by:</dt> 
     122             <dd class="message searchable"> 
     123                <py:for each="ref in backrefs"> 
     124                    <a class="new ticket"  
     125                    href="${ref.resource_href(q='[%i] r%i changeset:%i' % ((context.id,)*3))}"  
     126                    title="${[ref.summary(),''][ref.summary()==ref.shortname()]}" 
     127                    >${ref.shortname()}</a> 
     128                </py:for> 
     129             </dd> 
     130          </py:if> 
     131 
    119132        </py:if> 
    120133        <py:if test="location and len(files) &gt; 1"> 
    121134          <dt class="property location">Location:</dt> 
  • trac/wiki/web_ui.py

    old new  
    491491                     WikiSystem(self.env).get_pages(prefix) if 
    492492                     'WIKI_VIEW' in req.perm('wiki', template)] 
    493493 
     494        data['backrefs'] = self._get_backrefs(context, page) 
     495  
    494496        # -- prev/up/next links 
    495497        if prev_version: 
    496498            add_link(req, 'prev', 
     
    532534                                                    action='diff', 
    533535                                                    version=page.version)) 
    534536 
     537    def _get_backrefs(self, context, page): 
     538        id = page.id 
     539        cursor = context.db.cursor() 
     540        refs = [] 
     541 
     542        cursor.execute("SELECT 'ticket', id, description " 
     543                       "FROM ticket WHERE description LIKE '%%%s%%' " 
     544                       "UNION " 
     545                       "SELECT 'ticket', t.id, newvalue " 
     546                       "FROM ticket_change c JOIN ticket t on c.ticket = t.id " 
     547                       "WHERE newvalue LIKE '%%%s%%' " 
     548                       "UNION " 
     549                       "SELECT 'changeset', rev, message " 
     550                       "FROM revision WHERE message LIKE '%%%s%%' " 
     551                       "UNION " 
     552                       "SELECT 'wiki', name, text " 
     553                       "FROM wiki WHERE text LIKE '%%%s%%' " 
     554                       "AND version = (SELECT max(version) FROM wiki w " 
     555                       " WHERE w.name = wiki.name) " 
     556                       "ORDER BY 1 desc, 2" 
     557                       % ((id,) * 4)) 
     558 
     559        for idx, row in enumerate(cursor): 
     560            rtyp, rid, text = row 
     561            # check whether the link is an single word 
     562            if re.search(r"(\W|^)(wiki:)?%s(\W|$)" % id, text): 
     563                refs.append(context(rtyp, rid))  
     564        return refs 
     565 
    535566    # ITimelineEventProvider methods 
    536567 
    537568    def get_timeline_filters(self, req): 
  • trac/wiki/templates/wiki_view.html

    old new  
    4343 
    4444      ${list_of_attachments(attachments, compact=True)} 
    4545 
     46      <py:if test="backrefs"> 
     47         <p>Referenced&nbsp;by: 
     48         <py:for each="ref in backrefs"> 
     49             <a class="new ticket"  
     50             href="${ref.resource_href(q=context.id)}"  
     51             title="${[ref.summary(),''][ref.summary()==ref.shortname()]}" 
     52             >${ref.shortname()}</a> 
     53         </py:for></p> 
     54      </py:if> 
     55 
    4656      <py:with vars="modify_perm = 'WIKI_MODIFY' in perm(page.resource); 
    4757                     delete_perm = 'WIKI_DELETE' in perm(page.resource); 
    4858                     admin_perm = 'WIKI_ADMIN' in perm(page.resource)"> 
Note: See TracBrowser for help on using the browser.