From 0356ec34ae3b4f81f71185c158faa0919bd80cc8 Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Sun, 19 Mar 2017 16:03:19 -0300 Subject: [PATCH] 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))