Remove "next_day" foreign key

Days now just have an order field, which is much easier to work with, specially
over the API
This commit is contained in:
Roland Geider
2024-10-22 18:52:04 +02:00
parent 88589f6a2a
commit 49bbd18997
11 changed files with 33 additions and 88 deletions

View File

@@ -52,7 +52,6 @@ class RoutineSerializer(serializers.ModelSerializer):
'id',
'name',
'description',
'first_day',
'created',
'start',
'end',
@@ -69,7 +68,7 @@ class DaySerializer(serializers.ModelSerializer):
fields = (
'id',
'routine',
'next_day',
'order',
'name',
'description',
'is_rest',
@@ -243,7 +242,7 @@ class DayStructureSerializer(serializers.ModelSerializer):
fields = (
'id',
'routine',
'next_day',
'order',
'name',
'description',
'is_rest',
@@ -266,7 +265,6 @@ class RoutineStructureSerializer(serializers.ModelSerializer):
'id',
'name',
'description',
'first_day',
'created',
'start',
'end',

View File

@@ -452,7 +452,7 @@ class RoutineDayViewSet(WgerOwnerObjectModelViewSet):
ordering_fields = '__all__'
filterset_fields = (
'id',
'next_day',
'order',
'name',
'description',
'is_rest',

View File

@@ -40,7 +40,7 @@
"model": "manager.day",
"fields": {
"routine": 1,
"next_day": 2,
"order": 2,
"is_rest": false
}
},
@@ -49,7 +49,7 @@
"model": "manager.day",
"fields": {
"routine": 1,
"next_day": 3,
"order": 3,
"is_rest": false
}
},
@@ -58,7 +58,7 @@
"model": "manager.day",
"fields": {
"routine": 1,
"next_day": 1,
"order": 1,
"is_rest": false
}
},

View File

@@ -35,6 +35,7 @@ from wger.manager.models import (
)
from wger.manager.models.abstract_config import OperationChoices
logger = logging.getLogger(__name__)
@@ -89,27 +90,12 @@ class Command(BaseCommand):
nr_of_days = random.randint(2, 5)
day_list = []
is_first_day = False
for _ in range(nr_of_days):
for i in range(nr_of_days):
uid = str(uuid.uuid4()).split('-')
day = Day(routine=routine, name=f'Dummy day - {uid[0]}')
day = Day(routine=routine, name=f'Dummy day - {uid[0]}', order=i)
day.save()
if is_first_day:
routine.first_day = day
routine.save()
is_first_day = False
day_list.append(day)
next_day = None
for day in reversed(day_list):
if next_day:
day.next_day = next_day
day.save()
next_day = day
day_list[-1].next_day = day_list[0]
day_list[-1].save()
# Add exercises (no supersets, all very simple)
exercise_list = [i for i in Exercise.objects.all()]
for day in day_list:

View File

