""" 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 gestioncof.management.base import MyBaseCommand from gestioncof.models import CofProfile from kfet.models import (Account, Article, OperationGroup, Operation, Checkout, CheckoutStatement) # Où sont stockés les fichiers json DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'data') class Command(MyBaseCommand): help = "Crée des utilisateurs, des articles et des opérations aléatoires" def handle(self, *args, **options): # --- # Groupes # --- Group.objects.filter(name__icontains='K-Fêt').delete() group_chef = Group(name="K-Fêt César") group_boy = Group(name="K-Fêt Légionnaire") group_chef.save() group_boy.save() permissions_chef = Permission.objects.filter( content_type__in=ContentType.objects.filter( app_label='kfet')) permissions_boy = Permission.objects.filter( codename__in=['is_team', 'perform_deposit']) group_chef.permissions.add(*permissions_chef) group_boy.permissions.add(*permissions_boy) # --- # Comptes # --- self.stdout.write("Création des comptes K-Fêt") gaulois = CofProfile.objects.filter(user__last_name='Gaulois') gaulois_trigramme = map('{:03d}'.format, range(50)) romains = CofProfile.objects.filter(user__last_name='Romain') romains_trigramme = map(lambda x: str(100+x), range(99)) created_accounts = 0 team_accounts = 0 for (profile, trigramme) in zip(gaulois, gaulois_trigramme): account, created = Account.objects.get_or_create( trigramme=trigramme, cofprofile=profile, defaults={'balance': random.randint(1, 999)/10} ) created_accounts += int(created) if profile.user.first_name == 'Abraracourcix': profile.user.groups.add(group_chef) for (profile, trigramme) in zip(romains, romains_trigramme): account, created = Account.objects.get_or_create( trigramme=trigramme, cofprofile=profile, defaults={'balance': random.randint(1, 999)/10} ) created_accounts += int(created) if random.random() > 0.75 and created: profile.user.groups.add(group_boy) team_accounts += 1 self.stdout.write("- {:d} comptes créés, {:d} dans l'équipe K-Fêt" .format(created_accounts, team_accounts)) # Compte liquide self.stdout.write("Création du compte liquide") liq_user, _ = User.objects.get_or_create(username='liquide') liq_profile, _ = CofProfile.objects.get_or_create(user=liq_user) liq_account, _ = Account.objects.get_or_create(cofprofile=liq_profile, trigramme='LIQ') # Root account if existing root_profile = CofProfile.objects.filter(user__username='root') if root_profile.exists(): self.stdout.write("Création du compte K-Fêt root") root_profile = root_profile.get() Account.objects.get_or_create(cofprofile=root_profile, trigramme='AAA') # --- # Caisse # --- checkout, created = Checkout.objects.get_or_create( created_by=Account.objects.get(trigramme='000'), name='Chaudron', defaults={ 'valid_from': timezone.now(), 'valid_to': timezone.now() + timedelta(days=730) }, ) if created: CheckoutStatement.objects.create( by=Account.objects.get(trigramme='000'), checkout=checkout, balance_old=0, balance_new=0, amount_taken=0, amount_error=0 ) # --- # 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()