""" 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 cof.management.base import MyBaseCommand from gestion.models import Profile from kfet.models import Account, Article, OperationGroup, Operation, Checkout # 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 = Profile.objects.filter(user__last_name='Gaulois') gaulois_trigramme = map('{:03d}'.format, range(50)) romains = Profile.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, profile=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, profile=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 liq_user, _ = User.objects.get_or_create(username='liquide') liq_profile, _ = Profile.objects.get_or_create(user=liq_user) liq_account, _ = Account.objects.get_or_create(profile=liq_profile, trigramme='LIQ') # --- # Caisse # --- checkout, _ = Checkout.objects.get_or_create( created_by=Account.objects.get(trigramme='000'), name='Chaudron', valid_from=timezone.now(), valid_to=timezone.now() + timedelta(days=365) ) # --- # 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=False ) if hasattr(account.profile, "cof"): opegroup.is_cof = account.profile.cof.is_cof opegroup.save() 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()