Skip to content

Commit

Permalink
Move more logic out of generator.py and to own management commands
Browse files Browse the repository at this point in the history
See #919
  • Loading branch information
rolandgeider committed Nov 20, 2023
1 parent 23c28b2 commit 1d11f8e
Show file tree
Hide file tree
Showing 11 changed files with 459 additions and 364 deletions.
9 changes: 0 additions & 9 deletions extras/dummy_generator/csv/measurement_categories.csv

This file was deleted.

318 changes: 0 additions & 318 deletions extras/dummy_generator/generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,28 +36,10 @@
from django.contrib.auth.models import User

# wger
from wger.core.models import (
DaysOfWeek,
)
from wger.exercises.models import Exercise
from wger.gym.models import (
Gym,
GymUserConfig,
)
from wger.manager.models import (
Day,
Schedule,
ScheduleStep,
Set,
Setting,
Workout,
WorkoutLog,
WorkoutSession,
)
from wger.measurements.models import (
Category,
Measurement,
)
from wger.weight.models import WeightEntry

parser = argparse.ArgumentParser(description='Data generator. Please consult the documentation')
Expand All @@ -81,19 +63,6 @@
choices=['germany', 'ukraine', 'spain', 'usa']
)

# Workout options
workouts_parser = subparsers.add_parser('workouts', help='Create workouts')
workouts_parser.add_argument(
'number_workouts',
action='store',
help='Number of workouts to create *per user*',
type=int,
)
workouts_parser.add_argument(
'--add-to-user',
action='store',
help='Add to the specified user-ID, not all existing users',
)

# Gym options
gym_parser = subparsers.add_parser('gyms', help='Create gyms')
Expand All @@ -103,24 +72,7 @@
help='Number of gyms to create',
type=int,
)
# Log options
logs_parser = subparsers.add_parser('logs', help='Create logs')
logs_parser.add_argument(
'number_logs',
action='store',
help='Number of logs to create per user and workout',
type=int,
)

# Session options
session_parser = subparsers.add_parser('sessions', help='Create sessions')
session_parser.add_argument(
'impression_sessions',
action='store',
help='Impression for the sessions, default: random',
default='random',
choices=['random', 'good', 'neutral', 'bad']
)

# Weight options
weight_parser = subparsers.add_parser('weight', help='Create weight entries')
Expand All @@ -143,57 +95,6 @@
default=80,
)

# Measurement options
measurement_parser = subparsers.add_parser('measurement', help='Create measurement entries')
measurement_parser.add_argument(
'number_measurement',
action='store',
help='Number of measurement entries to create per user',
type=int
)
measurement_parser.add_argument(
'--add-to-user',
action='store',
help='Add to the specified user-ID, not all existing users',
)

# Nutrition options
nutrition_parser = subparsers.add_parser(
'nutrition',
help='Creates a meal plan',
)
nutrition_parser.add_argument(
'number_nutrition_plans',
action='store',
help='Number of meal plans to create',
type=int,
)
nutrition_parser.add_argument(
'--add-to-user',
action='store',
help='Add to the specified user-ID, not all existing users',
)

# Nutrition diary options
nutrition_parser = subparsers.add_parser('nutrition-diary', help='Creates a meal plan')
nutrition_parser.add_argument(
'number_nutrition_logs',
action='store',
help='Number of nutrition diary logs to create',
type=int
)
nutrition_parser.add_argument(
'--number-diary-dates',
action='store',
help='Number of dates in which to create logs (default: 30)',
default=30,
type=int
)
nutrition_parser.add_argument(
'--add-to-user',
action='store',
help='Add to the specified user-ID, not all existing users',
)

args = parser.parse_args()
# print(args)
Expand Down Expand Up @@ -300,176 +201,6 @@
# Bulk-create all the gyms
Gym.objects.bulk_create(gym_list)

#
# Workout generator
#
if hasattr(args, 'number_workouts'):
print("** Generating {0} workouts per user".format(args.number_workouts))

if args.add_to_user:
userlist = [User.objects.get(pk=args.add_to_user)]
else:
userlist = User.objects.all()

for user in userlist:
print(' - generating for {0}'.format(user.username))

# Workouts
for i in range(1, args.number_workouts):

uid = str(uuid.uuid4()).split('-')
start_date = datetime.date.today() - datetime.timedelta(days=random.randint(0, 100))
workout = Workout(
user=user,
name='Dummy workout - {0}'.format(uid[1]),
creation_date=start_date,
)
workout.save()

# Select a random number of workout days
nr_of_days = random.randint(1, 5)
day_list = [i for i in range(1, 8)]
random.shuffle(day_list)

# Load all exercises to a list
exercise_list = [i for i in Exercise.objects.filter(language_id=2)]

for day in day_list[0:nr_of_days]:
uid = str(uuid.uuid4()).split('-')
weekday = DaysOfWeek.objects.get(pk=day)

day = Day(training=workout, description='Dummy day - {0}'.format(uid[0]))
day.save()
day.day.add(weekday)

# Select a random number of exercises
nr_of_exercises = random.randint(3, 10)
random.shuffle(exercise_list)
day_exercises = exercise_list[0:nr_of_exercises]
order = 1
for exercise in day_exercises:
reps = random.choice([1, 3, 5, 8, 10, 12, 15])
sets = random.randint(2, 4)

