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:
Martin Pepin 2017-01-25 23:58:08 +01:00
commit 75ff77c4ec
7 changed files with 209 additions and 99 deletions

View file

@ -1,9 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import (absolute_import, division,
print_function, unicode_literals)
from builtins import *
from django.shortcuts import render from django.shortcuts import render
from django.http import Http404 from django.http import Http404
from django.db.models import Q from django.db.models import Q
@ -11,6 +7,7 @@ from gestioncof.models import User, Clipper
from kfet.decorators import teamkfet_required from kfet.decorators import teamkfet_required
from kfet.models import Account from kfet.models import Account
@teamkfet_required @teamkfet_required
def account_create(request): def account_create(request):
if "q" not in request.GET: if "q" not in request.GET:
@ -25,48 +22,48 @@ def account_create(request):
queries = {} queries = {}
search_words = q.split() search_words = q.split()
queries['kfet'] = Account.objects queries['kfet'] = Account.objects
queries['users_cof'] = User.objects.filter(Q(profile__is_cof = True)) queries['users_cof'] = User.objects.filter(Q(profile__is_cof=True))
queries['users_notcof'] = User.objects.filter(Q(profile__is_cof = False)) queries['users_notcof'] = User.objects.filter(Q(profile__is_cof=False))
queries['clippers'] = Clipper.objects queries['clippers'] = Clipper.objects
for word in search_words: for word in search_words:
queries['kfet'] = queries['kfet'].filter( queries['kfet'] = queries['kfet'].filter(
Q(cofprofile__user__username__icontains = word) Q(cofprofile__user__username__icontains=word) |
| Q(cofprofile__user__first_name__icontains = word) Q(cofprofile__user__first_name__icontains=word) |
| Q(cofprofile__user__last_name__icontains = word) Q(cofprofile__user__last_name__icontains=word)
) )
queries['users_cof'] = queries['users_cof'].filter( queries['users_cof'] = queries['users_cof'].filter(
Q(username__icontains = word) Q(username__icontains=word) |
| Q(first_name__icontains = word) Q(first_name__icontains=word) |
| Q(last_name__icontains = word) Q(last_name__icontains=word)
) )
queries['users_notcof'] = queries['users_notcof'].filter( queries['users_notcof'] = queries['users_notcof'].filter(
Q(username__icontains = word) Q(username__icontains=word) |
| Q(first_name__icontains = word) Q(first_name__icontains=word) |
| Q(last_name__icontains = word) Q(last_name__icontains=word)
) )
queries['clippers'] = queries['clippers'].filter( queries['clippers'] = queries['clippers'].filter(
Q(username__icontains = word) Q(username__icontains=word) |
| Q(fullname__icontains = word) Q(fullname__icontains=word)
) )
queries['kfet'] = queries['kfet'].distinct() queries['kfet'] = queries['kfet'].distinct()
usernames = list( \ usernames = list(
queries['kfet'].values_list('cofprofile__user__username', flat=True)) 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'] ] for account in queries['kfet']]
queries['users_cof'] = \ queries['users_cof'] = \
queries['users_cof'].exclude(username__in=usernames).distinct() queries['users_cof'].exclude(username__in=usernames).distinct()
queries['users_notcof'] = \ queries['users_notcof'] = \
queries['users_notcof'].exclude(username__in=usernames).distinct() queries['users_notcof'].exclude(username__in=usernames).distinct()
usernames += list( \ usernames += list(
queries['users_cof'].values_list('username', flat=True)) queries['users_cof'].values_list('username', flat=True))
usernames += list( \ usernames += list(
queries['users_notcof'].values_list('username', flat=True)) queries['users_notcof'].values_list('username', flat=True))
queries['clippers'] = \ queries['clippers'] = \
@ -80,3 +77,25 @@ def account_create(request):
data['options'] = options data['options'] = options
return render(request, "kfet/account_create_autocomplete.html", data) 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)

View file

@ -83,3 +83,24 @@
padding-right: 50px; padding-right: 50px;
padding-left: 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;
}

View file

