Private
Public Access
1
0

adding sessions sync

This commit is contained in:
2025-02-15 17:15:45 +01:00
parent 1105854469
commit 0e12ba58cd
3 changed files with 89 additions and 0 deletions

View File

@@ -560,6 +560,75 @@ class IntervalsIntegration(SyncIntegration):
def token_refresh(self, *args, **kwargs): def token_refresh(self, *args, **kwargs):
return super(IntervalsIntegration, self).token_refresh(*args, **kwargs) return super(IntervalsIntegration, self).token_refresh(*args, **kwargs)
def get_plannedsessions(self, *args, **kwargs):
try:
_ = self.open()
except NoTokenError:
return []
r = self.rower
ids = []
headers = {
'Authorization': 'Bearer ' + r.intervals_token,
}
oldest = kwargs.get('oldest', (timezone.now()).strftime('%Y-%m-%d'))
newest = kwargs.get('newest', (timezone.now() + timedelta(days=7)).strftime('%Y-%m-%d'))
url = self.oauth_data['base_url'] + 'athlete/0/events' #'?category=WORKOUT'
url += '?oldest=' + oldest + '&newest=' + newest
response = requests.get(url, headers=headers)
if response.status_code != 200:
return []
sessions = response.json()
for session in sessions:
localsessions = PlannedSession.objects.filter(intervals_icu_id=session['id'], rower__in=[r])
if localsessions.count() == 0:
sessiondata = self.get_plannedsession(session['id'])
if sessiondata['description'] is None:
sessiondata['description'] = ''
if sessiondata:
timetarget = sessiondata['time_target']
if timetarget is None:
timetarget = sessiondata['moving_time']
if timetarget is None:
timetarget = 3600
timetarget = int(timetarget)/60.
ps = PlannedSession(
name=sessiondata['name'],
comment=sessiondata['description'],
sessionmode='time',
sessionvalue=timetarget,
startdate=arrow.get(sessiondata['start_date_local']).datetime,
enddate=arrow.get(sessiondata['end_date_local']).datetime,
preferreddate=arrow.get(sessiondata['start_date_local']).datetime,
sessionsport=mytypes.intervalsmappinginv[sessiondata['type']],
sessiontype='session',
intervals_icu_id=sessiondata['id'],
manager=r.user,
)
ps.save()
ps.rower.add(r)
if sessiondata['category'].lower() == 'workout':
ps.fitfile = sessiondata['fitfile']
ps.save()
ps.update_steps()
if sessiondata['category'].lower() == 'target':
ps.sessiontype = 'cycletarget'
ps.sessionvalue = int(sessiondata['time_target'])/60.
ps.enddate = ps.startdate + datetime.timedelta(days=6)
ps.save()
ids.append(session['id'])
return ids
def get_plannedsessions_list(self, *args, **kwargs): def get_plannedsessions_list(self, *args, **kwargs):
try: try:
_ = self.open() _ = self.open()

View File

@@ -39,6 +39,10 @@
</p> </p>
</li> </li>
<li class="grid_4"> <li class="grid_4">
<p>
Click <a href="/rowers/sessions/?when={{ timeperiod }}&icu_sync=true">here</a> to sync this period with intervals.icu.
</p>
{% if plannedsessions %} {% if plannedsessions %}
<p> <p>
Click on the session name to view, on the circle to attach workouts to the session. Click on the session name to view, on the circle to attach workouts to the session.

View File

@@ -1455,6 +1455,9 @@ def plannedsessions_view(request,
except PermissionDenied: # pragma: no cover except PermissionDenied: # pragma: no cover
r = request.user.rower r = request.user.rower
do_intervals_icu_sync = request.GET.get('icu_sync', False)
if startdatestring: # pragma: no cover if startdatestring: # pragma: no cover
try: try:
startdate = iso8601.parse_date(startdatestring) startdate = iso8601.parse_date(startdatestring)
@@ -1475,6 +1478,14 @@ def plannedsessions_view(request,
startdate = startdate.date() startdate = startdate.date()
enddate = enddate.date() enddate = enddate.date()
if do_intervals_icu_sync: # pragma: no cover
integration = IntervalsIntegration(request.user)
newids = integration.get_plannedsessions(kwargs={'newest':startdate.strftime('%Y-%m-%d'),
'oldest':enddate.strftime('%Y-%m-%d')})
for id in newids:
messages.info(request, "Session {id} imported from ICU".format(id=id))
try: try:
trainingplan = TrainingPlan.objects.filter( trainingplan = TrainingPlan.objects.filter(
startdate__lte=startdate, startdate__lte=startdate,
@@ -1573,6 +1584,11 @@ def plannedsessions_view(request,
totals['plannedtrimp'] += ps.sessionvalue totals['plannedtrimp'] += ps.sessionvalue
else: else:
totals['plannedtrimp'] += ps.approximate_rscore*2 totals['plannedtrimp'] += ps.approximate_rscore*2
if ps.intervals_icu_id is None and do_intervals_icu_sync: # pragma: no cover
intervals = IntervalsIntegration(request.user)
result = intervals.plannedsession_create(ps)
messages.info(request, "Session {id} synced to ICU".format(id=ps.id))
totals['time'] = int(totals['time']/60.) totals['time'] = int(totals['time']/60.)
totals['actualtime'] = int(totals['actualtime']/60.) totals['actualtime'] = int(totals['actualtime']/60.)