import random from datetime import date, timedelta from django.core.management.base import BaseCommand from clubs.models import Club from wrestlers.models import Wrestler from trainers.models import Trainer from locations.models import Location from exercises.models import Exercise from templates.models import TrainingTemplate, TemplateExercise from trainings.models import Training, Attendance class Command(BaseCommand): help = 'Populates database with comprehensive sample data for testing' def handle(self, *args, **options): self.stdout.write('Creating comprehensive sample data...') # Create 3 clubs clubs = [ Club.objects.create(name='KSV Wiesental', short_name='KSV', is_active=True), Club.objects.create(name='RSV Mannheim', short_name='RSV', is_active=True), Club.objects.create(name='AV Germering', short_name='AVG', is_active=True), ] # 3 Trainers (one per club) trainers = [ Trainer.objects.create(first_name='Max', last_name='Mueller', club=clubs[0], email='max.mueller@ksv.de', is_active=True), Trainer.objects.create(first_name='Anna', last_name='Schmidt', club=clubs[1], email='anna.schmidt@rsv.de', is_active=True), Trainer.objects.create(first_name='Tom', last_name='Bauer', club=clubs[2], email='tom.bauer@avg.de', is_active=True), ] # 30 Wrestlers (10 per club, distributed across groups) first_names_m = ['Felix', 'Leon', 'Paul', 'Lukas', 'Jonas', 'Max', 'Tim', 'David', 'Kevin', 'Marco', 'Stefan', 'Daniel', 'Florian', 'Tobias', 'Christian'] first_names_f = ['Emma', 'Sophie', 'Marie', 'Laura', 'Lena', 'Anna', 'Lisa', 'Sarah', 'Julia', 'Laura', 'Nina', 'Lea', 'Laura', 'Lena', 'Laura'] last_names = ['Mueller', 'Schmidt', 'Weber', 'Fischer', 'Klein', 'Bauer', 'Wolf', 'Schulz', 'Neumann', 'Hoffmann', 'Koch', 'Becker', 'Richter', 'Wagner', 'Weiss'] wrestlers = [] for i in range(30): club_idx = i % 3 group = random.choice(['kids', 'kids', 'youth', 'youth', 'youth', 'adults', 'adults']) gender = random.choice(['m', 'f']) first_name = random.choice(first_names_m if gender == 'm' else first_names_f) last_name = random.choice(last_names) year_offset = {'kids': 8, 'youth': 4, 'adults': 0}[group] dob = date(2010 + year_offset + random.randint(-2, 2), random.randint(1, 12), random.randint(1, 28)) weight = random.uniform(25, 90) w = Wrestler.objects.create( first_name=first_name, last_name=last_name, club=clubs[club_idx], group=group, date_of_birth=dob, gender=gender, weight_kg=round(weight, 1), is_active=True ) wrestlers.append(w) # 3 Locations (one per club) locations = [ Location.objects.create(name='Sporthalle Wiesental', address='Ringstrasse 15, 79541 Wiesental', is_active=True), Location.objects.create(name='Sportzentrum Mannheim', address='Friedrich-Ebert-Strasse 88, 68159 Mannheim', is_active=True), Location.objects.create(name='Turnhalle Germering', address='Augsburger Strasse 45, 82110 Germering', is_active=True), ] # 15 Exercises exercises_data = [ {'name': 'Springseil', 'category': 'warmup', 'exercise_type': 'time', 'default_value': '60'}, {'name': 'Armkreisen', 'category': 'warmup', 'exercise_type': 'time', 'default_value': '60'}, {'name': 'Beinspätze', 'category': 'warmup', 'exercise_type': 'time', 'default_value': '60'}, {'name': 'Liegestuetze', 'category': 'kraft', 'exercise_type': 'reps', 'default_value': '15'}, {'name': 'Kniebeugen', 'category': 'kraft', 'exercise_type': 'reps', 'default_value': '20'}, {'name': 'Sit-ups', 'category': 'kraft', 'exercise_type': 'reps', 'default_value': '25'}, {'name': 'Plank', 'category': 'kraft', 'exercise_type': 'time', 'default_value': '60'}, {'name': 'Doppelbeintechnik', 'category': 'technik', 'exercise_type': 'reps', 'default_value': '10'}, {'name': 'Ausputzer', 'category': 'technik', 'exercise_type': 'reps', 'default_value': '8'}, {'name': 'Beinsäge', 'category': 'technik', 'exercise_type': 'reps', 'default_value': '12'}, {'name': 'Armheber', 'category': 'technik', 'exercise_type': 'reps', 'default_value': '10'}, {'name': 'Tempolauf', 'category': 'ausdauer', 'exercise_type': 'time', 'default_value': '180'}, {'name': 'Seilspringen Station', 'category': 'ausdauer', 'exercise_type': 'time', 'default_value': '120'}, {'name': 'Fangspiel', 'category': 'spiele', 'exercise_type': 'time', 'default_value': '300'}, {'name': 'Dehnung', 'category': 'cool_down', 'exercise_type': 'time', 'default_value': '180'}, ] exercises = [Exercise.objects.create(**data) for data in exercises_data] # 6 Templates (2 per group) templates = [] for idx, (group, group_name) in enumerate([('kids', 'Kids'), ('youth', 'Youth'), ('adults', 'Adults')]): for t_idx in range(2): t = TrainingTemplate.objects.create( name=f'{group_name} Training {"A" if t_idx == 0 else "B"}', description=f'Standard training for {group_name.lower()} group - Part {"A" if t_idx == 0 else "B"}', category='main', is_active=True ) templates.append(t) # Kids Training A: warmup + kraft + spiele for i, ex in enumerate([exercises[0], exercises[3], exercises[5], exercises[13]]): TemplateExercise.objects.create(template=templates[0], exercise=ex, order=i, default_value=ex.default_value) # Kids Training B: warmup + technik + spiele for i, ex in enumerate([exercises[1], exercises[7], exercises[9], exercises[13]]): TemplateExercise.objects.create(template=templates[1], exercise=ex, order=i, default_value=ex.default_value) # Youth Training A: warmup + technik + kraft for i, ex in enumerate([exercises[0], exercises[3], exercises[4], exercises[7], exercises[8]]): TemplateExercise.objects.create(template=templates[2], exercise=ex, order=i, default_value=ex.default_value) # Youth Training B: technik + ausdauer for i, ex in enumerate([exercises[7], exercises[8], exercises[9], exercises[11], exercises[14]]): TemplateExercise.objects.create(template=templates[3], exercise=ex, order=i, default_value=ex.default_value) # Adults Training A: warmup + kraft + technik for i, ex in enumerate([exercises[0], exercises[3], exercises[4], exercises[6], exercises[7], exercises[14]]): TemplateExercise.objects.create(template=templates[4], exercise=ex, order=i, default_value=ex.default_value) # Adults Training B: kraft + ausdauer + technik for i, ex in enumerate([exercises[3], exercises[5], exercises[7], exercises[11], exercises[12], exercises[14]]): TemplateExercise.objects.create(template=templates[5], exercise=ex, order=i, default_value=ex.default_value) # 30 Trainings spread over 3 months (past, present, future) today = date.today() start_date = today - timedelta(days=90) # 3 months ago trainings = [] group_map = {'kids': [0, 1], 'youth': [2, 3], 'adults': [4, 5]} for week_offset in range(15): # ~2 trainings per week over 3 months for day_offset in [0, 3]: # Monday and Thursday training_date = start_date + timedelta(days=week_offset * 7 + day_offset) if training_date > today + timedelta(days=14): continue # Don't create trainings too far in future group = random.choice(['kids', 'youth', 'adults']) template = random.choice(group_map[group]) location = random.choice(locations) is_completed = training_date < today t = Training.objects.create( date=training_date, start_time='17:00' if group == 'kids' else '18:30' if group == 'youth' else '19:30', end_time='18:30' if group == 'kids' else '20:00' if group == 'youth' else '21:00', location=location, group=group, is_completed=is_completed, notes=f'Training für {group}' ) t.trainers.set([random.choice(trainers)]) trainings.append(t) # Create attendances for completed trainings for training in trainings: if training.is_completed: group_wrestlers = [w for w in wrestlers if w.group == training.group] num_attendees = min(len(group_wrestlers), random.randint(3, 8)) for w in random.sample(group_wrestlers, num_attendees): Attendance.objects.create(training=training, wrestler=w) self.stdout.write(self.style.SUCCESS( f'Created: {Club.objects.count()} clubs, ' f'{Trainer.objects.count()} trainers, ' f'{Wrestler.objects.count()} wrestlers, ' f'{Location.objects.count()} locations, ' f'{Exercise.objects.count()} exercises, ' f'{TrainingTemplate.objects.count()} templates, ' f'{Training.objects.count()} trainings, ' f'{Attendance.objects.count()} attendances' ))