@ -7,7 +7,7 @@
</a> </a>
</li> </li>
{% if kfet %} {% 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 %} {% for account, user in kfet %}
<li><span class="text">{{ account }} [{{ user|highlight_user:q }}]</span></li> <li><span class="text">{{ account }} [{{ user|highlight_user:q }}]</span></li>
{% endfor %} {% endfor %}

View 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>

View file

@ -4,6 +4,7 @@
{% block extra_head %} {% 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/jquery-ui.min.css' %}">
<link rel="stylesheet" style="text/css" href="{% static 'kfet/css/kpsul_grid.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/js.cookie.js' %}"></script>
<script type="text/javascript" src="{% static 'kfet/js/reconnecting-websocket.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> <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>'; buttons += '<a href="'+url_base+'?trigramme='+trigramme+'" class="btn btn-primary" target="_blank" title="Créer"><span class="glyphicon glyphicon-plus"></span></a>';
} else { } else {
var url_base = '{% url 'kfet.account' %}' 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); 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 // Clear data
function resetAccountData() { function resetAccountData() {
account_data = account_data_default; account_data = account_data_default;

View file

@ -1,23 +1,24 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import (absolute_import, division,
print_function, unicode_literals)
from builtins import *
from django import template from django import template
from django.utils.html import escape from django.utils.html import escape
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.core.cache import cache
from kfet.models import Settings from kfet.models import Settings
from math import floor from math import floor
import re import re
register = template.Library() register = template.Library()
@register.filter()
def highlight_text(text, q): def highlight_text(text, q):
q2 = "|".join(q.split()) q2 = "|".join(q.split())
pattern = re.compile(r"(?P<filter>%s)" % q2, re.IGNORECASE) 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) @register.filter(is_safe=True)
def highlight_user(user, q): 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) text = "%s %s (%s)" % (user.first_name, user.last_name, user.username)
else: else:
text = user.username text = user.username
return highlight_text(escape(text), q) return highlight_text(text, q)
@register.filter(is_safe=True) @register.filter(is_safe=True)
def highlight_clipper(clipper, q): def highlight_clipper(clipper, q):
@ -33,7 +35,8 @@ def highlight_clipper(clipper, q):
text = "%s (%s)" % (clipper.fullname, clipper.username) text = "%s (%s)" % (clipper.fullname, clipper.username)
else: else:
text = clipper.username text = clipper.username
return highlight_text(escape(text), q) return highlight_text(text, q)
@register.filter() @register.filter()
def ukf(balance, is_cof): def ukf(balance, is_cof):

View file

