From 0356ec34ae3b4f81f71185c158faa0919bd80cc8 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sun, 19 Mar 2017 16:03:19 -0300 Subject: [PATCH 01/15] Add createopes command --- kfet/management/commands/createopes.py | 173 +++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 kfet/management/commands/createopes.py diff --git a/kfet/management/commands/createopes.py b/kfet/management/commands/createopes.py new file mode 100644 index 00000000..aaca84c7 --- /dev/null +++ b/kfet/management/commands/createopes.py @@ -0,0 +1,173 @@ + +""" +Crée des opérations aléatoires réparties sur une période de temps spécifiée +""" + +import random +from datetime import timedelta +from decimal import Decimal +from django.utils import timezone +from django.core.management.base import BaseCommand + +from kfet.models import (Account, Article, OperationGroup, Operation, + Checkout, Transfer, TransferGroup) + + +class Command(BaseCommand): + help = "Crée des opérations réparties uniformément sur une période de temps" + + def add_arguments(self, parser): + # Nombre d'opérations à créer + parser.add_argument('opes', type=int, + help='Number of opegroups to create') + + # Période sur laquelle créer (depuis num_days avant maintenant) + parser.add_argument('days', type=int, + help='Period in which to create opegroups') + + # Optionnel : nombre de transfert à créer (défaut 0) + parser.add_argument('--transfers', type=int, default=0, + help='Number of transfers to create (default 0)') + + + def handle(self, *args, **options): + + self.stdout.write("Génération d'opérations") + + # Output log vars + opes_created = 0 + purchases = 0 + transfers = 0 + + num_ops = options['opes'] + num_transfers = options['transfers'] + # Convert to seconds + time = options['days'] * 24 * 3600 + + checkout = Checkout.objects.first() + articles = Article.objects.all() + accounts = Account.objects.exclude(trigramme='LIQ') + liq_account = Account.objects.get(trigramme='LIQ') + try: + con_account = Account.objects.get( + cofprofile__user__first_name='Assurancetourix' + ) + except Account.DoesNotExist: + con_account = random.choice(accounts) + + for i in range(num_ops): + + # Randomly pick account + if random.random() > 0.25: + account = random.choice(accounts) + else: + account = liq_account + + # Randomly pick time + at = timezone.now() - timedelta( + seconds=random.randint(0, time)) + + # Majoration sur compte 'concert' + if random.random() < 0.2: + addcost = True + addcost_for = con_account + addcost_amount = Decimal('0.5') + else: + addcost = False + + # Initialize opegroup amount + amount = Decimal('0') + + opegroup = OperationGroup( + on_acc=account, + checkout=checkout, + is_cof=account.cofprofile.is_cof + ) + opegroup.save() + + # Generating operations + for j in range(random.randint(1, 4)): + # Operation type + typevar = random.random() + + # 0.1 probability to have a charge + if typevar > 0.9 and account != liq_account: + ope = Operation( + group=opegroup, + type=Operation.DEPOSIT, + is_checkout=(random.random() > 0.2), + amount=Decimal(random.randint(1, 99)/10) + ) + # 0.1 probability to have a withdrawal + elif typevar > 0.8 and account != liq_account: + ope = Operation( + group=opegroup, + type=Operation.WITHDRAW, + is_checkout=(random.random() > 0.2), + amount=-Decimal(random.randint(1, 99)/10) + ) + else: + article = random.choice(articles) + nb = random.randint(1, 5) + + ope = Operation( + group=opegroup, + type=Operation.PURCHASE, + amount=-article.price*nb, + article=article, + article_nb=nb + ) + + purchases += 1 + + if addcost: + ope.addcost_for = addcost_for + ope.addcost_amount = addcost_amount * nb + ope.amount -= ope.addcost_amount + + opes_created += 1 + ope.save() + amount += ope.amount + + opegroup.amount = amount + opegroup.at = at + opegroup.save() + + # Transfer generation + for i in range(num_transfers): + + # Randomly pick time + at = timezone.now() - timedelta( + seconds=random.randint(0, time)) + + # Choose whether to have a comment + if random.random() > 0.5: + comment = "placeholder comment" + else: + comment = "" + + transfergroup = TransferGroup( + at=at, + comment=comment, + valid_by=random.choice(accounts) + ) + transfergroup.save() + + # Randomly generate transfer + for i in range(random.randint(1, 4)): + transfer = Transfer( + group=transfergroup, + from_acc=random.choice(accounts), + to_acc=random.choice(accounts), + amount=Decimal(random.randint(1, 99)/10) + ) + transfer.save() + transfers += 1 + + self.stdout.write( + "- {:d} opérations créées dont {:d} commandes d'articles" + .format(opes_created, purchases)) + + if transfers: + self.stdout.write("- {:d} transferts créés" + .format(transfers)) From 36dc6439a80d5673e518715ff0bbe8a4cc8d2b16 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sun, 19 Mar 2017 16:03:39 -0300 Subject: [PATCH 02/15] Plug createopes into loadkfetdevdata --- kfet/management/commands/loadkfetdevdata.py | 64 +-------------------- 1 file changed, 3 insertions(+), 61 deletions(-) diff --git a/kfet/management/commands/loadkfetdevdata.py b/kfet/management/commands/loadkfetdevdata.py index 705f6f27..8eee85a9 100644 --- a/kfet/management/commands/loadkfetdevdata.py +++ b/kfet/management/commands/loadkfetdevdata.py @@ -5,15 +5,14 @@ Crée des utilisateurs, des articles et des opérations aléatoires import os import random from datetime import timedelta -from decimal import Decimal from django.utils import timezone from django.contrib.auth.models import User, Group, Permission, ContentType +from django.core.management import call_command from gestioncof.management.base import MyBaseCommand from gestioncof.models import CofProfile -from kfet.models import (Account, Article, OperationGroup, Operation, - Checkout, CheckoutStatement) +from kfet.models import (Account, Checkout, CheckoutStatement) # Où sont stockés les fichiers json DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), @@ -130,61 +129,4 @@ class Command(MyBaseCommand): # Opérations # --- - self.stdout.write("Génération d'opérations") - - articles = Article.objects.all() - accounts = Account.objects.exclude(trigramme='LIQ') - - num_op = 100 - # Operations are put uniformly over the span of a week - past_date = 3600*24*7 - - for i in range(num_op): - if random.random() > 0.25: - account = random.choice(accounts) - else: - account = liq_account - - amount = Decimal('0') - at = timezone.now() - timedelta( - seconds=random.randint(0, past_date)) - - opegroup = OperationGroup( - on_acc=account, - checkout=checkout, - at=at, - is_cof=account.cofprofile.is_cof) - - opegroup.save() - - for j in range(random.randint(1, 4)): - typevar = random.random() - if typevar > 0.9 and account != liq_account: - ope = Operation( - group=opegroup, - type=Operation.DEPOSIT, - amount=Decimal(random.randint(1, 99)/10,) - ) - elif typevar > 0.8 and account != liq_account: - ope = Operation( - group=opegroup, - type=Operation.WITHDRAW, - amount=-Decimal(random.randint(1, 99)/10,) - ) - else: - article = random.choice(articles) - nb = random.randint(1, 5) - - ope = Operation( - group=opegroup, - type=Operation.PURCHASE, - amount=-article.price*nb, - article=article, - article_nb=nb - ) - - ope.save() - amount += ope.amount - - opegroup.amount = amount - opegroup.save() + call_command('createopes','100', '7') From 6d36d50e9ab5146bfeb3451aa9625156d8273744 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Mon, 20 Mar 2017 01:56:59 -0300 Subject: [PATCH 03/15] Fix 'at' property for transfergroups --- kfet/management/commands/createopes.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/kfet/management/commands/createopes.py b/kfet/management/commands/createopes.py index aaca84c7..75bb23ae 100644 --- a/kfet/management/commands/createopes.py +++ b/kfet/management/commands/createopes.py @@ -147,7 +147,6 @@ class Command(BaseCommand): comment = "" transfergroup = TransferGroup( - at=at, comment=comment, valid_by=random.choice(accounts) ) @@ -164,6 +163,9 @@ class Command(BaseCommand): transfer.save() transfers += 1 + transfergroup.at = at + transfergroup.save() + self.stdout.write( "- {:d} opérations créées dont {:d} commandes d'articles" .format(opes_created, purchases)) From dd4d1f3061f08680a120ab7a00775e0804e4238c Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Mon, 20 Mar 2017 20:19:04 -0300 Subject: [PATCH 04/15] Improves creation efficiency --- kfet/management/commands/createopes.py | 26 +++++++++++++------------- kfet/models.py | 4 ++-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/kfet/management/commands/createopes.py b/kfet/management/commands/createopes.py index 75bb23ae..77663b2b 100644 --- a/kfet/management/commands/createopes.py +++ b/kfet/management/commands/createopes.py @@ -78,14 +78,15 @@ class Command(BaseCommand): # Initialize opegroup amount amount = Decimal('0') - opegroup = OperationGroup( + opegroup = OperationGroup.objects.create( on_acc=account, checkout=checkout, + at=at, is_cof=account.cofprofile.is_cof ) - opegroup.save() # Generating operations + ope_list = [] for j in range(random.randint(1, 4)): # Operation type typevar = random.random() @@ -125,12 +126,12 @@ class Command(BaseCommand): ope.addcost_amount = addcost_amount * nb ope.amount -= ope.addcost_amount - opes_created += 1 - ope.save() + ope_list.append(ope) amount += ope.amount + Operation.objects.bulk_create(ope_list) + opes_created += len(ope_list) opegroup.amount = amount - opegroup.at = at opegroup.save() # Transfer generation @@ -146,25 +147,24 @@ class Command(BaseCommand): else: comment = "" - transfergroup = TransferGroup( + transfergroup = TransferGroup.objects.create( + at=at, comment=comment, valid_by=random.choice(accounts) ) - transfergroup.save() # Randomly generate transfer + transfer_list = [] for i in range(random.randint(1, 4)): - transfer = Transfer( + transfer_list.append(Transfer( group=transfergroup, from_acc=random.choice(accounts), to_acc=random.choice(accounts), amount=Decimal(random.randint(1, 99)/10) - ) - transfer.save() - transfers += 1 + )) - transfergroup.at = at - transfergroup.save() + Transfer.objects.bulk_create(transfer_list) + transfers += len(transfer_list) self.stdout.write( "- {:d} opérations créées dont {:d} commandes d'articles" diff --git a/kfet/models.py b/kfet/models.py index 419cd0a0..4e98c3c8 100644 --- a/kfet/models.py +++ b/kfet/models.py @@ -455,7 +455,7 @@ class OrderArticle(models.Model): quantity_received = models.IntegerField(default = 0) class TransferGroup(models.Model): - at = models.DateTimeField(auto_now_add = True) + at = models.DateTimeField(default=timezone.now) # Optional comment = models.CharField( max_length = 255, @@ -491,7 +491,7 @@ class OperationGroup(models.Model): checkout = models.ForeignKey( Checkout, on_delete = models.PROTECT, related_name = "opesgroup") - at = models.DateTimeField(auto_now_add = True) + at = models.DateTimeField(default=timezone.now) amount = models.DecimalField( max_digits = 6, decimal_places = 2, default = 0) From ae82c340230a8204e24580dc9d5bcb1d23fc3e85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Delobelle?= Date: Sat, 25 Mar 2017 11:21:21 +0100 Subject: [PATCH 05/15] add missing migration --- kfet/migrations/0048_default_datetime.py | 25 ++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 kfet/migrations/0048_default_datetime.py diff --git a/kfet/migrations/0048_default_datetime.py b/kfet/migrations/0048_default_datetime.py new file mode 100644 index 00000000..c9bacf1e --- /dev/null +++ b/kfet/migrations/0048_default_datetime.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('kfet', '0047_auto_20170104_1528'), + ] + + operations = [ + migrations.AlterField( + model_name='operationgroup', + name='at', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + migrations.AlterField( + model_name='transfergroup', + name='at', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + ] From 579711ed2dbf7c4902437d4ba1105b99bf2d38ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Wed, 29 Mar 2017 11:17:34 +0100 Subject: [PATCH 06/15] Hotfix: typo in template name --- gestioncof/petits_cours_views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index 95fdf3b7..332e156c 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -215,7 +215,7 @@ def _traitement_other(request, demande, redo): proposals = proposals.items() proposed_for = proposed_for.items() return render(request, - "gestiocof/traitement_demande_petit_cours_autre_niveau.html", + "gestioncof/traitement_demande_petit_cours_autre_niveau.html", {"demande": demande, "unsatisfied": unsatisfied, "proposals": proposals, From 2d22c202e9af4c53b2d2de18ae6736621c2bde64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Wed, 29 Mar 2017 18:17:20 +0100 Subject: [PATCH 07/15] Prevent side effects while sending emails --- bda/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bda/models.py b/bda/models.py index a405a665..df73a209 100644 --- a/bda/models.py +++ b/bda/models.py @@ -315,10 +315,11 @@ class SpectacleRevente(models.Model): # Envoie un mail aux perdants for inscrit in inscrits: if inscrit != winner: - context['acheteur'] = inscrit.user + new_context = dict(context) + new_context['acheteur'] = inscrit.user datatuple.append(( 'bda-revente-loser', - context, + new_context, settings.MAIL_DATA['revente']['FROM'], [inscrit.user.email] )) From 95c59de4fcf1f5793c4e0c21ea1565e81db4d58e Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 29 Mar 2017 23:16:40 -0300 Subject: [PATCH 08/15] Add supplier to dev data --- kfet/management/commands/loadkfetdevdata.py | 23 +++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/kfet/management/commands/loadkfetdevdata.py b/kfet/management/commands/loadkfetdevdata.py index 8eee85a9..5c2533b8 100644 --- a/kfet/management/commands/loadkfetdevdata.py +++ b/kfet/management/commands/loadkfetdevdata.py @@ -12,7 +12,8 @@ from django.core.management import call_command from gestioncof.management.base import MyBaseCommand from gestioncof.models import CofProfile -from kfet.models import (Account, Checkout, CheckoutStatement) +from kfet.models import (Account, Checkout, CheckoutStatement, Supplier, + SupplierArticle, Article) # Où sont stockés les fichiers json DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), @@ -125,8 +126,26 @@ class Command(MyBaseCommand): amount_error=0 ) + # --- + # Fournisseur + # --- + + supplier, created = Supplier.objects.get_or_create(name="Panoramix") + if created: + articles = Article.objects.filter(category__name="Autres Bieres") + if not articles.exists(): + articles = random.sample(Article.objects.all(), 30) + to_create = [] + for article in articles: + to_create.append(SupplierArticle( + supplier=supplier, + article=article + )) + + SupplierArticle.objects.bulk_create(to_create) + # --- # Opérations # --- - call_command('createopes','100', '7') + call_command('createopes', '100', '7', '--transfers=20') From 56b5fd627971deaff5698f8334bb119d3dfce472 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Wed, 29 Mar 2017 23:22:18 -0300 Subject: [PATCH 09/15] Always randomize supplier articles --- kfet/management/commands/loadkfetdevdata.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/kfet/management/commands/loadkfetdevdata.py b/kfet/management/commands/loadkfetdevdata.py index 5c2533b8..7f2ec9a3 100644 --- a/kfet/management/commands/loadkfetdevdata.py +++ b/kfet/management/commands/loadkfetdevdata.py @@ -132,9 +132,7 @@ class Command(MyBaseCommand): supplier, created = Supplier.objects.get_or_create(name="Panoramix") if created: - articles = Article.objects.filter(category__name="Autres Bieres") - if not articles.exists(): - articles = random.sample(Article.objects.all(), 30) + articles = random.sample(list(Article.objects.all()), 40) to_create = [] for article in articles: to_create.append(SupplierArticle( From 499c08156577f2e94894d8e9dbfab242d42062c1 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Fri, 31 Mar 2017 12:23:27 -0300 Subject: [PATCH 10/15] Websocket class and instance --- kfet/static/kfet/js/kfet.js | 33 +++++++++++++++++++++++++++++++++ kfet/templates/kfet/kpsul.html | 13 ++----------- 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/kfet/static/kfet/js/kfet.js b/kfet/static/kfet/js/kfet.js index f0e7a316..aa4b7739 100644 --- a/kfet/static/kfet/js/kfet.js +++ b/kfet/static/kfet/js/kfet.js @@ -27,6 +27,39 @@ $(document).ready(function() { } }); +/* + * Generic Websocket class and k-psul ws instanciation + */ + +class Websocket { + + static get default_data() { + return {"relative_url": "", "default_msg": {}}; + } + + constructor(data) { + $.extend(this, this.constructor.default_data, data); + } + + listen(handle_func) { + var that = this; + var websocket_protocol = window.location.protocol == 'https:' ? 'wss' : 'ws'; + var location_host = window.location.host; + var location_url = window.location.pathname.startsWith('/gestion/') ? location_host + '/gestion' : location_host; + var socket = new ReconnectingWebSocket(websocket_protocol+"://" + location_url + this.relative_url); + + socket.onmessage = function(e) { + var data = $.extend({}, that.default_msg, JSON.parse(e.data)); + handle_func(data); + } + } +} + +var OperationWebSocket = new Websocket({ + 'relative_url': '/ws/k-fet/k-psul/', + 'default_msg': {'opegroups':[],'opes':[],'checkouts':[],'articles':[]}, +}); + function dateUTCToParis(date) { return moment.tz(date, 'UTC').tz('Europe/Paris'); } diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index d3b148c9..cf558647 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -12,7 +12,6 @@ - {% endblock %} @@ -1321,15 +1320,7 @@ $(document).ready(function() { // Synchronization // ----- - websocket_msg_default = {'opegroups':[],'opes':[],'checkouts':[],'articles':[]} - - var websocket_protocol = window.location.protocol == 'https:' ? 'wss' : 'ws'; - 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)); - + OperationWebSocket.listen(function(data) { for (var i=0; i Date: Fri, 31 Mar 2017 15:10:41 -0300 Subject: [PATCH 11/15] Add url get method --- kfet/static/kfet/js/kfet.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/kfet/static/kfet/js/kfet.js b/kfet/static/kfet/js/kfet.js index aa4b7739..1398fedb 100644 --- a/kfet/static/kfet/js/kfet.js +++ b/kfet/static/kfet/js/kfet.js @@ -40,13 +40,18 @@ class Websocket { constructor(data) { $.extend(this, this.constructor.default_data, data); } - - listen(handle_func) { - var that = this; + + get url() { var websocket_protocol = window.location.protocol == 'https:' ? 'wss' : 'ws'; var location_host = window.location.host; var location_url = window.location.pathname.startsWith('/gestion/') ? location_host + '/gestion' : location_host; - var socket = new ReconnectingWebSocket(websocket_protocol+"://" + location_url + this.relative_url); + + return websocket_protocol+"://" + location_url + this.relative_url ; + } + + listen(handle_func) { + var that = this; + var socket = new ReconnectingWebSocket(this.url); socket.onmessage = function(e) { var data = $.extend({}, that.default_msg, JSON.parse(e.data)); From 8bf1bd53439919d2792bd82eabc7aef7a9d33e71 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Fri, 31 Mar 2017 15:45:15 -0300 Subject: [PATCH 12/15] Websocket as member --- kfet/static/kfet/js/kfet.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kfet/static/kfet/js/kfet.js b/kfet/static/kfet/js/kfet.js index 1398fedb..aa6cfa90 100644 --- a/kfet/static/kfet/js/kfet.js +++ b/kfet/static/kfet/js/kfet.js @@ -51,9 +51,9 @@ class Websocket { listen(handle_func) { var that = this; - var socket = new ReconnectingWebSocket(this.url); + this.socket = new ReconnectingWebSocket(this.url); - socket.onmessage = function(e) { + this.socket.onmessage = function(e) { var data = $.extend({}, that.default_msg, JSON.parse(e.data)); handle_func(data); } From 38bfccf3313abb84447c91a17180c7f7abd6779c Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Fri, 31 Mar 2017 15:57:15 -0300 Subject: [PATCH 13/15] Change class name --- kfet/static/kfet/js/kfet.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kfet/static/kfet/js/kfet.js b/kfet/static/kfet/js/kfet.js index aa6cfa90..b8a44244 100644 --- a/kfet/static/kfet/js/kfet.js +++ b/kfet/static/kfet/js/kfet.js @@ -31,7 +31,7 @@ $(document).ready(function() { * Generic Websocket class and k-psul ws instanciation */ -class Websocket { +class KfetWebsocket { static get default_data() { return {"relative_url": "", "default_msg": {}}; @@ -60,7 +60,7 @@ class Websocket { } } -var OperationWebSocket = new Websocket({ +var OperationWebSocket = new KfetWebsocket({ 'relative_url': '/ws/k-fet/k-psul/', 'default_msg': {'opegroups':[],'opes':[],'checkouts':[],'articles':[]}, }); From ab15dbae76abb6fb9bfb596efdfb5588abcb2586 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Fri, 31 Mar 2017 17:37:39 -0300 Subject: [PATCH 14/15] Add handler management --- kfet/static/kfet/js/kfet.js | 19 ++++++++++++++----- kfet/templates/kfet/kpsul.html | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/kfet/static/kfet/js/kfet.js b/kfet/static/kfet/js/kfet.js index b8a44244..bdf5b69b 100644 --- a/kfet/static/kfet/js/kfet.js +++ b/kfet/static/kfet/js/kfet.js @@ -33,12 +33,12 @@ $(document).ready(function() { class KfetWebsocket { - static get default_data() { - return {"relative_url": "", "default_msg": {}}; + static get defaults() { + return {"relative_url": "", "default_msg": {}, "handlers": []}; } constructor(data) { - $.extend(this, this.constructor.default_data, data); + $.extend(this, this.constructor.defaults, data); } get url() { @@ -49,13 +49,22 @@ class KfetWebsocket { return websocket_protocol+"://" + location_url + this.relative_url ; } - listen(handle_func) { + add_handler(handler) { + if (!this.socket) + this.listen(); + + this.handlers.push(handler); + } + + listen() { var that = this; this.socket = new ReconnectingWebSocket(this.url); this.socket.onmessage = function(e) { var data = $.extend({}, that.default_msg, JSON.parse(e.data)); - handle_func(data); + for (let handler of that.handlers) { + handler(data); + } } } } diff --git a/kfet/templates/kfet/kpsul.html b/kfet/templates/kfet/kpsul.html index cf558647..4ac1354c 100644 --- a/kfet/templates/kfet/kpsul.html +++ b/kfet/templates/kfet/kpsul.html @@ -1320,7 +1320,7 @@ $(document).ready(function() { // Synchronization // ----- - OperationWebSocket.listen(function(data) { + OperationWebSocket.add_handler(function(data) { for (var i=0; i Date: Fri, 31 Mar 2017 18:28:03 -0300 Subject: [PATCH 15/15] Prevents special opes on LIQ --- kfet/static/kfet/js/kfet.js | 3 +++ kfet/views.py | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/kfet/static/kfet/js/kfet.js b/kfet/static/kfet/js/kfet.js index f0e7a316..6691fef7 100644 --- a/kfet/static/kfet/js/kfet.js +++ b/kfet/static/kfet/js/kfet.js @@ -86,6 +86,9 @@ function getErrorsHtml(data) { content += '
  • Montant invalide
  • '; content += ''; } + if ('account' in data['errors']) { + content += data['errors']['account']; + } return content; } diff --git a/kfet/views.py b/kfet/views.py index b6a3338a..823a205d 100644 --- a/kfet/views.py +++ b/kfet/views.py @@ -1041,7 +1041,9 @@ def kpsul_perform_operations(request): operationgroup.comment = operationgroup.comment.strip() if not operationgroup.comment: data['errors']['need_comment'] = True - return JsonResponse(data, status=400) + + if data['errors']: + return JsonResponse(data, status=400) if stop or not request.user.has_perms(required_perms): missing_perms = get_missing_perms(required_perms, request.user)