day_set = Set(exerciseday=day, sets=sets, order=order)
day_set.save()

setting = Setting(
set=day_set,
exercise_base=exercise.exercise_base,
reps=reps,
order=order,
)
setting.save()
order += 1

# Schedules
nr_of_schedules = random.randint(1, 5)
user_workouts = [i for i in Workout.objects.filter(user=user)]
for i in range(0, nr_of_schedules):
uid = str(uuid.uuid4()).split('-')
start_date = datetime.date.today() - datetime.timedelta(days=random.randint(0, 30))

random.shuffle(user_workouts)

schedule = Schedule()
schedule.user = user
schedule.name = 'Dummy schedule - {0}'.format(uid[1])
schedule.start_date = start_date
schedule.is_active = True
schedule.is_loop = True
schedule.save()

nr_of_steps = random.randint(1, len(user_workouts))
order = 1
for j in range(1, nr_of_steps):
step = ScheduleStep()
step.schedule = schedule
step.workout = workout
step.duration = random.randint(1, 4)
step.order = order
step.save()

order += 1

#
# Log generator
#
if hasattr(args, 'number_logs'):
print("** Generating {0} logs".format(args.number_logs))

for user in User.objects.all():
weight_log = []
print(' - generating for {0}'.format(user.username))

# Create a log for each workout day, set, setting, reps, weight, date
for workout in Workout.objects.filter(user=user):
for day in workout.day_set.all():
for set in day.set_set.all():
for setting in set.setting_set.all():
for reps in (8, 10, 12):
for i in range(1, args.number_logs):
date = datetime.date.today() - datetime.timedelta(weeks=i)
log = WorkoutLog(
user=user,
exercise_base=setting.exercise_base,
workout=workout,
reps=reps,
weight=50 - reps + random.randint(1, 10),
date=date
)
weight_log.append(log)

# Bulk-create the logs
WorkoutLog.objects.bulk_create(weight_log)

#
# Session generator
#
if hasattr(args, 'impression_sessions'):
print("** Generating workout sessions")

for user in User.objects.all():
session_list = []
print(' - generating for {0}'.format(user.username))

for date in WorkoutLog.objects.filter(user=user).dates('date', 'day'):

# Only process for dates for which there isn't already a session
if not WorkoutSession.objects.filter(user=user, date=date).exists():

workout = WorkoutLog.objects.filter(user=user, date=date).first().workout
start = datetime.time(hour=random.randint(8, 20), minute=random.randint(0, 59))
end = datetime.datetime.combine(datetime.date.today(), start) \
+ datetime.timedelta(minutes=random.randint(40, 120))
end = datetime.time(hour=end.hour, minute=end.minute)

session = WorkoutSession()
session.date = date
session.user = user
session.time_start = start
session.time_end = end
session.workout = workout

if args.impression_sessions == 'good':
session.impression = WorkoutSession.IMPRESSION_GOOD
elif args.impression_sessions == 'neutral':
session.impression = WorkoutSession.IMPRESSION_NEUTRAL
elif args.impression_sessions == 'bad':
session.impression = WorkoutSession.IMPRESSION_BAD
else:
session.impression = random.choice(
[
WorkoutSession.IMPRESSION_GOOD,
WorkoutSession.IMPRESSION_NEUTRAL,
WorkoutSession.IMPRESSION_BAD,
]
)

session_list.append(session)

# Bulk-create the sessions
WorkoutSession.objects.bulk_create(session_list)

#
# Weight entry generator
Expand Down Expand Up @@ -503,55 +234,6 @@
# Bulk-create the weight entries
WeightEntry.objects.bulk_create(new_entries)

#
# Measurement entry generator
#
if hasattr(args, 'number_measurement'):
print("** Generating {0} measurement entries per user".format(args.number_measurement))

# Load units
units = []
with open(os.path.join('csv', 'measurement_categories.csv')) as category_file:
category_reader = csv.reader(category_file)
for row in category_reader:
units.append({'name': row[0], 'unit': row[1]})

# User list
if args.add_to_user:
userlist = [User.objects.get(pk=args.add_to_user)]
else:
userlist = User.objects.all()

new_entries = []
for user in userlist:
BASE_VALUE = random.randint(80, 100)
print(' - generating measurements for {0}'.format(user.username))
existing_entries = [i.date for i in Measurement.objects.filter(category__user=user)]

for measurement_cat in random.choices(units, k=4):
print(measurement_cat)

cat = Category(
name=measurement_cat['name'],
unit=measurement_cat['unit'],
user=user,
)
cat.save()

for i in range(1, args.number_measurement):
creation_date = datetime.date.today() - datetime.timedelta(days=i)

if creation_date not in existing_entries:
measurement = Measurement(
category=cat,
value=BASE_VALUE + 0.5 * i + random.randint(-20, 10),
date=creation_date,
)
new_entries.append(measurement)

# Bulk-create the entries
Measurement.objects.bulk_create(new_entries)

#
# Nutrition Generator
#
Expand Down
Loading

0 comments on commit 1d11f8e

Please sign in to comment.