@ -1,9 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import (absolute_import, division,
print_function, unicode_literals)
from builtins import *
from django.conf.urls import url from django.conf.urls import url
from django.contrib.auth.decorators import permission_required from django.contrib.auth.decorators import permission_required
from kfet import views from kfet import views
@ -12,11 +8,11 @@ from kfet.decorators import teamkfet_required
urlpatterns = [ urlpatterns = [
url(r'^$', views.home, url(r'^$', views.home,
name = 'kfet.home'), name='kfet.home'),
url(r'^login/genericteam$', views.login_genericteam, url(r'^login/genericteam$', views.login_genericteam,
name = 'kfet.login.genericteam'), name='kfet.login.genericteam'),
url(r'^history$', views.history, url(r'^history$', views.history,
name = 'kfet.history'), name='kfet.history'),
# ----- # -----
# Account urls # Account urls
@ -24,45 +20,53 @@ urlpatterns = [
# Account - General # Account - General
url(r'^accounts/$', views.account, url(r'^accounts/$', views.account,
name = 'kfet.account'), name='kfet.account'),
url(r'^accounts/is_validandfree$', views.account_is_validandfree_ajax, url(r'^accounts/is_validandfree$', views.account_is_validandfree_ajax,
name = 'kfet.account.is_validandfree.ajax'), name='kfet.account.is_validandfree.ajax'),
# Account - Create # Account - Create
url(r'^accounts/new$', views.account_create, url(r'^accounts/new$', views.account_create,
name = 'kfet.account.create'), name='kfet.account.create'),
url(r'^accounts/new_special$', views.account_create_special, url(r'^accounts/new_special$', views.account_create_special,
name = 'kfet.account.create_special'), name='kfet.account.create_special'),
url(r'^accounts/new/user/(?P<username>.+)$', views.account_create_ajax, url(r'^accounts/new/user/(?P<username>.+)$', views.account_create_ajax,
name = 'kfet.account.create.fromuser'), 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>.+)$',
name = 'kfet.account.create.fromclipper'), views.account_create_ajax,
name='kfet.account.create.fromclipper'),
url(r'^accounts/new/empty$', views.account_create_ajax, url(r'^accounts/new/empty$', views.account_create_ajax,
name = 'kfet.account.create.empty'), name='kfet.account.create.empty'),
url(r'^autocomplete/account_new$', autocomplete.account_create, url(r'^autocomplete/account_new$', autocomplete.account_create,
name = 'kfet.account.create.autocomplete'), name='kfet.account.create.autocomplete'),
# Account - Search
url(r'^autocomplete/account_search$', autocomplete.account_search,
name='kfet.account.search.autocomplete'),
# Account - Read # Account - Read
url(r'^accounts/(?P<trigramme>.{3})$', views.account_read, url(r'^accounts/(?P<trigramme>.{3})$', views.account_read,
name = 'kfet.account.read'), name='kfet.account.read'),
# Account - Update # Account - Update
url(r'^accounts/(?P<trigramme>.{3})/edit$', views.account_update, url(r'^accounts/(?P<trigramme>.{3})/edit$', views.account_update,
name = 'kfet.account.update'), name='kfet.account.update'),
# Account - Groups # Account - Groups
url(r'^accounts/groups$', views.account_group, url(r'^accounts/groups$', views.account_group,
name = 'kfet.account.group'), name='kfet.account.group'),
url(r'^accounts/groups/new$', url(r'^accounts/groups/new$',
permission_required('kfet.manage_perms')(views.AccountGroupCreate.as_view()), permission_required('kfet.manage_perms')
name = 'kfet.account.group.create'), (views.AccountGroupCreate.as_view()),
name='kfet.account.group.create'),
url(r'^accounts/groups/(?P<pk>\d+)/edit$', url(r'^accounts/groups/(?P<pk>\d+)/edit$',
permission_required('kfet.manage_perms')(views.AccountGroupUpdate.as_view()), permission_required('kfet.manage_perms')
name = 'kfet.account.group.update'), (views.AccountGroupUpdate.as_view()),
name='kfet.account.group.update'),
url(r'^accounts/negatives$', url(r'^accounts/negatives$',
permission_required('kfet.view_negs')(views.AccountNegativeList.as_view()), permission_required('kfet.view_negs')
name = 'kfet.account.negative'), (views.AccountNegativeList.as_view()),
name='kfet.account.negative'),
# ----- # -----
# Checkout urls # Checkout urls
@ -71,34 +75,36 @@ urlpatterns = [
# Checkout - General # Checkout - General
url('^checkouts/$', url('^checkouts/$',
teamkfet_required(views.CheckoutList.as_view()), teamkfet_required(views.CheckoutList.as_view()),
name = 'kfet.checkout'), name='kfet.checkout'),
# Checkout - Create # Checkout - Create
url('^checkouts/new$', url('^checkouts/new$',
teamkfet_required(views.CheckoutCreate.as_view()), teamkfet_required(views.CheckoutCreate.as_view()),
name = 'kfet.checkout.create'), name='kfet.checkout.create'),
# Checkout - Read # Checkout - Read
url('^checkouts/(?P<pk>\d+)$', url('^checkouts/(?P<pk>\d+)$',
teamkfet_required(views.CheckoutRead.as_view()), teamkfet_required(views.CheckoutRead.as_view()),
name = 'kfet.checkout.read'), name='kfet.checkout.read'),
# Checkout - Update # Checkout - Update
url('^checkouts/(?P<pk>\d+)/edit$', url('^checkouts/(?P<pk>\d+)/edit$',
teamkfet_required(views.CheckoutUpdate.as_view()), teamkfet_required(views.CheckoutUpdate.as_view()),
name = 'kfet.checkout.update'), name='kfet.checkout.update'),
### Checkout Statements urls # -----
# Checkout Statement urls
# -----
# Checkout Statement - General # Checkout Statement - General
url('^checkouts/statements/$', url('^checkouts/statements/$',
teamkfet_required(views.CheckoutStatementList.as_view()), teamkfet_required(views.CheckoutStatementList.as_view()),
name = 'kfet.checkoutstatement'), name='kfet.checkoutstatement'),
# Checkout Statement - Create # Checkout Statement - Create
url('^checkouts/(?P<pk_checkout>\d+)/statements/add', url('^checkouts/(?P<pk_checkout>\d+)/statements/add',
teamkfet_required(views.CheckoutStatementCreate.as_view()), teamkfet_required(views.CheckoutStatementCreate.as_view()),
name = 'kfet.checkoutstatement.create'), name='kfet.checkoutstatement.create'),
# Checkout Statement - Update # Checkout Statement - Update
url('^checkouts/(?P<pk_checkout>\d+)/statements/(?P<pk>\d+)/edit', url('^checkouts/(?P<pk_checkout>\d+)/statements/(?P<pk>\d+)/edit',
teamkfet_required(views.CheckoutStatementUpdate.as_view()), teamkfet_required(views.CheckoutStatementUpdate.as_view()),
name = 'kfet.checkoutstatement.update'), name='kfet.checkoutstatement.update'),
# ----- # -----
# Article urls # Article urls
@ -107,46 +113,46 @@ urlpatterns = [
# Article - General # Article - General
url('^articles/$', url('^articles/$',
teamkfet_required(views.ArticleList.as_view()), teamkfet_required(views.ArticleList.as_view()),
name = 'kfet.article'), name='kfet.article'),
# Article - Create # Article - Create
url('^articles/new$', url('^articles/new$',
teamkfet_required(views.ArticleCreate.as_view()), teamkfet_required(views.ArticleCreate.as_view()),
name = 'kfet.article.create'), name='kfet.article.create'),
# Article - Read # Article - Read
url('^articles/(?P<pk>\d+)$', url('^articles/(?P<pk>\d+)$',
teamkfet_required(views.ArticleRead.as_view()), teamkfet_required(views.ArticleRead.as_view()),
name = 'kfet.article.read'), name='kfet.article.read'),
# Article - Update # Article - Update
url('^articles/(?P<pk>\d+)/edit$', url('^articles/(?P<pk>\d+)/edit$',
teamkfet_required(views.ArticleUpdate.as_view()), teamkfet_required(views.ArticleUpdate.as_view()),
name = 'kfet.article.update'), name='kfet.article.update'),
# ----- # -----
# K-Psul urls # K-Psul urls
# ----- # -----
url('^k-psul/$', views.kpsul, name = 'kfet.kpsul'), url('^k-psul/$', views.kpsul, name='kfet.kpsul'),
url('^k-psul/checkout_data$', views.kpsul_checkout_data, url('^k-psul/checkout_data$', views.kpsul_checkout_data,
name = 'kfet.kpsul.checkout_data'), name='kfet.kpsul.checkout_data'),
url('^k-psul/perform_operations$', views.kpsul_perform_operations, url('^k-psul/perform_operations$', views.kpsul_perform_operations,
name = 'kfet.kpsul.perform_operations'), name='kfet.kpsul.perform_operations'),
url('^k-psul/cancel_operations$', views.kpsul_cancel_operations, url('^k-psul/cancel_operations$', views.kpsul_cancel_operations,
name = 'kfet.kpsul.cancel_operations'), name='kfet.kpsul.cancel_operations'),
url('^k-psul/articles_data', views.kpsul_articles_data, url('^k-psul/articles_data', views.kpsul_articles_data,
name = 'kfet.kpsul.articles_data'), name='kfet.kpsul.articles_data'),
url('^k-psul/update_addcost$', views.kpsul_update_addcost, url('^k-psul/update_addcost$', views.kpsul_update_addcost,
name = 'kfet.kpsul.update_addcost'), name='kfet.kpsul.update_addcost'),
url('^k-psul/get_settings$', views.kpsul_get_settings, url('^k-psul/get_settings$', views.kpsul_get_settings,
name = 'kfet.kpsul.get_settings'), name='kfet.kpsul.get_settings'),
# ----- # -----
# JSON urls # JSON urls
# ----- # -----
url(r'^history.json$', views.history_json, url(r'^history.json$', views.history_json,
name = 'kfet.history.json'), name='kfet.history.json'),
url(r'^accounts/read.json$', views.account_read_json, url(r'^accounts/read.json$', views.account_read_json,
name = 'kfet.account.read.json'), name='kfet.account.read.json'),
# ----- # -----
@ -154,24 +160,26 @@ urlpatterns = [
# ----- # -----
url(r'^settings/$', url(r'^settings/$',
permission_required('kfet.change_settings')(views.SettingsList.as_view()), permission_required('kfet.change_settings')
name = 'kfet.settings'), (views.SettingsList.as_view()),
name='kfet.settings'),
url(r'^settings/(?P<pk>\d+)/edit$', url(r'^settings/(?P<pk>\d+)/edit$',
permission_required('kfet.change_settings')(views.SettingsUpdate.as_view()), permission_required('kfet.change_settings')
name = 'kfet.settings.update'), (views.SettingsUpdate.as_view()),
name='kfet.settings.update'),
# ----- # -----
# Transfers urls # Transfers urls
# ----- # -----
url(r'^transfers/$', views.transfers, url(r'^transfers/$', views.transfers,
name = 'kfet.transfers'), name='kfet.transfers'),
url(r'^transfers/new$', views.transfers_create, url(r'^transfers/new$', views.transfers_create,
name = 'kfet.transfers.create'), name='kfet.transfers.create'),
url(r'^transfers/perform$', views.perform_transfers, url(r'^transfers/perform$', views.perform_transfers,
name = 'kfet.transfers.perform'), name='kfet.transfers.perform'),
url(r'^transfers/cancel$', views.cancel_transfers, url(r'^transfers/cancel$', views.cancel_transfers,
name = 'kfet.transfers.cancel'), name='kfet.transfers.cancel'),
# ----- # -----
# Inventories urls # Inventories urls
@ -179,12 +187,12 @@ urlpatterns = [
url(r'^inventaires/$', url(r'^inventaires/$',
teamkfet_required(views.InventoryList.as_view()), teamkfet_required(views.InventoryList.as_view()),
name = 'kfet.inventory'), name='kfet.inventory'),
url(r'^inventaires/new$', views.inventory_create, url(r'^inventaires/new$', views.inventory_create,
name = 'kfet.inventory.create'), name='kfet.inventory.create'),
url(r'^inventaires/(?P<pk>\d+)$', url(r'^inventaires/(?P<pk>\d+)$',
teamkfet_required(views.InventoryRead.as_view()), teamkfet_required(views.InventoryRead.as_view()),
name = 'kfet.inventory.read'), name='kfet.inventory.read'),
# ----- # -----
# Order urls # Order urls
@ -192,15 +200,15 @@ urlpatterns = [
url(r'^orders/$', url(r'^orders/$',
teamkfet_required(views.OrderList.as_view()), teamkfet_required(views.OrderList.as_view()),
name = 'kfet.order'), name='kfet.order'),
url(r'^orders/(?P<pk>\d+)$', url(r'^orders/(?P<pk>\d+)$',
teamkfet_required(views.OrderRead.as_view()), teamkfet_required(views.OrderRead.as_view()),
name = 'kfet.order.read'), name='kfet.order.read'),
url(r'^orders/suppliers/(?P<pk>\d+)/edit$', url(r'^orders/suppliers/(?P<pk>\d+)/edit$',
teamkfet_required(views.SupplierUpdate.as_view()), teamkfet_required(views.SupplierUpdate.as_view()),
name = 'kfet.order.supplier.update'), name='kfet.order.supplier.update'),
url(r'^orders/suppliers/(?P<pk>\d+)/new-order$', views.order_create, url(r'^orders/suppliers/(?P<pk>\d+)/new-order$', views.order_create,
name = 'kfet.order.new'), name='kfet.order.new'),
url(r'^orders/(?P<pk>\d+)/to_inventory$', views.order_to_inventory, url(r'^orders/(?P<pk>\d+)/to_inventory$', views.order_to_inventory,
name = 'kfet.order.to_inventory'), name='kfet.order.to_inventory'),
] ]