From 468098ae7b12c2f9640cc1c551f86af2b8dbccb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 5 Sep 2016 20:07:08 +0200 Subject: [PATCH 01/24] =?UTF-8?q?S=C3=A9lection=20par=20d=C3=A9faut=20de?= =?UTF-8?q?=20la=20caisse=20lorsqu'il=20n'y=20en=20a=20qu'une=20seule=20di?= =?UTF-8?q?sponible?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kfet/templates/kfet/kpsul.html | 2 +- kfet/views.py | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index 1694d57f..95dbd208 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -1139,7 +1139,7 @@ $(document).ready(function() { function hardReset(give_tri_focus=true) { coolReset(give_tri_focus); - resetCheckout(); + checkoutInput.trigger('change'); resetArticles(); khistory.reset(); resetSettings(); diff --git a/kfet/views.py b/kfet/views.py index 736dbe8a..787ff102 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -796,7 +796,15 @@ def kpsul(request): data = {} data['operationgroup_form'] = KPsulOperationGroupForm() data['trigramme_form'] = KPsulAccountForm() - data['checkout_form'] = KPsulCheckoutForm() + initial = {} + try: + checkout = Checkout.objects.filter( + is_protected=False, valid_from__lte=timezone.now(), + valid_to__gte=timezone.now()).get() + initial['checkout'] = checkout + except Checkout.DoesNotExist, Checkout.MultipleObjectsReturned: + pass + data['checkout_form'] = KPsulCheckoutForm(initial=initial) operation_formset = KPsulOperationFormSet(queryset=Operation.objects.none()) data['operation_formset'] = operation_formset return render(request, 'kfet/kpsul.html', data) From 5e6645ab84be805441dface7210cc29e5495d684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 5 Sep 2016 20:19:46 +0200 Subject: [PATCH 02/24] Fix JS K-Psul --- kfet/static/kfet/js/kfet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kfet/static/kfet/js/kfet.js b/kfet/static/kfet/js/kfet.js index 7aa1d963..6ed1b2c0 100644 --- a/kfet/static/kfet/js/kfet.js +++ b/kfet/static/kfet/js/kfet.js @@ -67,7 +67,7 @@ function getErrorsHtml(data) { } if ('negative' in data['errors']) { var url_base = "{% url 'kfet.account.update' LIQ}"; - url_base = base_url(0, url_base.length-8); + url_base = url_base(0, url_base.length-8); for (var i=0; iAutorisation de négatif requise pour '+data['errors']['negative'][i]+''; } From 985dd2e82da384a96c028fffe723a2f096065ea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 5 Sep 2016 20:35:45 +0200 Subject: [PATCH 03/24] =?UTF-8?q?Fix=20autocompl=C3=A9tion=20article=20K-P?= =?UTF-8?q?sul?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kfet/templates/kfet/kpsul.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index 95dbd208..eaaad49a 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -635,7 +635,9 @@ $(document).ready(function() { return false; } - articleSelect.on('keypress', function(e) { + articleSelect.on('keydown', function(e) { + console.log('trolo'); + console.log(e.charCode); var text = articleSelect.val(); // Comportement normal pour ces touches if (normalKeys.test(e.keyCode) || e.ctrlKey) { @@ -648,12 +650,10 @@ $(document).ready(function() { articleSelect.val(''); } return true; - } else if (e.charCode !== 0) { - if (updateMatchedArticles(text+e.key)) { - articleNb.val('1'); - articleNb.focus().select(); - } - return false; + } + if (updateMatchedArticles(text+e.key)) { + articleNb.val('1'); + articleNb.focus().select(); } return false; }); From a5b19b4328093f4a7ca3524f45ed2d66675ab8f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 5 Sep 2016 20:38:15 +0200 Subject: [PATCH 04/24] fix js k-psul --- kfet/static/kfet/js/kfet.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kfet/static/kfet/js/kfet.js b/kfet/static/kfet/js/kfet.js index 6ed1b2c0..a82ca29f 100644 --- a/kfet/static/kfet/js/kfet.js +++ b/kfet/static/kfet/js/kfet.js @@ -67,7 +67,7 @@ function getErrorsHtml(data) { } if ('negative' in data['errors']) { var url_base = "{% url 'kfet.account.update' LIQ}"; - url_base = url_base(0, url_base.length-8); + url_base = url_base.substr(0, url_base.length - 8); for (var i=0; iAutorisation de négatif requise pour '+data['errors']['negative'][i]+''; } From 58cb6015fc85601e7fff5013fb66412672eef17f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Mon, 5 Sep 2016 22:12:58 +0200 Subject: [PATCH 05/24] fix transfers --- kfet/templates/kfet/kpsul.html | 2 -- kfet/views.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index eaaad49a..daa402b2 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -636,8 +636,6 @@ $(document).ready(function() { } articleSelect.on('keydown', function(e) { - console.log('trolo'); - console.log(e.charCode); var text = articleSelect.val(); // Comportement normal pour ces touches if (normalKeys.test(e.keyCode) || e.ctrlKey) { diff --git a/kfet/views.py b/kfet/views.py index 787ff102..77bed012 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -1410,7 +1410,7 @@ def perform_transfers(request): transfers = transfer_formset.save(commit = False) # Initializing vars - required_perms = set('kfet.add_transfer') # Required perms to perform all transfers + required_perms = set(['kfet.add_transfer']) # Required perms to perform all transfers to_accounts_balances = defaultdict(lambda:0) # For balances of accounts for transfer in transfers: From 5569b7d154c1b324713dc8d210bd293addd3bce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 6 Sep 2016 15:30:51 +0200 Subject: [PATCH 06/24] Fix encodage password --- kfet/backends.py | 2 +- kfet/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kfet/backends.py b/kfet/backends.py index 62b2d820..3729f1bd 100644 --- a/kfet/backends.py +++ b/kfet/backends.py @@ -18,7 +18,7 @@ class KFetBackend(object): return None try: - password_sha256 = hashlib.sha256(password.encode()).hexdigest() + password_sha256 = hashlib.sha256(password.encode('utf-8')).hexdigest() account = Account.objects.get(password=password_sha256) user = account.cofprofile.user except Account.DoesNotExist: diff --git a/kfet/views.py b/kfet/views.py index 77bed012..6bd260a3 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -399,7 +399,7 @@ def account_update(request, trigramme): if (request.user.has_perm('kfet.change_account_password') and pwd_form.is_valid()): pwd = pwd_form.cleaned_data['pwd1'] - pwd_sha256 = hashlib.sha256(pwd.encode()).hexdigest() + pwd_sha256 = hashlib.sha256(pwd.encode('utf-8')).hexdigest() Account.objects.filter(pk=account.pk).update( password = pwd_sha256) messages.success(request, 'Mot de passe mis à jour') From e154316eae3bd613722cccca43c4b1ad84a45522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 6 Sep 2016 16:33:04 +0200 Subject: [PATCH 07/24] =?UTF-8?q?Optimisation=20JS=20K-Psul=20s=C3=A9lecti?= =?UTF-8?q?on=20articles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kfet/templates/kfet/kpsul.html | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index daa402b2..aab04abe 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -504,17 +504,17 @@ $(document).ready(function() { function addArticle(article) { var article_html = $(article_default_html); - article_html.attr('data-article', article['id']); - article_html.attr('data-category', article['category_id']); + article_html.attr('id', 'data-article-'+article['id']); + article_html.addClass('data-category-'+article['category_id']); for (var elem in article) { article_html.find('.'+elem).text(article[elem]) } article_html.find('.price').text(amountToUKF(article['price'], false)); var category_html = articles_container - .find('.category[data-category='+article['category_id']+']'); + .find('#data-category-'+article['category_id']); if (category_html.length == 0) { category_html = $(article_category_default_html); - category_html.attr('data-category', article['category_id']); + category_html.attr('id', 'data-category-'+article['category_id']); category_html.find('td').text(article['category__name']); var added = false; articles_container.find('.category').each(function() { @@ -528,14 +528,14 @@ $(document).ready(function() { } var added = false; articles_container - .find('.article[data-category='+article['category_id']+']').each(function() { + .find('.article.data-category-'+article['category_id']).each(function() { if (article['name'].toLowerCase < $('.name', this).text().toLowerCase()) { $(this).before(article_html); added = true; return false; } }); - if (!added) articles_container.find('.category[data-category='+article['category_id']+']').after(article_html); + if (!added) articles_container.find('#data-category-'+article['category_id']).after(article_html); // Pour l'autocomplétion articlesList.push([article['name'],article['id'],article['category_id'],article['price']]); } @@ -597,17 +597,17 @@ $(document).ready(function() { var categories_to_display = []; for (var i=0; i -1) { - articles_container.find('[data-article='+articlesList[i][1]+']').show(); + articles_container.find('#data-article-'+articlesList[i][1]).show(); if (categories_to_display.indexOf(articlesList[i][2]) == -1) categories_to_display.push(articlesList[i][2]); } else { - articles_container.find('[data-article='+articlesList[i][1]+']').hide(); + articles_container.find('#data-article-'+articlesList[i][1]).hide(); } } articles_container.find('.category').hide(); for (var i=0; i Date: Tue, 6 Sep 2016 16:38:48 +0200 Subject: [PATCH 08/24] Clean JS ajout article et ordre des articles --- kfet/templates/kfet/kpsul.html | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index aab04abe..86bb48fa 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -526,16 +526,14 @@ $(document).ready(function() { }); if (!added) articles_container.append(category_html); } - var added = false; + var $after = articles_container.find('#data-category-'+article['category_id']); articles_container .find('.article.data-category-'+article['category_id']).each(function() { - if (article['name'].toLowerCase < $('.name', this).text().toLowerCase()) { - $(this).before(article_html); - added = true; + if (article['name'].toLowerCase < $('.name', this).text().toLowerCase()) return false; - } + $after = $(this); }); - if (!added) articles_container.find('#data-category-'+article['category_id']).after(article_html); + $after.after(article_html); // Pour l'autocomplétion articlesList.push([article['name'],article['id'],article['category_id'],article['price']]); } From f6fa13fa95725d4f33374f3d86ce1b2c4d5fde17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 6 Sep 2016 17:37:18 +0200 Subject: [PATCH 09/24] =?UTF-8?q?Fix=20url=20cr=C3=A9ation=20compte=20depu?= =?UTF-8?q?is=20K-Psul?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kfet/static/kfet/js/kfet.js | 1 - kfet/templates/kfet/kpsul.html | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kfet/static/kfet/js/kfet.js b/kfet/static/kfet/js/kfet.js index a82ca29f..28ca7de8 100644 --- a/kfet/static/kfet/js/kfet.js +++ b/kfet/static/kfet/js/kfet.js @@ -110,4 +110,3 @@ function requestAuth(data, callback, focus_next = null) { } }); } - diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index 86bb48fa..34af13b3 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -198,8 +198,9 @@ $(document).ready(function() { } if (account_data['id'] == 0) { var trigramme = triInput.val().toUpperCase(); + var url_base = '{% url 'kfet.account.create' %}' if (isValidTrigramme(trigramme)) { - buttons += ''; + buttons += ''; } } account_container.find('.buttons').html(buttons); From 6ba8c9e7416f431c953744a0468a7679a2b8f3ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 6 Sep 2016 17:50:05 +0200 Subject: [PATCH 10/24] URL Websocket K-Psul --- kfet/templates/kfet/kpsul.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index 34af13b3..c065f3de 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -1085,7 +1085,9 @@ $(document).ready(function() { websocket_msg_default = {'opegroups':[],'opes':[],'checkouts':[],'articles':[]} var websocket_protocol = window.location.protocol == 'https:' ? 'wss' : 'ws'; - socket = new ReconnectingWebSocket(websocket_protocol+"://" + window.location.host + "/ws/k-fet/k-psul/"); + var location_host = window.location.host; + var location_url = window.location.pathname.startsWith('/gestion/') ? location_host + '/gestion' : location_host; + socket = new ReconnectingWebSocket(websocket_protocol+"://" + location_url + "/ws/k-fet/k-psul/"); socket.onmessage = function(e) { data = $.extend({}, websocket_msg_default, JSON.parse(e.data)); From ad661cab096175a730d5793d8423a9ecddbf8b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 6 Sep 2016 18:50:57 +0200 Subject: [PATCH 11/24] fix url account neg K-Psul --- kfet/static/kfet/js/kfet.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/kfet/static/kfet/js/kfet.js b/kfet/static/kfet/js/kfet.js index 28ca7de8..dbfba0b2 100644 --- a/kfet/static/kfet/js/kfet.js +++ b/kfet/static/kfet/js/kfet.js @@ -66,8 +66,11 @@ function getErrorsHtml(data) { content += ''; } if ('negative' in data['errors']) { - var url_base = "{% url 'kfet.account.update' LIQ}"; - url_base = url_base.substr(0, url_base.length - 8); + if (window.location.pathname.startsWith('/gestion/')) { + var url_base = '/gestion/k-fet/accounts/'; + } else { + var url_base = '/k-fet/accounts/'; + } for (var i=0; iAutorisation de négatif requise pour '+data['errors']['negative'][i]+''; } From 120ffd574a733899e3bdcde9d94a127c4256173e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 6 Sep 2016 19:44:40 +0200 Subject: [PATCH 12/24] =?UTF-8?q?Fix=20liste=20utilisateurs=20cr=C3=A9atio?= =?UTF-8?q?n=20de=20compte?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kfet/templates/kfet/account_create_autocomplete.html | 1 + 1 file changed, 1 insertion(+) diff --git a/kfet/templates/kfet/account_create_autocomplete.html b/kfet/templates/kfet/account_create_autocomplete.html index b99abecf..1185c3a8 100644 --- a/kfet/templates/kfet/account_create_autocomplete.html +++ b/kfet/templates/kfet/account_create_autocomplete.html @@ -38,6 +38,7 @@
  • {{ clipper|highlight_clipper:q }} +
  • {% endfor %} {% endif %} From f614051365c0dbb225668271ff7d14a8967f421b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Tue, 6 Sep 2016 19:49:28 +0200 Subject: [PATCH 13/24] =?UTF-8?q?Fix=20cr=C3=A9ation=20compte?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kfet/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kfet/views.py b/kfet/views.py index 6bd260a3..a08be40b 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -219,7 +219,8 @@ def account_form_set_readonly_fields(user_form, cof_form): def get_account_create_forms(request=None, username=None, login_clipper=None): user = None clipper = None - if login_clipper and not username: + if login_clipper and (login_clipper == username or not username): + print('trololo') # à partir d'un clipper # le user associé à ce clipper ne devrait pas encore exister clipper = get_object_or_404(Clipper, username = login_clipper) From fe7f84ffadd097b98676bd14684868d9a3a0b605 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sat, 10 Sep 2016 22:49:07 +0200 Subject: [PATCH 14/24] Ajout message pour proposer connexion standard --- kfet/__init__.py | 1 + kfet/apps.py | 14 +++++++++++ kfet/signals.py | 16 ++++++++++++ kfet/static/kfet/css/index.css | 34 ++++++++++++++++++++++++++ kfet/templates/kfet/base_messages.html | 19 ++++++++++---- 5 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 kfet/apps.py create mode 100644 kfet/signals.py diff --git a/kfet/__init__.py b/kfet/__init__.py index e69de29b..5d6c8f97 100644 --- a/kfet/__init__.py +++ b/kfet/__init__.py @@ -0,0 +1 @@ +default_app_config = 'kfet.apps.KFetConfig' diff --git a/kfet/apps.py b/kfet/apps.py new file mode 100644 index 00000000..29f9f98e --- /dev/null +++ b/kfet/apps.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- + +from __future__ import (absolute_import, division, + print_function, unicode_literals) +from builtins import * + +from django.apps import AppConfig + +class KFetConfig(AppConfig): + name = 'kfet' + verbose_name = "Application K-Fêt" + + def ready(self): + import kfet.signals diff --git a/kfet/signals.py b/kfet/signals.py new file mode 100644 index 00000000..3dd4d677 --- /dev/null +++ b/kfet/signals.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- + +from __future__ import (absolute_import, division, + print_function, unicode_literals) +from builtins import * + +from django.contrib import messages +from django.contrib.auth.signals import user_logged_in +from django.core.urlresolvers import reverse +from django.dispatch import receiver + +@receiver(user_logged_in) +def messages_on_login(sender, request, user, **kwargs): + if (not user.username == 'kfet_genericteam' + and user.has_perm('kfet.is_team')): + messages.info(request, 'Connexion en utilisateur partagé ?' % reverse('kfet.login.genericteam'), extra_tags='safe') diff --git a/kfet/static/kfet/css/index.css b/kfet/static/kfet/css/index.css index c6ee9ff6..dc229b5d 100644 --- a/kfet/static/kfet/css/index.css +++ b/kfet/static/kfet/css/index.css @@ -263,3 +263,37 @@ textarea { display:block; padding:5px 20px; } + +/* + * Messages + */ + +.messages .alert { + padding:10px 15px; + margin:0; + border:0; + border-radius:0; +} + +.messages .alert-dismissible { + padding-right:35px; +} + +.messages .alert .close { + top:0; + right:0; +} + +.messages .alert-info { + color:inherit; + background-color:#ccc; +} + +.messages .alert-error { + color:inherit; + background-color:rgba(200,16,46,0.2); +} + +.messages .alert-success { + color:#333; +} diff --git a/kfet/templates/kfet/base_messages.html b/kfet/templates/kfet/base_messages.html index d2bb5061..440b8c10 100644 --- a/kfet/templates/kfet/base_messages.html +++ b/kfet/templates/kfet/base_messages.html @@ -1,7 +1,16 @@ {% if messages %} -
      - {% for message in messages %} - {{ message }} - {% endfor %} -
    +
    + {% for message in messages %} +
    +
    + + {% if 'safe' in message.tags %} + {{ message|safe }} + {% else %} + {{ message }} + {% endif %} +
    +
    + {% endfor %} +
    {% endif %} From 8d20dbfe244d4f5dfc19757cb8dfd030a3995aad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sat, 10 Sep 2016 22:54:23 +0200 Subject: [PATCH 15/24] Ajout affichage messages sur K-Psul --- kfet/templates/kfet/kpsul.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index c065f3de..b09830fc 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -21,6 +21,8 @@ {% block content %} +{% include 'kfet/base_messages.html' %} +
    From dc4f0473fe9b43bf3500fa722d64cb3329baf484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sun, 11 Sep 2016 22:55:46 +0200 Subject: [PATCH 16/24] Ajout affichage raccourcis K-Psul avec ctrl+Hw --- kfet/static/kfet/css/index.css | 44 +++++++++++++++++++++++++ kfet/templates/kfet/base.html | 8 +++++ kfet/templates/kfet/kpsul.html | 59 ++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+) diff --git a/kfet/static/kfet/css/index.css b/kfet/static/kfet/css/index.css index dc229b5d..f3e9bf8c 100644 --- a/kfet/static/kfet/css/index.css +++ b/kfet/static/kfet/css/index.css @@ -297,3 +297,47 @@ textarea { .messages .alert-success { color:#333; } + +/* + * Help + */ + +.help { + display:none; + position:fixed; + top:50px; + left:0; + right:0; + bottom:0; + overflow:auto; + background:rgba(51,51,51,0.3); + z-index:500; +} + +.help-box { + margin-top:30px; + padding-top:1px; + padding-bottom:15px; + background:rgba(51,51,51,0.7); + color:#fff; +} + +@media (max-width:768px) { + .help-box { + margin:20px 15px; + } +} + +.help h2 { + padding:0 15px 20px; + border-bottom:1px solid #999; + text-align:center; +} + +.help .row > div { + padding-right:0; +} + +.help h4 { + margin:15px 0; +} diff --git a/kfet/templates/kfet/base.html b/kfet/templates/kfet/base.html index c1db0c26..173a5fb7 100644 --- a/kfet/templates/kfet/base.html +++ b/kfet/templates/kfet/base.html @@ -40,5 +40,13 @@ {% block content %}{% endblock %} {% include "kfet/base_footer.html" %}
    +
    +
    +
    +

    Aide

    + {% block help %}{% endblock %} +
    +
    +
    diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index b09830fc..d4a1b1b8 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -19,6 +19,55 @@ {% block content-header %}{% endblock %} +{% block help %} + +
    +
    +
    +

    Opérations

    +
    +
    F3
    +
    Charge
    +
    +
    +
    Shift + F3
    +
    Retrait
    +
    +
    +
    F8
    +
    Edition
    +
    +
    +
    +
    +
    +

    Général

    +
    +
    F1
    +
    Reset
    +
    +
    +
    F2
    +
    Reset compte
    +
    +
    +
    Shift + F2
    +
    Reset panier
    +
    +
    +
    F9
    +
    Majoration
    +
    +
    +
    F10
    +
    Hard reset
    +
    +
    +
    +
    + +{% endblock %} + {% block content %} {% include 'kfet/base_messages.html' %} @@ -1164,6 +1213,16 @@ $(document).ready(function() { $(document).on('keydown', function(e) { switch (e.keyCode) { + case 27: + // Escape - Hide help + $('.help').hide('fast'); + return false; + case 72: + if (e.ctrlKey) { + // Ctrl+H - Display help + $('.help').show('fast'); + } + return false; case 112: // F1 - Cool reset coolReset(); From c79456e95803f3fe53fde125cc8a275b0fe2bf8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Mon, 12 Sep 2016 23:24:18 +0200 Subject: [PATCH 17/24] Syntaxe py3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `except e1, e2:` n'est pas valide en python3, il faut des parenthèses. --- kfet/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kfet/views.py b/kfet/views.py index a08be40b..98c4760a 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -803,7 +803,7 @@ def kpsul(request): is_protected=False, valid_from__lte=timezone.now(), valid_to__gte=timezone.now()).get() initial['checkout'] = checkout - except Checkout.DoesNotExist, Checkout.MultipleObjectsReturned: + except (Checkout.DoesNotExist, Checkout.MultipleObjectsReturned): pass data['checkout_form'] = KPsulCheckoutForm(initial=initial) operation_formset = KPsulOperationFormSet(queryset=Operation.objects.none()) From 0b618fa0452389ff1fc56f9a0e4170531826cf8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Thu, 22 Sep 2016 17:59:51 +0200 Subject: [PATCH 18/24] =?UTF-8?q?K-Psul=20-=20S=C3=A9lection=20des=20artic?= =?UTF-8?q?les?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajout de la sélection au clic (souris/tactile) --- kfet/static/kfet/css/kpsul.css | 5 +++++ kfet/templates/kfet/kpsul.html | 29 +++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/kfet/static/kfet/css/kpsul.css b/kfet/static/kfet/css/kpsul.css index b15f6de8..9fd53604 100644 --- a/kfet/static/kfet/css/kpsul.css +++ b/kfet/static/kfet/css/kpsul.css @@ -319,6 +319,11 @@ input[type=number]::-webkit-outer-spin-button { padding-left:20px; } +#articles_data .article:hover { + background:rgba(200,16,46,0.3); + cursor:pointer; +} + /* Second part - Left - bottom */ .kpsul_middle_left_bottom { diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index d4a1b1b8..2278a6f7 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -685,6 +685,12 @@ $(document).ready(function() { return false; } + // A utiliser après la sélection d'un article + function goToArticleNb() { + articleNb.val('1'); + articleNb.focus().select(); + } + articleSelect.on('keydown', function(e) { var text = articleSelect.val(); // Comportement normal pour ces touches @@ -699,13 +705,28 @@ $(document).ready(function() { } return true; } - if (updateMatchedArticles(text+e.key)) { - articleNb.val('1'); - articleNb.focus().select(); - } + if (updateMatchedArticles(text+e.key)) + goToArticleNb(); return false; }); + function getArticleId($article) { + return $article.attr('id').split('-')[2]; + } + + function getArticleName($article) { + return $article.find('.name').text(); + } + + // Sélection des articles à la souris/tactile + articles_container.on('click', '.article', function() { + console.log('1'); + articleId.val(getArticleId($(this))); + articleSelect.val(getArticleName($(this))); + displayMatchedArticles(articlesList); + goToArticleNb(); + }); + function is_nb_ok(nb) { return /^[0-9]+$/.test(nb) && nb > 0 && nb <= 24; } From 1553b9d9ffd3767383464084bed6acb562d2cffa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Thu, 22 Sep 2016 21:06:04 +0200 Subject: [PATCH 19/24] =?UTF-8?q?Fix=20affichage=20balance=20r=C3=A9elle?= =?UTF-8?q?=20gestion=20n=C3=A9gatifs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kfet/templates/kfet/account_negative.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kfet/templates/kfet/account_negative.html b/kfet/templates/kfet/account_negative.html index 77fdf118..5f77b8f0 100644 --- a/kfet/templates/kfet/account_negative.html +++ b/kfet/templates/kfet/account_negative.html @@ -59,7 +59,7 @@ {{ neg.account.name }} {{ neg.account.balance|floatformat:2 }}€ - {% if neg.account.balance_offset %} + {% if neg.balance_offset %} {{ neg.account.real_balance|floatformat:2 }}€ {% endif %} From 4e2ae1cb5450e5cd2e58b2c84234d9bd7bc153d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Fri, 23 Sep 2016 01:44:36 +0200 Subject: [PATCH 20/24] =?UTF-8?q?Fix=20(th=C3=A9orique)=20autocompl=C3=A9t?= =?UTF-8?q?ion=20sur=20mobile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit D'après https://groups.google.com/a/chromium.org/d/msg/chromium-bugs/08KdqaHAhsY/DD8uqKDz01AJ --- kfet/templates/kfet/kpsul.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index 2278a6f7..ca401ccb 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -120,7 +120,7 @@
    - +
    @@ -720,7 +720,6 @@ $(document).ready(function() { // Sélection des articles à la souris/tactile articles_container.on('click', '.article', function() { - console.log('1'); articleId.val(getArticleId($(this))); articleSelect.val(getArticleName($(this))); displayMatchedArticles(articlesList); From 1ce16f48f6f8a60116c21c5f5a45010898a49a94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sat, 24 Sep 2016 14:18:26 +0200 Subject: [PATCH 21/24] Annulation transferts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Possibilité d'annuler un (ou plusieurs) transferts depuis la page "Transferts" --- kfet/templates/kfet/transfers.html | 102 ++++++++++++++++++++++++++++- kfet/urls.py | 2 + kfet/views.py | 99 ++++++++++++++++++++++++++++ 3 files changed, 201 insertions(+), 2 deletions(-) diff --git a/kfet/templates/kfet/transfers.html b/kfet/templates/kfet/transfers.html index 1875a21e..cbdf0fe3 100644 --- a/kfet/templates/kfet/transfers.html +++ b/kfet/templates/kfet/transfers.html @@ -1,4 +1,13 @@ {% extends 'kfet/base.html' %} +{% load staticfiles %} + +{% block extra_head %} + + + + + +{% endblock %} {% block title %}Transferts{% endblock %} {% block content-header-title %}Transferts{% endblock %} @@ -24,13 +33,13 @@

    Liste des transferts

    {% for transfergroup in transfergroups %} -
    +
    {{ transfergroup.at }} {{ transfergroup.valid_by.trigramme }} {{ transfergroup.comment }}
    {% for transfer in transfergroup.transfers.all %} -
    +
    {{ transfer.amount }} € {{ transfer.from_acc.trigramme }} @@ -44,4 +53,93 @@
    + + {% endblock %} diff --git a/kfet/urls.py b/kfet/urls.py index e0bacf9a..9b9ebf21 100644 --- a/kfet/urls.py +++ b/kfet/urls.py @@ -170,6 +170,8 @@ urlpatterns = [ name = 'kfet.transfers.create'), url(r'^transfers/perform$', views.perform_transfers, name = 'kfet.transfers.perform'), + url(r'^transfers/cancel$', views.cancel_transfers, + name = 'kfet.transfers.cancel'), # ----- # Inventories urls diff --git a/kfet/views.py b/kfet/views.py index 98c4760a..4b115942 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -1477,6 +1477,105 @@ def perform_transfers(request): return JsonResponse(data) +@teamkfet_required +def cancel_transfers(request): + # Pour la réponse + data = { 'canceled': [], 'warnings': {}, 'errors': {}} + + # Checking if BAD REQUEST (transfers_pk not int or not existing) + try: + # Set pour virer les doublons + transfers_post = set(map(int, filter(None, request.POST.getlist('transfers[]', [])))) + except ValueError: + return JsonResponse(data, status=400) + transfers_all = ( + Transfer.objects + .select_related('group', 'from_acc', 'from_acc__negative', + 'to_acc', 'to_acc__negative') + .filter(pk__in=transfers_post)) + transfers_pk = [ transfer.pk for transfer in transfers_all ] + transfers_notexisting = [ transfer for transfer in transfers_post + if transfer not in transfers_pk ] + if transfers_notexisting: + data['errors']['transfers_notexisting'] = transfers_notexisting + return JsonResponse(data, status=400) + + transfers_already_canceled = [] # Déjà annulée + transfers = [] # Pas déjà annulée + required_perms = set() + stop_all = False + cancel_duration = Settings.CANCEL_DURATION() + to_accounts_balances = defaultdict(lambda:0) # Modifs à faire sur les balances des comptes + for transfer in transfers_all: + if transfer.canceled_at: + # Transfert déjà annulé, va pour un warning en Response + transfers_already_canceled.append(transfer.pk) + else: + transfers.append(transfer.pk) + # Si transfer il y a plus de CANCEL_DURATION, permission requise + if transfer.group.at + cancel_duration < timezone.now(): + required_perms.add('kfet.cancel_old_operations') + + # Calcul de toutes modifs à faire en cas de validation + + # Pour les balances de comptes + to_accounts_balances[transfer.from_acc] += transfer.amount + to_accounts_balances[transfer.to_acc] += -transfer.amount + + if not transfers: + data['warnings']['already_canceled'] = transfers_already_canceled + return JsonResponse(data) + + negative_accounts = [] + # Checking permissions or stop + for account in to_accounts_balances: + (perms, stop) = account.perms_to_perform_operation( + amount = to_accounts_balances[account]) + required_perms |= perms + stop_all = stop_all or stop + if stop: + negative_accounts.append(account.trigramme) + + print(required_perms) + print(request.user.get_all_permissions()) + + if stop_all or not request.user.has_perms(required_perms): + missing_perms = get_missing_perms(required_perms, request.user) + if missing_perms: + data['errors']['missing_perms'] = missing_perms + if stop_all: + data['errors']['negative'] = negative_accounts + return JsonResponse(data, status=403) + + canceled_by = required_perms and request.user.profile.account_kfet or None + canceled_at = timezone.now() + + with transaction.atomic(): + (Transfer.objects.filter(pk__in=transfers) + .update(canceled_by=canceled_by, canceled_at=canceled_at)) + + for account in to_accounts_balances: + Account.objects.filter(pk=account.pk).update( + balance = F('balance') + to_accounts_balances[account]) + account.refresh_from_db() + if account.balance < 0: + if hasattr(account, 'negative'): + if not account.negative.start: + account.negative.start = timezone.now() + account.negative.save() + else: + negative = AccountNegative( + account = account, start = timezone.now()) + negative.save() + elif (hasattr(account, 'negative') + and not account.negative.balance_offset): + account.negative.delete() + + data['canceled'] = transfers + if transfers_already_canceled: + data['warnings']['already_canceled'] = transfers_already_canceled + return JsonResponse(data) + class InventoryList(ListView): queryset = (Inventory.objects .select_related('by', 'order') From 3ead35e171a13a407e774debba6d21b4683758fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sat, 24 Sep 2016 18:27:40 +0200 Subject: [PATCH 22/24] clean --- kfet/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/kfet/views.py b/kfet/views.py index 98c4760a..f64e209c 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -220,7 +220,6 @@ def get_account_create_forms(request=None, username=None, login_clipper=None): user = None clipper = None if login_clipper and (login_clipper == username or not username): - print('trololo') # à partir d'un clipper # le user associé à ce clipper ne devrait pas encore exister clipper = get_object_or_404(Clipper, username = login_clipper) From 7f8c825c2a2fb9ee527476515b6044d1bec1deaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sat, 24 Sep 2016 18:44:01 +0200 Subject: [PATCH 23/24] Pour la prod! --- kfet/routing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kfet/routing.py b/kfet/routing.py index e7bcca55..9c816c92 100644 --- a/kfet/routing.py +++ b/kfet/routing.py @@ -8,7 +8,7 @@ from channels.routing import route, route_class from kfet import consumers channel_routing = [ - route_class(consumers.KPsul, path=r"^/ws/k-fet/k-psul/$"), + route_class(consumers.KPsul, path=r"^/gestion/ws/k-fet/k-psul/$"), #route("websocket.connect", ws_kpsul_history_connect), #route('websocket.receive', ws_message) ] From 59dcb72542f2b26ef9a20f2b0875af787521e035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sat, 24 Sep 2016 18:49:40 +0200 Subject: [PATCH 24/24] K-Psul - Fix erreur 500 caisse inexistante --- kfet/views.py | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/kfet/views.py b/kfet/views.py index f64e209c..a0719a80 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -835,28 +835,27 @@ def kpsul_checkout_data(request): pk = request.POST.get('pk', 0) if not pk: pk = 0 - try: - data = (Checkout.objects - .annotate( - last_statement_by_first_name=F('statements__by__cofprofile__user__first_name'), - last_statement_by_last_name=F('statements__by__cofprofile__user__last_name'), - last_statement_by_trigramme=F('statements__by__trigramme'), - last_statement_balance=F('statements__balance_new'), - last_statement_at=F('statements__at')) - .values( - 'id', 'name', 'balance', 'valid_from', 'valid_to', - 'last_statement_balance', 'last_statement_at', - 'last_statement_by_trigramme', 'last_statement_by_last_name', - 'last_statement_by_first_name') - .select_related( - 'statements' - 'statements__by', - 'statements__by__cofprofile__user') - .filter(pk=pk) - .order_by('statements__at') - .last()) - except Checkout.DoesNotExist: - raise http404 + data = (Checkout.objects + .annotate( + last_statement_by_first_name=F('statements__by__cofprofile__user__first_name'), + last_statement_by_last_name=F('statements__by__cofprofile__user__last_name'), + last_statement_by_trigramme=F('statements__by__trigramme'), + last_statement_balance=F('statements__balance_new'), + last_statement_at=F('statements__at')) + .values( + 'id', 'name', 'balance', 'valid_from', 'valid_to', + 'last_statement_balance', 'last_statement_at', + 'last_statement_by_trigramme', 'last_statement_by_last_name', + 'last_statement_by_first_name') + .select_related( + 'statements' + 'statements__by', + 'statements__by__cofprofile__user') + .filter(pk=pk) + .order_by('statements__at') + .last()) + if data is None: + raise Http404 return JsonResponse(data) @teamkfet_required