You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@bloodhound.apache.org by Thimal Kempitiya <tk...@gmail.com> on 2014/07/05 19:09:43 UTC

Re: svn commit: r1608062 - in /bloodhound/bep_0013_dynamic_clientside_features/bloodhound_theme/bhtheme: htdocs/js/DupeSearch.js theme.py

initial commit for DuplicateTicketSearch component
This will show duplicate ticket in newticket page


On Sat, Jul 5, 2014 at 10:38 PM, <th...@apache.org> wrote:

> Author: thimal
> Date: Sat Jul  5 17:08:06 2014
> New Revision: 1608062
>
> URL: http://svn.apache.org/r1608062
> Log:
> initial commit for duplicateTicketSearch component
>
> Added:
>
> bloodhound/bep_0013_dynamic_clientside_features/bloodhound_theme/bhtheme/htdocs/js/DupeSearch.js
>   (with props)
> Modified:
>
> bloodhound/bep_0013_dynamic_clientside_features/bloodhound_theme/bhtheme/theme.py
>
> Added:
> bloodhound/bep_0013_dynamic_clientside_features/bloodhound_theme/bhtheme/htdocs/js/DupeSearch.js
> URL:
> http://svn.apache.org/viewvc/bloodhound/bep_0013_dynamic_clientside_features/bloodhound_theme/bhtheme/htdocs/js/DupeSearch.js?rev=1608062&view=auto
>
> ==============================================================================
> ---
> bloodhound/bep_0013_dynamic_clientside_features/bloodhound_theme/bhtheme/htdocs/js/DupeSearch.js
> (added)
> +++
> bloodhound/bep_0013_dynamic_clientside_features/bloodhound_theme/bhtheme/htdocs/js/DupeSearch.js
> Sat Jul  5 17:08:06 2014
> @@ -0,0 +1,70 @@
> +$(document).ready(function() {
> +
> +       $('div#content.ticket h2#vc-summary').blur(function() {
> +               var text = $('div#content.ticket h2#vc-summary').text();
> +               if (text.length > 0) {
> +
> +                       var html = '<h5 class="loading">Loading related
> tickets..</h5>';
> +                       var dupeticketlistDiv = $('div#content.ticket
> h2#vc-summary + div#dupeticketlist');
> +                       if (dupeticketlistDiv.length == 0) {
> +                               $('div#content.ticket
> h2#vc-summary').after('<div id="dupeticketlist"
> style="display:none;"></div>');
> +                               dupeticketlistDiv = $('div#content.ticket
> h2#vc-summary + div#dupeticketlist');
> +                       }
> +                       $('ul',dupeticketlistDiv).slideUp('fast');
> +                       dupeticketlistDiv.html(html).slideDown();
> +
> +                       $.ajax({
> +                               url:'duplicate_ticket_search',
> +                data:{q:text},
> +                               type:'GET',
> +
> +                               success: function(data, status) {
> +                                       var tickets =data;
> +                                       var ticketBaseHref =  'ticket/';
> +                                       var searchBaseHref =
>  'bhsearch?type=ticket&q=';
> +                                       var maxTickets = 15;
> +
> +                                       var html = '';
> +                                       if (tickets === null) {
> +                                               // error
> +
> dupeticketlistDiv.html('<h5 class="error">Error loading tickets.</h5>');
> +                                       } else if (tickets.length <= 0) {
> +                                               // no dupe tickets
> +
> dupeticketlistDiv.slideUp();
> +                                       } else {
> +                                               html = '<h5>Possible
> related tickets:</h5><ul style="display:none;">'
> +                                               tickets =
> tickets.reverse();
> +
> +                                               for (var i = 0; i <
> tickets.length && i < maxTickets; i++) {
> +                                                       var ticket =
> tickets[i];
> +                                                       html += '<li
> class="highlight_matches" title="' + ticket.description +
> +                                                                   '"><a
> href="' + ticketBaseHref + ticket.url +
> +
> '"><span class="' + htmlencode(ticket.status) + '">#' +
> +
> ticket.url + '</span></a>: ' + htmlencode(ticket.type) + ': ' +
> +
> ticket.summary + '(' + htmlencode(ticket.status) +
> +
> (ticket.url ? ': ' + htmlencode(ticket.url) : '') +
> +                                                                   ')' +
> '</li>'
> +                                               }
> +                                               html += '</ul>';
> +                                               if (tickets.length >
> maxTickets) {
> +                                                       var text =
> $('div#content.ticket input#field-summary').val();
> +                                                       html += '<a
> href="' + searchBaseHref + escape(text) + '">More..</a>';
> +                                               }
> +
> +
> dupeticketlistDiv.html(html);
> +                                               $('> ul',
> dupeticketlistDiv).slideDown();
> +
> +                                       }
> +
> +                               },
> +                               error: function(xhr, textStatus,
> exception) {
> +                                       dupeticketlistDiv.html('<h5
> class="error">Error loading tickets: ' + textStatus + '</h5>');
> +                               }
> +                       });
> +               }
> +       });
> +
> +       function htmlencode(text) {
> +               return $('<div/>').text(text).html().replace(/"/g,
> '&quot;').replace(/'/g, '&apos;');
> +       }
> +});
>
> Propchange:
> bloodhound/bep_0013_dynamic_clientside_features/bloodhound_theme/bhtheme/htdocs/js/DupeSearch.js
>
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Modified:
> bloodhound/bep_0013_dynamic_clientside_features/bloodhound_theme/bhtheme/theme.py
> URL:
> http://svn.apache.org/viewvc/bloodhound/bep_0013_dynamic_clientside_features/bloodhound_theme/bhtheme/theme.py?rev=1608062&r1=1608061&r2=1608062&view=diff
>
> ==============================================================================
> ---
> bloodhound/bep_0013_dynamic_clientside_features/bloodhound_theme/bhtheme/theme.py
> (original)
> +++
> bloodhound/bep_0013_dynamic_clientside_features/bloodhound_theme/bhtheme/theme.py
> Sat Jul  5 17:08:06 2014
> @@ -27,6 +27,8 @@ from genshi.builder import tag
>  from genshi.core import TEXT, Markup
>  from genshi.filters.transform import Transformer
>  from genshi.output import DocType
> +from bhsearch.api import BloodhoundSearchApi
> +from bhsearch.web_ui import RequestContext
>
>  from trac.config import ListOption, Option
>  from trac.core import Component, TracError, implements
> @@ -1086,3 +1088,60 @@ class KeywordSuggestModule(Component):
>              keywords = ''
>
>          return keywords
> +
> +# component to find duplicate tickets
> +#DuplicateTicketSearch component basic structure is taken from trac
> DuplicateTicketSearch plugin
> +#https://trac-hacks.org/wiki/DuplicateTicketSearchPlugin
> +class DuplicateTicketSearch(Component):
> +    implements(ITemplateProvider, ITemplateStreamFilter,IRequestHandler)
> +
> +    # ITemplateProvider methods
> +
> +    def get_htdocs_dirs(self):
> +        from pkg_resources import resource_filename
> +        return [('duplicateticketsearch', resource_filename(__name__,
> 'htdocs'))]
> +
> +    def get_templates_dirs(self):
> +        return []
> +
> +
> +    # ITemplateStreamFilter methods
> +
> +    def filter_stream(self, req, method, filename, stream, data):
> +
> +        if filename == 'bh_ticket.html':
> +            ticket = data.get('ticket')
> +            if ticket and not ticket.id:   # only add for new tickets
> +                add_script(req, 'duplicateticketsearch/js/DupeSearch.js')
> +
> +        return stream
> +
> +        # IRequestHandler methods
> +
> +    def match_request(self, req):
> +        """Handle requests sent to /user_list and /ticket/user_list
> +        """
> +        return req.path_info.rstrip('/') == '/duplicate_ticket_search'
> +
> +    def process_request(self, req):
> +        product = self.env.product._data['prefix']
> +        query_result = BloodhoundSearchApi(self.env).query(
> +            req.args.get('q'),
> +            pagenum=1,
> +            pagelen=10,
> +            filter=['type:"ticket"', 'product:"'+product+'"'],
> +            highlight=True,
> +        )
> +        ticket_list = []
> +        cnt = 0
> +        for ticket in query_result.docs:
> +            ticket_list.append(to_json({'summary':
> query_result.highlighting[cnt]['summary'], 'description':
> query_result.highlighting[cnt]['content'],'type':ticket['type']
> ,'status':ticket['status'] , 'owner':ticket['author']
> ,'date':ticket['time'].strftime('%m/%d/%Y') ,'url': ticket['id']}))
> +            cnt+1
> +        str_list = '['+','.join(ticket_list)+']'
> +
> +        req.send(str_list, 'application/json')
> +
> +
> +
> +
> +
>
>
>


-- 




*Thimal Kempitiya <http://www.facebook.com/thimalk> UndergraduateDepartment
of Computer Science and Engineering University of Moratuwa.*