forked from DGNum/gestioCOF
Merge branch 'Aufinal/search_account' into 'k-fet'
Popup de recherche de compte Quand on clique sur l'icone de recherche (ou qu'on appuie sur Ctrl+F depuis la zone de saisie de trigramme) un popup apparaît pour rechercher les comptes par prénom ou par nom, en utilisant `autocomplete`. Fix #109 See merge request !153
This commit is contained in:
commit
75ff77c4ec
7 changed files with 209 additions and 99 deletions
|
@ -1,9 +1,5 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import (absolute_import, division,
|
||||
print_function, unicode_literals)
|
||||
from builtins import *
|
||||
|
||||
from django.shortcuts import render
|
||||
from django.http import Http404
|
||||
from django.db.models import Q
|
||||
|
@ -11,6 +7,7 @@ from gestioncof.models import User, Clipper
|
|||
from kfet.decorators import teamkfet_required
|
||||
from kfet.models import Account
|
||||
|
||||
|
||||
@teamkfet_required
|
||||
def account_create(request):
|
||||
if "q" not in request.GET:
|
||||
|
@ -32,31 +29,31 @@ def account_create(request):
|
|||
|
||||
for word in search_words:
|
||||
queries['kfet'] = queries['kfet'].filter(
|
||||
Q(cofprofile__user__username__icontains = word)
|
||||
| Q(cofprofile__user__first_name__icontains = word)
|
||||
| Q(cofprofile__user__last_name__icontains = word)
|
||||
Q(cofprofile__user__username__icontains=word) |
|
||||
Q(cofprofile__user__first_name__icontains=word) |
|
||||
Q(cofprofile__user__last_name__icontains=word)
|
||||
)
|
||||
queries['users_cof'] = queries['users_cof'].filter(
|
||||
Q(username__icontains = word)
|
||||
| Q(first_name__icontains = word)
|
||||
| Q(last_name__icontains = word)
|
||||
Q(username__icontains=word) |
|
||||
Q(first_name__icontains=word) |
|
||||
Q(last_name__icontains=word)
|
||||
)
|
||||
queries['users_notcof'] = queries['users_notcof'].filter(
|
||||
Q(username__icontains = word)
|
||||
| Q(first_name__icontains = word)
|
||||
| Q(last_name__icontains = word)
|
||||
Q(username__icontains=word) |
|
||||
Q(first_name__icontains=word) |
|
||||
Q(last_name__icontains=word)
|
||||
)
|
||||
queries['clippers'] = queries['clippers'].filter(
|
||||
Q(username__icontains = word)
|
||||
| Q(fullname__icontains = word)
|
||||
Q(username__icontains=word) |
|
||||
Q(fullname__icontains=word)
|
||||
)
|
||||
|
||||
queries['kfet'] = queries['kfet'].distinct()
|
||||
|
||||
usernames = list( \
|
||||
usernames = list(
|
||||
queries['kfet'].values_list('cofprofile__user__username', flat=True))
|
||||
|
||||
queries['kfet'] = [ (account, account.cofprofile.user) \
|
||||
queries['kfet'] = [(account, account.cofprofile.user)
|
||||
for account in queries['kfet']]
|
||||
|
||||
queries['users_cof'] = \
|
||||
|
@ -64,9 +61,9 @@ def account_create(request):
|
|||
queries['users_notcof'] = \
|
||||
queries['users_notcof'].exclude(username__in=usernames).distinct()
|
||||
|
||||
usernames += list( \
|
||||
usernames += list(
|
||||
queries['users_cof'].values_list('username', flat=True))
|
||||
usernames += list( \
|
||||
usernames += list(
|
||||
queries['users_notcof'].values_list('username', flat=True))
|
||||
|
||||
queries['clippers'] = \
|
||||
|
@ -80,3 +77,25 @@ def account_create(request):
|
|||
data['options'] = options
|
||||
|
||||
return render(request, "kfet/account_create_autocomplete.html", data)
|
||||
|
||||
|
||||
def account_search(request):
|
||||
if "q" not in request.GET:
|
||||
raise Http404
|
||||
q = request.GET.get("q")
|
||||
words = q.split()
|
||||
|
||||
data = {'q': q}
|
||||
|
||||
for word in words:
|
||||
query = Account.objects.filter(
|
||||
Q(cofprofile__user__username__icontains=word) |
|
||||
Q(cofprofile__user__first_name__icontains=word) |
|
||||
Q(cofprofile__user__last_name__icontains=word)
|
||||
).distinct()
|
||||
|
||||
query = [(account.trigramme, account.cofprofile.user.get_full_name())
|
||||
for account in query]
|
||||
|
||||
data['accounts'] = query
|
||||
return render(request, 'kfet/account_search_autocomplete.html', data)
|
||||
|
|
|
@ -83,3 +83,24 @@
|
|||
padding-right: 50px;
|
||||
padding-left: 50px;
|
||||
}
|
||||
|
||||
/* Account autocomplete window */
|
||||
|
||||
#account_results ul {
|
||||
list-style-type:none;
|
||||
background:rgba(255,255,255,0.9);
|
||||
padding:0;
|
||||
}
|
||||
|
||||
#account_results li {
|
||||
display:block;
|
||||
padding:5px 20px;
|
||||
height:100%;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
#account_results .hilight {
|
||||
background:rgba(200,16,46,0.9);
|
||||
color:#fff;
|
||||
text-decoration:none;
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
</a>
|
||||
</li>
|
||||
{% if kfet %}
|
||||
<li class="user_category"><span class="text">Comptes existant</span></li>
|
||||
<li class="user_category"><span class="text">Comptes existants</span></li>
|
||||
{% for account, user in kfet %}
|
||||
<li><span class="text">{{ account }} [{{ user|highlight_user:q }}]</span></li>
|
||||
{% endfor %}
|
||||
|
|
14
kfet/templates/kfet/account_search_autocomplete.html
Normal file
14
kfet/templates/kfet/account_search_autocomplete.html
Normal file
|
@ -0,0 +1,14 @@
|
|||
{% load kfet_tags %}
|
||||
|
||||
<ul>
|
||||
{% if accounts %}
|
||||
{% for trigramme, user in accounts %}
|
||||
<li class='choice'>{{ user|highlight_text:q }} (<span class="trigramme">{{ trigramme }}</span>)</li>
|
||||
{% endfor %}
|
||||
{% elif not q %}
|
||||
<li class="user_category"><span class="text">Pas de recherche, pas de résultats !</span></li>
|
||||
{% else %}
|
||||
<li class="user_category"><span class="text">Aucune correspondance trouvée :-(</span></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
|
@ -4,6 +4,7 @@
|
|||
{% block extra_head %}
|
||||
<link rel="stylesheet" style="text/css" href="{% static 'kfet/css/jquery-ui.min.css' %}">
|
||||
<link rel="stylesheet" style="text/css" href="{% static 'kfet/css/kpsul_grid.css' %}">
|
||||
<script src="{% static "autocomplete_light/autocomplete.js" %}" type="text/javascript"></script>
|
||||
<script type="text/javascript" src="{% static 'kfet/js/js.cookie.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'kfet/js/reconnecting-websocket.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'kfet/js/jquery-ui.min.js' %}"></script>
|
||||
|
@ -260,12 +261,56 @@ $(document).ready(function() {
|
|||
buttons += '<a href="'+url_base+'?trigramme='+trigramme+'" class="btn btn-primary" target="_blank" title="Créer"><span class="glyphicon glyphicon-plus"></span></a>';
|
||||
} else {
|
||||
var url_base = '{% url 'kfet.account' %}'
|
||||
buttons += '<a href="'+url_base+'" class="btn btn-primary" target="_blank" title="Rechercher"><span class="glyphicon glyphicon-search"></span></a>';
|
||||
buttons += '<button class="btn btn-primary search" title="Rechercher"><span class="glyphicon glyphicon-search"></span></button>';
|
||||
}
|
||||
}
|
||||
account_container.find('.buttons').html(buttons);
|
||||
}
|
||||
|
||||
// Search for an account
|
||||
function searchAccount() {
|
||||
var content = '<input type="text" name="q" id="search_autocomplete" spellcheck="false" autofocus><div id="account_results"></div>' ;
|
||||
$.dialog({
|
||||
title: 'Recherche de compte',
|
||||
content: content,
|
||||
backgroundDismiss: true,
|
||||
animation: 'top',
|
||||
closeAnimation: 'bottom',
|
||||
keyboardEnabled: true,
|
||||
onOpen: function() {
|
||||
var that=this ;
|
||||
$('input#search_autocomplete').yourlabsAutocomplete({
|
||||
url: '{% url "kfet.account.search.autocomplete" %}',
|
||||
minimumCharacters: 2,
|
||||
id: 'search_autocomplete',
|
||||
choiceSelector: '.choice',
|
||||
placeholder: "Chercher un utilisateur K-Fêt",
|
||||
box: $("#account_results"),
|
||||
});
|
||||
$('input#search_autocomplete').bind(
|
||||
'selectChoice',
|
||||
function(e, choice, autocomplete) {
|
||||
autocomplete.hide() ;
|
||||
triInput.val(choice.find('.trigramme').text()) ;
|
||||
triInput.trigger('input') ;
|
||||
that.close() ;
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
account_container.on('click', '.search', function () {
|
||||
searchAccount() ;
|
||||
}) ;
|
||||
|
||||
account_container.on('keydown', function(e) {
|
||||
if (e.which == 70 && e.ctrlKey) {
|
||||
// Ctrl + F : universal search shortcut
|
||||
searchAccount() ;
|
||||
e.preventDefault() ;
|
||||
}
|
||||
});
|
||||
|
||||
// Clear data
|
||||
function resetAccountData() {
|
||||
account_data = account_data_default;
|
||||
|
|
|
@ -1,23 +1,24 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import (absolute_import, division,
|
||||
print_function, unicode_literals)
|
||||
from builtins import *
|
||||
|
||||
from django import template
|
||||
from django.utils.html import escape
|
||||
from django.utils.safestring import mark_safe
|
||||
from django.core.cache import cache
|
||||
from kfet.models import Settings
|
||||
from math import floor
|
||||
import re
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
@register.filter()
|
||||
def highlight_text(text, q):
|
||||
q2 = "|".join(q.split())
|
||||
pattern = re.compile(r"(?P<filter>%s)" % q2, re.IGNORECASE)
|
||||
return mark_safe(re.sub(pattern, r"<span class='highlight_autocomplete'>\g<filter></span>", text))
|
||||
return mark_safe(
|
||||
re.sub(pattern,
|
||||
r"<span class='highlight_autocomplete'>\g<filter></span>",
|
||||
escape(text)))
|
||||
|
||||
|
||||
@register.filter(is_safe=True)
|
||||
def highlight_user(user, q):
|
||||
|
@ -25,7 +26,8 @@ def highlight_user(user, q):
|
|||
text = "%s %s (%s)" % (user.first_name, user.last_name, user.username)
|
||||
else:
|
||||
text = user.username
|
||||
return highlight_text(escape(text), q)
|
||||
return highlight_text(text, q)
|
||||
|
||||
|
||||
@register.filter(is_safe=True)
|
||||
def highlight_clipper(clipper, q):
|
||||
|
@ -33,7 +35,8 @@ def highlight_clipper(clipper, q):
|
|||
text = "%s (%s)" % (clipper.fullname, clipper.username)
|
||||
else:
|
||||
text = clipper.username
|
||||
return highlight_text(escape(text), q)
|
||||
return highlight_text(text, q)
|
||||
|
||||
|
||||
@register.filter()
|
||||
def ukf(balance, is_cof):
|
||||
|
|
30
kfet/urls.py
30
kfet/urls.py
|
@ -1,9 +1,5 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from __future__ import (absolute_import, division,
|
||||
print_function, unicode_literals)
|
||||
from builtins import *
|
||||
|
||||
from django.conf.urls import url
|
||||
from django.contrib.auth.decorators import permission_required
|
||||
from kfet import views
|
||||
|
@ -35,13 +31,18 @@ urlpatterns = [
|
|||
name='kfet.account.create_special'),
|
||||
url(r'^accounts/new/user/(?P<username>.+)$', views.account_create_ajax,
|
||||
name='kfet.account.create.fromuser'),
|
||||
url(r'^accounts/new/clipper/(?P<login_clipper>.+)$', views.account_create_ajax,
|
||||
url(r'^accounts/new/clipper/(?P<login_clipper>.+)$',
|
||||
views.account_create_ajax,
|
||||
name='kfet.account.create.fromclipper'),
|
||||
url(r'^accounts/new/empty$', views.account_create_ajax,
|
||||
name='kfet.account.create.empty'),
|
||||
url(r'^autocomplete/account_new$', autocomplete.account_create,
|
||||
name='kfet.account.create.autocomplete'),
|
||||
|
||||
# Account - Search
|
||||
url(r'^autocomplete/account_search$', autocomplete.account_search,
|
||||
name='kfet.account.search.autocomplete'),
|
||||
|
||||
# Account - Read
|
||||
url(r'^accounts/(?P<trigramme>.{3})$', views.account_read,
|
||||
name='kfet.account.read'),
|
||||
|
@ -54,14 +55,17 @@ urlpatterns = [
|
|||
url(r'^accounts/groups$', views.account_group,
|
||||
name='kfet.account.group'),
|
||||
url(r'^accounts/groups/new$',
|
||||
permission_required('kfet.manage_perms')(views.AccountGroupCreate.as_view()),
|
||||
permission_required('kfet.manage_perms')
|
||||
(views.AccountGroupCreate.as_view()),
|
||||
name='kfet.account.group.create'),
|
||||
url(r'^accounts/groups/(?P<pk>\d+)/edit$',
|
||||
permission_required('kfet.manage_perms')(views.AccountGroupUpdate.as_view()),
|
||||
permission_required('kfet.manage_perms')
|
||||
(views.AccountGroupUpdate.as_view()),
|
||||
name='kfet.account.group.update'),
|
||||
|
||||
url(r'^accounts/negatives$',
|
||||
permission_required('kfet.view_negs')(views.AccountNegativeList.as_view()),
|
||||
permission_required('kfet.view_negs')
|
||||
(views.AccountNegativeList.as_view()),
|
||||
name='kfet.account.negative'),
|
||||
|
||||
# -----
|
||||
|
@ -85,7 +89,9 @@ urlpatterns = [
|
|||
teamkfet_required(views.CheckoutUpdate.as_view()),
|
||||
name='kfet.checkout.update'),
|
||||
|
||||
### Checkout Statements urls
|
||||
# -----
|
||||
# Checkout Statement urls
|
||||
# -----
|
||||
|
||||
# Checkout Statement - General
|
||||
url('^checkouts/statements/$',
|
||||
|
@ -154,10 +160,12 @@ urlpatterns = [
|
|||
# -----
|
||||
|
||||
url(r'^settings/$',
|
||||
permission_required('kfet.change_settings')(views.SettingsList.as_view()),
|
||||
permission_required('kfet.change_settings')
|
||||
(views.SettingsList.as_view()),
|
||||
name='kfet.settings'),
|
||||
url(r'^settings/(?P<pk>\d+)/edit$',
|
||||
permission_required('kfet.change_settings')(views.SettingsUpdate.as_view()),
|
||||
permission_required('kfet.change_settings')
|
||||
(views.SettingsUpdate.as_view()),
|
||||
name='kfet.settings.update'),
|
||||
|
||||
# -----
|
||||
|
|
Loading…
Reference in a new issue