@@ -50,15 +50,7 @@ class Migration(migrations.Migration):
('is_rest', models.BooleanField(default=False)),
('last_day_in_week', models.BooleanField(default=False)),
('need_logs_to_advance', models.BooleanField(default=False)),
(
'next_day',
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
to='manager.dayng',
),
),
('order', models.PositiveIntegerField(default=1, verbose_name='Order')),
],
),
migrations.AddField(
@@ -98,7 +90,7 @@ class Migration(migrations.Migration):
verbose_name='ID',
),
),
('order', models.IntegerField(default=1, verbose_name='Order')),
('order', models.PositiveIntegerField(default=1, verbose_name='Order')),
('comment', models.CharField(blank=True, max_length=200, verbose_name='Comment')),
(
'day',
@@ -231,15 +223,6 @@ class Migration(migrations.Migration):
),
('start', models.DateField(verbose_name='Start date')),
('end', models.DateField(verbose_name='End date')),
(
'first_day',
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name='first_days',
to='manager.dayng',
),
),
(
'user',
models.ForeignKey(

View File

@@ -53,19 +53,13 @@ def migrate_routines(apps) -> dict[int, Any]:
# To simulate a hard coded week, we will create exactly seven day entries (since
# we know the routine starts on a monday).
for i in range(1, 8):
current_day = DayNg(routine=routine, next_day=None, is_rest=True)
current_day = DayNg(routine=routine, order=i, is_rest=True)
current_day.save()
day_dict[i] = current_day
for i in range(1, 8):
current_day = day_dict[i]
if i == 7:
current_day.next_day = day_dict[1]
else:
current_day.next_day = day_dict[i + 1]
current_day.save()
day = workout.day_set.filter(day__id=i).first()
if day:
current_day.name = day.description if len(day.description) <= 50 else f'Day {i}'

View File

@@ -17,6 +17,7 @@
# Django
from django.db import models
# wger
from wger.utils.context_processor import processor

View File

@@ -43,6 +43,11 @@ class Day(models.Model):
Model for a training day
"""
class Meta:
ordering = [
'order',
]
routine = models.ForeignKey(
'Routine',
verbose_name=_('Routine'),
@@ -50,11 +55,10 @@ class Day(models.Model):
related_name='days',
)
next_day = models.ForeignKey(
'self',
blank=True,
null=True,
on_delete=models.CASCADE,
order = models.PositiveIntegerField(
default=1,
null=False,
verbose_name=_('Order'),
)
type = models.CharField(

View File

@@ -50,13 +50,6 @@ class Routine(models.Model):
on_delete=models.CASCADE,
)
first_day = models.ForeignKey(
'Day',
on_delete=models.CASCADE,
null=True,
related_name='first_days',
)
name = models.CharField(
verbose_name=_('Name'),
max_length=50,
@@ -137,15 +130,7 @@ class Routine(models.Model):
Each day object points to the next one in the sequence till it loops back
"""
out = []
day = self.first_day
while day:
if day in out:
break
out.append(day)
day = day.next_day
return out
return list(self.days.all())
@property
def label_dict(self) -> dict[datetime.date, str]:
@@ -169,7 +154,9 @@ class Routine(models.Model):
labels = self.label_dict
delta = datetime.timedelta(days=1)
current_date = self.start
current_day = self.first_day
days = list(self.days.all())
current_day = self.days.first()
nr_days = self.days.count()
counter = Counter()
skip_til_date = None
@@ -178,6 +165,7 @@ class Routine(models.Model):
if current_day is None:
return out
index = 0
while current_date <= self.end:
# Fill all days till the end of the week with empty workout days
if skip_til_date:
@@ -195,6 +183,7 @@ class Routine(models.Model):
continue
counter[current_day] += 1
index = (index + 1) % nr_days
if current_day.last_day_in_week:
days_til_monday = 7 - current_date.weekday()
@@ -210,7 +199,7 @@ class Routine(models.Model):
)
if current_day.can_proceed(current_date):
current_day = current_day.next_day
current_day = days[index]
current_date += delta

View File

@@ -28,7 +28,7 @@ class Slot(models.Model):
related_name='slots',
)
order = models.IntegerField(
order = models.PositiveIntegerField(
default=1,
null=False,
verbose_name=_('Order'),

View File

@@ -49,30 +49,20 @@ class RoutineTestCase(WgerTestCase):
)
self.routine.save()
self.day1 = Day(routine=self.routine, description='day 1')
self.day1 = Day(routine=self.routine, description='day 1', order=1)
self.day1.save()
self.day2 = Day(
routine=self.routine,
description='day 2',
order=2,
is_rest=True,
)
self.day2.save()
self.day3 = Day(routine=self.routine, description='day 3')
self.day3 = Day(routine=self.routine, description='day 3', order=3)
self.day3.save()
self.day1.next_day = self.day2
self.day1.save()
self.day2.next_day = self.day3
self.day2.save()
self.day3.next_day = self.day1
self.day3.save()
self.routine.first_day = self.day1
Label(routine=self.routine, start_offset=0, end_offset=3, label='First label').save()
Label(routine=self.routine, start_offset=4, end_offset=5, label='Second label').save()