From 9a7ecfeebc817c2633128e60ee5b18d052cdd3d4 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 12 Dec 2024 18:35:01 +0100 Subject: [PATCH] adding async sessions creation, adding link to plan --- rowers/models.py | 3 ++ rowers/plannedsessions.py | 64 ++++++++++++++++++++++----------------- rowers/tasks.py | 48 ++++++++++++++++++++++++++++- rowers/views/planviews.py | 2 +- 4 files changed, 87 insertions(+), 30 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index f4715081..9ea4b747 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2797,6 +2797,7 @@ class PlannedSession(models.Model): manager = models.ForeignKey(User, on_delete=models.PROTECT) rojabo_id = models.BigIntegerField(default=0,blank=True) + intervals_icu_id = models.CharField(default=None, blank=True, null=True, max_length=50) course = models.ForeignKey(GeoCourse, blank=True, null=True, verbose_name='OTW Course', on_delete=models.SET_NULL) @@ -2875,6 +2876,8 @@ class PlannedSession(models.Model): garmin_schedule_id = models.BigIntegerField(default=0) tags = TaggableManager(blank=True) + + from_plan = models.ForeignKey(TrainingPlan, on_delete=models.SET_NULL, null=True, blank=True) def __str__(self): diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index d9e6add5..b326b0b2 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -9,7 +9,7 @@ from rowers.models import ( from rowers.tasks import ( handle_sendemail_raceregistration, handle_sendemail_racesubmission ) -from rowers.tasks import handle_check_race_course +from rowers.tasks import handle_check_race_course, create_sessions_from_json_async from iso8601 import ParseError import iso8601 import rowers.courses as courses @@ -1068,40 +1068,48 @@ def get_workouts_session(r, ps): return ws -def create_sessions_from_json(plansteps, rower, startdate, manager, planbyrscore=False): +def create_sessions_from_json(plansteps, rower, startdate, manager, planbyrscore=False, plan=None, + asynchronous=False, queue=queue): trainingdays = plansteps['trainingDays'] planstartdate = startdate - for day in trainingdays: - for workout in day['workouts']: - sessionsport = 'water' - try: - sessionsport = mytypes.fitmappinginv[workout['sport'].lower()] - except KeyError: - pass + if not asynchronous: + for day in trainingdays: + for workout in day['workouts']: + sessionsport = 'water' + try: + sessionsport = mytypes.fitmappinginv[workout['sport'].lower()] + except KeyError: + pass - preferreddate = planstartdate+timedelta(days=day['order']) + preferreddate = planstartdate+timedelta(days=day['order']) - sessionmode = 'time' - if planbyrscore: - sessionmode = 'rScore' + sessionmode = 'time' + if planbyrscore: + sessionmode = 'rScore' - ps = PlannedSession( - startdate=preferreddate - - timedelta(days=preferreddate.weekday()), - enddate=preferreddate + - timedelta(days=-preferreddate.weekday()-1, weeks=1), - preferreddate=preferreddate, - sessionsport=sessionsport, # change this - name=workout['workoutName'], - steps=workout, - manager=manager, - sessionmode=sessionmode, - comment=workout['description'] - ) + ps = PlannedSession( + startdate=preferreddate - + timedelta(days=preferreddate.weekday()), + enddate=preferreddate + + timedelta(days=-preferreddate.weekday()-1, weeks=1), + preferreddate=preferreddate, + sessionsport=sessionsport, # change this + name=workout['workoutName'], + steps=workout, + manager=manager, + sessionmode=sessionmode, + comment=workout['description'], + from_plan=plan, + ) - ps.save() + ps.save() - add_rower_session(rower, ps) + add_rower_session(rower, ps) + return + + # async version + _ = myqueue(queue, create_sessions_from_json_async, plansteps, rower, startdate, manager, planbyrscore, plan) + def update_plannedsession(ps, cd): diff --git a/rowers/tasks.py b/rowers/tasks.py index a43a225d..b8ab9014 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -15,7 +15,7 @@ application = get_wsgi_application() from rowers.models import ( Workout, GeoPolygon, GeoPoint, GeoCourse, VirtualRaceResult, CourseTestResult, Rower, - GraphImage + GraphImage, Team, PlannedSession ) from rowers.session_utils import is_session_complete import math @@ -373,6 +373,52 @@ def handle_assignworkouts(workouts, rowers, remove_workout, debug=False, **kwarg return 1 +@app.task +def create_sessions_from_json_async(plansteps, rower, startdate, manager, planbyrscore, plan, debug=False, **kwargs): + trainingdays = plansteps['trainingDays'] + planstartdate = startdate + for day in trainingdays: + for workout in day['workouts']: + sessionsport = 'water' + try: + sessionsport = mytypes.fitmappinginv[workout['sport'].lower()] + except KeyError: + pass + + preferreddate = planstartdate+timedelta(days=day['order']) + + sessionmode = 'time' + if planbyrscore: + sessionmode = 'rScore' + + ps = PlannedSession( + startdate=preferreddate - + timedelta(days=preferreddate.weekday()), + enddate=preferreddate + + timedelta(days=-preferreddate.weekday()-1, weeks=1), + preferreddate=preferreddate, + sessionsport=sessionsport, # change this + name=workout['workoutName'], + steps=workout, + manager=manager, + sessionmode=sessionmode, + comment=workout['description'], + from_plan=plan, + ) + + ps.save() + + teams = Team.objects.filter(manager=ps.manager) + members = Rower.objects.filter(team__in=teams).distinct() + if rower in members and rower.rowerplan != 'freecoach': + ps.rower.add(rower) + ps.save() + elif ps.manager.rower == rower and rower.rowerplan != 'freecoach': + ps.rower.add(rower) + ps.save() + + return 1 + @app.task def handle_post_workout_api(uploadoptions, debug=False, **kwargs): # pragma: no cover session = requests.session() diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py index eb0db639..eb1711a2 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -2729,7 +2729,7 @@ def rower_view_instantplan(request, id='', userid=0): p.save() p.rowers.add(r) - create_sessions_from_json(plansteps, r, startdate, r.user, planbyrscore=byrscore) + create_sessions_from_json(plansteps, r, startdate, r.user, planbyrscore=byrscore, plan=p, asynchronous=True) messages.info(request, 'Your Sessions have been added')