mirror of
https://github.com/wger-project/wger.git
synced 2026-02-18 00:17:51 +01:00
Add powersync logic to handle workout sessions
This commit is contained in:
@@ -516,6 +516,15 @@ def upload_powersync_data(request):
|
||||
ps_manager.handle_update_log(payload=data['data'], user_id=user_id)
|
||||
elif http_verb == 'DELETE':
|
||||
ps_manager.handle_delete_log(payload=data['data'], user_id=user_id)
|
||||
|
||||
case 'manager_workoutsession':
|
||||
if http_verb == 'PUT':
|
||||
ps_manager.handle_create_session(payload=data['data'], user_id=user_id)
|
||||
elif http_verb == 'PATCH':
|
||||
ps_manager.handle_update_session(payload=data['data'], user_id=user_id)
|
||||
elif http_verb == 'DELETE':
|
||||
ps_manager.handle_delete_session(payload=data['data'], user_id=user_id)
|
||||
|
||||
case _:
|
||||
logger.warning('Received unknown PowerSync table')
|
||||
raise ValueError('Unknown PowerSync table')
|
||||
|
||||
@@ -6,18 +6,28 @@ from django.db import migrations, models
|
||||
|
||||
def gen_uuids(apps, schema_editor):
|
||||
WorkoutLog = apps.get_model('manager', 'WorkoutLog')
|
||||
WorkoutSession = apps.get_model('manager', 'WorkoutSession')
|
||||
|
||||
for entry in WorkoutLog.objects.all():
|
||||
entry.uuid = uuid.uuid4()
|
||||
entry.save(update_fields=['uuid'])
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
for entry in WorkoutSession.objects.all():
|
||||
entry.uuid = uuid.uuid4()
|
||||
entry.save(update_fields=['uuid'])
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
('manager', '0023_change_validators'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='workoutsession',
|
||||
name='uuid',
|
||||
field=models.UUIDField(default=uuid.uuid4, editable=False, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='workoutlog',
|
||||
name='uuid',
|
||||
@@ -29,6 +39,11 @@ class Migration(migrations.Migration):
|
||||
reverse_code=migrations.RunPython.noop,
|
||||
),
|
||||
# Set uuid fields to non-nullable
|
||||
migrations.AlterField(
|
||||
model_name='workoutsession',
|
||||
name='uuid',
|
||||
field=models.UUIDField(default=uuid.uuid4, editable=True, null=False),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='workoutlog',
|
||||
name='uuid',
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
# Standard Library
|
||||
import datetime
|
||||
from uuid import uuid4
|
||||
|
||||
# Django
|
||||
from django.contrib.auth.models import User
|
||||
@@ -49,6 +50,12 @@ class WorkoutLog(models.Model):
|
||||
|
||||
objects = WorkoutLogManager()
|
||||
|
||||
uuid = models.UUIDField(
|
||||
default=uuid4,
|
||||
editable=True,
|
||||
null=False,
|
||||
)
|
||||
|
||||
date = models.DateTimeField(
|
||||
verbose_name=_('Date'),
|
||||
default=datetime.datetime.now,
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
# Standard Library
|
||||
import datetime
|
||||
from uuid import uuid4
|
||||
|
||||
# Django
|
||||
from django.contrib.auth.models import User
|
||||
@@ -53,6 +54,12 @@ class WorkoutSession(models.Model):
|
||||
See note in weight.models.WeightEntry about why this is not editable=False
|
||||
"""
|
||||
|
||||
uuid = models.UUIDField(
|
||||
default=uuid4,
|
||||
editable=True,
|
||||
null=False,
|
||||
)
|
||||
|
||||
routine = models.ForeignKey(
|
||||
'Routine',
|
||||
on_delete=models.CASCADE,
|
||||
|
||||
@@ -17,8 +17,14 @@
|
||||
import logging
|
||||
|
||||
# wger
|
||||
from wger.manager.api.serializers import WorkoutLogSerializer
|
||||
from wger.manager.models import WorkoutLog
|
||||
from wger.manager.api.serializers import (
|
||||
WorkoutLogSerializer,
|
||||
WorkoutSessionSerializer,
|
||||
)
|
||||
from wger.manager.models import (
|
||||
WorkoutLog,
|
||||
WorkoutSession,
|
||||
)
|
||||
from wger.weight.api.serializers import WeightEntrySerializer
|
||||
from wger.weight.models import WeightEntry
|
||||
|
||||
@@ -69,3 +75,48 @@ def handle_delete_log(payload: dict[str, any], user_id: int) -> None:
|
||||
logger.warning(f'WorkoutLog with UUID {payload["uuid"]} not found for delete.')
|
||||
return
|
||||
entry.delete()
|
||||
|
||||
|
||||
def handle_update_session(payload: dict[str, any], user_id: int) -> None:
|
||||
"""Handle a push event from PowerSync"""
|
||||
logger.debug(
|
||||
f'Received PowerSync payload for update: {payload}',
|
||||
)
|
||||
entry = WorkoutSession.objects.get(uuid=payload['id'], user_id=user_id)
|
||||
|
||||
if not entry:
|
||||
logger.warning(
|
||||
f'WorkoutSession with UUID {payload["id"]} and user {user_id} not found for update.'
|
||||
)
|
||||
return
|
||||
|
||||
serializer = WorkoutSessionSerializer(entry, data=payload, partial=True)
|
||||
if serializer.is_valid():
|
||||
serializer.save()
|
||||
logger.info(f'Updated WorkoutSession {entry.pk} (uuid={entry.uuid}) for user {user_id}')
|
||||
else:
|
||||
logger.warning(f'PowerSync update validation failed: {serializer.errors}')
|
||||
|
||||
|
||||
def handle_create_session(payload: dict[str, any], user_id: int) -> None:
|
||||
"""Handle a create event from PowerSync"""
|
||||
logger.debug(
|
||||
f'Received PowerSync payload for create: {payload}',
|
||||
)
|
||||
serializer = WorkoutSessionSerializer(data=payload)
|
||||
if serializer.is_valid():
|
||||
serializer.save(user_id=user_id)
|
||||
else:
|
||||
logger.warning(f'PowerSync create validation failed: {serializer.errors}')
|
||||
|
||||
|
||||
def handle_delete_session(payload: dict[str, any], user_id: int) -> None:
|
||||
"""Handle a delete event from PowerSync"""
|
||||
logger.debug(
|
||||
f'Received PowerSync payload for delete: {payload}',
|
||||
)
|
||||
entry = WorkoutSession.objects.get(uuid=payload['id'], user_id=user_id)
|
||||
if not entry:
|
||||
logger.warning(f'WorkoutSession with UUID {payload["uuid"]} not found for delete.')
|
||||
return
|
||||
entry.delete()
|
||||
|
||||
Reference in New Issue
Block a user