in autocomplete users show username,email, name of single user.
keyword suggest according to the product
add autocomplete to subjects and groups in admin permission page


On Mon, Jun 9, 2014 at 9:18 PM, <[email protected]> wrote:

> Author: thimal
> Date: Mon Jun  9 15:48:06 2014
> New Revision: 1601412
>
> URL: http://svn.apache.org/r1601412
> Log:
> show users with username,email and name
> show keywords according to product
> show subjects and groups in admin permission page
>
> Modified:
>
> bloodhound/bep_0013_dynamic_clientside_features/bloodhound_theme/bhtheme/theme.py
>
> 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=1601412&r1=1601411&r2=1601412&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
> Mon Jun  9 15:48:06 2014
> @@ -705,23 +705,14 @@ class AutocompleteUsers(Component):
>          subjects = ['admin','adam','test','user1']
>          if req.args.get('users', '1') == '1':
>              users = self._get_users(req)
> -            subjects = ['%s|%s|%s' % (user[USER],
> -                                      user[EMAIL] and '&lt;%s&gt; ' %
> user[EMAIL] or '',
> -                                      user[NAME])
> -                        for value, user in users]  # value unused
> (placeholder needed for sorting)
> -
> -        if req.args.get('groups'):
> -            groups = self._get_groups(req)
> -            if groups:
> -                subjects.extend(['%s||group' % group for group in groups])
> -        respond_str = "["
> -        for user in subjects:
> -            respond_str = respond_str +'"'+str(user)+'"'+','
> -        respond_str = respond_str[:-1]
> -        respond_str = respond_str + "]"
> -
> -        resppondStr='\n'.join(subjects).encode('utf-8');
> +            subjects = ['{"label":"%s %s %s","value":"%s"}' % (user[USER]
> and '%s' % user[USER] or '',
> +                                      user[EMAIL] and '<%s>' %
> user[EMAIL] or '',
> +                                      user[NAME] and '%s' % user[NAME] or
> '',
> +                                        user[USER])
> +                            for value, user in users]  # value unused
> (placeholder needed for sorting)
>
> +        respond_str = ','.join(subjects).encode('utf-8')
> +        respond_str = '[' + respond_str + ']'
>          req.send(respond_str, 'text/plain')
>
>      # ITemplateProvider methods
> @@ -787,26 +778,48 @@ class AutocompleteUsers(Component):
>                              formatItem: formatItem
>                          });
>                      });"""
> +            stream = stream |
> Transformer('.//head').append(tag.script(Markup(js),
> +
> type='text/javascript'))
>
>          elif filename == 'bh_admin_perms.html':
> +            users = self._get_users(req)
> +            subjects = ['{"label":"%s %s %s","value":"%s"}' % (user[USER]
> and '%s' % user[USER] or '',
> +                                      user[EMAIL] and '<%s>' %
> user[EMAIL] or '',
> +                                      user[NAME] and '%s' % user[NAME] or
> '',
> +                                        user[USER])
> +                            for value, user in users]  # value unused
> (placeholder needed for sorting)
>
> -            js = """$(document).ready(function () {
> +            groups = self._get_groups(req)
> +            if groups:
> +                subjects_groups = ['{"label":"%s||group","value":"%s"}' %
> (group, group) for group in groups]
> +                subjects.extend(subjects_groups)
> +
> +                respond_str_subjects = ','.join(subjects).encode('utf-8')
> +                respond_str_subjects = '[' + respond_str_subjects + ']'
>
> +                respond_str_groups =
> ','.join(subjects_groups).encode('utf-8')
> +                respond_str_groups = '[' + respond_str_groups + ']'
> +
> +            js = """$(document).ready(function () {
> +                    var subjects =  %(subject)s
> +                    var groups =  %(group)s
>                        $("#gp_subject").autocomplete( {
> -                        source: "perm/user_list",
> +                        source: subjects,
>                          formatItem: formatItem
>                        });
>                        $("#sg_subject").autocomplete( {
> -                        source: "user_list?groups=1",
> +                        source: subjects,
>                          formatItem: formatItem
>                        });
>                        $("#sg_group").autocomplete({
> -                        source: "perm/user_list?groups=1&users=0",
> +                        source: groups,
>                          formatItem: formatItem
>                        });
>                      });"""
> -
> -        stream = stream |
> Transformer('.//head').append(tag.script(Markup(js),
> +            js_ticket = js % {'subject': respond_str_subjects,
> +                                'group': respond_str_groups
> +                              }
> +            stream = stream |
> Transformer('.//head').append(tag.script(Markup(js_ticket),
>
> type='text/javascript'))
>
>          return stream
> @@ -874,7 +887,7 @@ class KeywordSuggestModule(Component):
>      def post_process_request(self, req, template, data, content_type):
>          if req.path_info.startswith('/ticket/') or \
>                  req.path_info.startswith('/newticket') or \
> -                (req.path_info.startswith('/wiki/')):
> +                (req.path_info.startswith('/query')):
>                  add_script(req,
> 'keywordssuggest/js/bootstrap-tagsinput.js')
>                  add_stylesheet(req,
> 'keywordssuggest/css/bootstrap-tagsinput.css')
>
> @@ -884,25 +897,83 @@ class KeywordSuggestModule(Component):
>      def filter_stream(self, req, method, filename, stream, data):
>
>          if not (filename == 'bh_ticket.html' or
> -                    (filename == 'bh_wiki_edit.html')):
> +                    (filename == 'bh_query.html')):
>              return stream
>
>          keywords = self._get_keywords_string(req)
>          if not keywords:
>              self.log.debug("""
>                  No keywords found. KeywordSuggestPlugin is disabled.""")
> +            keywords = []
> +
> +        if filename == 'bh_ticket.html':
> +            js = """jQuery(document).ready(function($) {
> +                        var keywords =  %(keywords)s
>
> -        js = """jQuery(document).ready(function($) {
> -                    var keywords =  %(keywords)s
>
> +                        $('%(field)s').tagsinput({
> +                            typeahead: {
> +                                source: keywords
> +                                }
> +                            });
> +                    });"""
>
> -                    $('%(field)s').tagsinput({
> -                        typeahead: {
> -                            source: keywords
> +        if filename == 'bh_query.html':
> +            js = """$(document).ready(function ($) {
> +                          function addAutocompleteBehavior() {
> +                            var filters = $('#filters');
> +                            var contains = $.contains // jQuery 1.4+
> +                              || function (container, contained) {
> +                              while (contained !== null) {
> +                                if (container === contained)
> +                                  return true;
> +                                contained = contained.parentNode;
> +                              }
> +                              return false;
> +                            };
> +                            var listener = function (event) {
> +                              var target = event.target ||
> event.srcElement;
> +                              filters.each(function () {
> +                                if (contains(this, target)) {
> +                                  var input =
> $(this).find('input:text').filter(function () {
> +                                    return target === this;
> +                                  });
> +                                  var name = input.attr('name');
> +                                  if (input.attr('autocomplete') !==
> 'off' &&
> +
>  /^(?:[0-9]+_)?(?:keywords)$/.test(name)) {
> +                                    input.tagsinput({
> +                                        typeahead: {
> +                                            source: %(keywords)s
> +                                            }
> +                                        });
> +                                    input.focus(); // XXX Workaround for
> Trac 0.12.2 and jQuery 1.4.2
> +                                  }
> +                                }
> +                              });
> +                            };
> +                            if ($.fn.on) {
> +                              // delegate method is available in jQuery
> 1.7+
> +                              filters.on('focusin', 'input:text',
> listener);
>                              }
> -                        });
> +                            else if ($.fn.delegate) {
> +                              // delegate method is available in jQuery
> 1.4.2+
> +                              filters.delegate('input:text', 'focus',
> listener);
> +                            }
> +                            else if (window.addEventListener) {
> +                              // use capture=true cause focus event
> doesn't bubble in the default
> +                              filters.each(function () {
> +                                this.addEventListener('focus', listener,
> true);
> +                              });
> +                            }
> +                            else {
> +                              // focusin event bubbles, the event is
> avialable for IE only
> +                              filters.each(function () {
> +                                this.attachEvent('onfocusin', listener);
> +                              });
> +                            }
> +                          }
> +                          addAutocompleteBehavior();
>                  });"""
> -
>          # inject transient part of javascript directly into ticket.html
> template
>          if req.path_info.startswith('/ticket/') or \
>                  req.path_info.startswith('/newticket'):
> @@ -912,6 +983,11 @@ class KeywordSuggestModule(Component):
>              stream = stream | Transformer('.//head').append \
>                  (tag.script(Markup(js_ticket),
>                              type='text/javascript'))
> +        if req.path_info.startswith('/query'):
> +            js_ticket = js % {'keywords': keywords}
> +            stream = stream | Transformer('.//head').append \
> +                (tag.script(Markup(js_ticket),
> +                            type='text/javascript'))
>
>          return stream
>
> @@ -928,10 +1004,14 @@ class KeywordSuggestModule(Component):
>
>      # Private methods
>      def _get_keywords_string(self, req):
> +
>          # get keywords from db
>          db = self.env.get_db_cnx()
>          cursor = db.cursor()
> -        cursor.execute("""SELECT t.keywords FROM ticket AS t WHERE
> t.keywords IS NOT null""")
> +        product = self.env.product._data['prefix']
> +        sql = """SELECT t.keywords FROM ticket AS t WHERE t.keywords IS
> NOT null AND t.product ='%s'""" % product
> +
> +        cursor.execute(sql)
>          keywords = []
>          for row in cursor:
>              if not row[0] == '':
>
>
>


-- 




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

Reply via email to