delete functionality
This commit is contained in:
@@ -380,16 +380,34 @@ class IntervalsIntegration(SyncIntegration):
|
||||
|
||||
stepstext = ps.steps_intervals()
|
||||
|
||||
category = 'WORKOUT'
|
||||
startdate = ps.preferreddate.strftime('%Y-%m-%dT%H:%M:%S')
|
||||
enddate = ps.preferreddate.strftime('%Y-%m-%d') + 'T23:59:59'
|
||||
if ps.sessiontype == 'cycletarget':
|
||||
category = 'TARGET'
|
||||
startdate = ps.startdate.strftime('%Y-%m-%dT%H:%M:%S')
|
||||
enddate = ps.enddate.strftime('%Y-%m-%d') + 'T23:59:59'
|
||||
|
||||
data = {
|
||||
"start_date_local": ps.preferreddate.strftime('%Y-%m-%dT%H:%M:%S'),
|
||||
"start_date_local": startdate,
|
||||
"type": mytypes.intervalsmapping[ps.sessionsport],
|
||||
"category": "WORKOUT",
|
||||
"end_date_local": ps.preferreddate.strftime('%Y-%m-%d') + 'T23:59:59',
|
||||
"category": category,
|
||||
"end_date_local": enddate,
|
||||
"name": ps.name,
|
||||
"description": stepstext,
|
||||
"indoor": ps.sessionsport in mytypes.ergtypes,
|
||||
}
|
||||
|
||||
if ps.sessiontype == 'cycletarget':
|
||||
if ps.sessionmode == 'time':
|
||||
data['time_target'] = ps.sessionvalue*60
|
||||
elif ps.sessionmode == 'distance':
|
||||
data['distance_target'] = ps.sessionvalue
|
||||
elif ps.sessionmode == 'rScore':
|
||||
data['load_target'] = ps.sessionvalue
|
||||
elif ps.sessionmode == 'Trimp':
|
||||
data['load_target'] = ps.sessionvalue/2.
|
||||
|
||||
url = self.oauth_data['base_url'] + 'athlete/0/events'
|
||||
response = requests.post(url, headers=headers, json=data)
|
||||
|
||||
@@ -399,8 +417,28 @@ class IntervalsIntegration(SyncIntegration):
|
||||
|
||||
data = response.json()
|
||||
id = data['id']
|
||||
ps.intervalsid = id
|
||||
ps.intervals_icu_id = id
|
||||
ps.save()
|
||||
|
||||
return id
|
||||
|
||||
def plannedsession_delete(self, ps, *args, **kwargs):
|
||||
_ = self.open()
|
||||
r = self.rower
|
||||
|
||||
headers = {
|
||||
'Authorization': 'Bearer ' + r.intervals_token,
|
||||
}
|
||||
|
||||
url = self.oauth_data['base_url'] + 'athlete/0/events/' + str(ps.intervals_icu_id)
|
||||
|
||||
response = requests.delete(url, headers=headers)
|
||||
|
||||
if response.status_code != 200:
|
||||
dologging('intervals.icu.log', response.text)
|
||||
return 0
|
||||
|
||||
ps.intervals_icu_id = None
|
||||
ps.save()
|
||||
|
||||
return 1
|
||||
|
||||
@@ -5,7 +5,8 @@ from rowers.courseutils import coordinate_in_path
|
||||
from rowers.utils import (
|
||||
# workflowleftpanel, workflowmiddlepanel,
|
||||
defaultleft, defaultmiddle, landingpages, landingpages2,
|
||||
steps_read_fit, steps_write_fit, steps_read_intervals, ps_dict_order, uniqify
|
||||
steps_read_fit, steps_write_fit, steps_read_intervals, ps_dict_order, uniqify,
|
||||
dologging
|
||||
)
|
||||
from rowers.metrics import axlabels
|
||||
from rowers.utils import geo_distance, move_one_meter
|
||||
@@ -1174,6 +1175,7 @@ class Rower(models.Model):
|
||||
c2_auto_import = models.BooleanField(default=False)
|
||||
intervals_auto_export = models.BooleanField(default=False)
|
||||
intervals_auto_import = models.BooleanField(default=False)
|
||||
intervals_delete_plannedsession = models.BooleanField(default=False, verbose_name="Deleting planned session deletes it on intervals.icu")
|
||||
intervals_resample_to_1s = models.BooleanField(default=False, verbose_name='Resample to 1s on export')
|
||||
sporttrackstoken = models.CharField(
|
||||
default='', max_length=200, blank=True, null=True)
|
||||
@@ -1246,6 +1248,7 @@ class Rower(models.Model):
|
||||
intervals_token = models.CharField(
|
||||
default='', max_length=200, blank=True, null=True)
|
||||
intervals_owner_id = models.CharField(default='', max_length=200,blank=True, null=True)
|
||||
|
||||
|
||||
privacychoices = (
|
||||
('visible', 'Visible'),
|
||||
@@ -2952,6 +2955,19 @@ class PlannedSession(models.Model):
|
||||
s = steps_read_intervals(settings.MEDIA_ROOT+'/'+self.fitfile.name)
|
||||
return s
|
||||
|
||||
def delete(self, *args, **kwargs):
|
||||
r = self.manager.rower
|
||||
if self.intervals_icu_id and r.intervals_delete_plannedsession:
|
||||
headers = {
|
||||
'Authorization': 'Bearer '+ r.intervals_token
|
||||
}
|
||||
url = 'https://intervals.icu/api/v1/athlete/0/events/'+str(self.intervals_icu_id)
|
||||
response = requests.delete(url, headers=headers)
|
||||
if response.status_code != 200:
|
||||
dologging('intervals.icu.log', response.text)
|
||||
|
||||
super(PlannedSession, self).delete(*args, **kwargs)
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if self.sessionvalue <= 0: # pragma: no cover
|
||||
self.sessionvalue = 1
|
||||
@@ -4628,6 +4644,7 @@ class RowerExportForm(ModelForm):
|
||||
'rp3_auto_import',
|
||||
'intervals_auto_import',
|
||||
'intervals_auto_export',
|
||||
'intervals_delete_plannedsession',
|
||||
'intervals_resample_to_1s',
|
||||
'imports_are_private'
|
||||
]
|
||||
@@ -4656,6 +4673,7 @@ class RowerExportFormIntervals(ModelForm):
|
||||
'intervals_auto_import',
|
||||
'intervals_auto_export',
|
||||
'intervals_resample_to_1s',
|
||||
'intervals_delete_plannedsession',
|
||||
]
|
||||
|
||||
class RowerExportFormGarmin(ModelForm):
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
{% else %}
|
||||
<a href="/rowers/sessions/{{ psdict.id.1 }}/togarmin/?next={{ request.path|urlencode }}"><i class="fas fa-watch-fitness fa-fw"></i> Export to Garmin</a>
|
||||
{% endif %}
|
||||
{% if ps.intervalsid != "" %}
|
||||
<a href="https://intervals.icu/"><i class="fa-solid fa-wave-pulse"></i> Exported to intervals.icu</a>
|
||||
{% if plannedsession.intervals_icu_id %}
|
||||
<a href="https://intervals.icu/?w={{ plannedsession.preferreddate }}"><i class="fa-solid fa-wave-pulse"></i> Exported to intervals.icu</a>
|
||||
{% else %}
|
||||
<a href="/rowers/sessions/{{ psdict.id.1 }}/tointervals/?next={{ request.path|urlencode }}"><i class="fa-solid fa-wave-pulse fa-fw"></i> Export to intervals.icu</a>
|
||||
{% endif %}
|
||||
|
||||
@@ -1042,6 +1042,10 @@ def mocked_requests(*args, **kwargs):
|
||||
|
||||
|
||||
class MockSession:
|
||||
def __init__(self):
|
||||
self.status_code = 200
|
||||
self.text = "- 20m 200W"
|
||||
|
||||
class headers:
|
||||
def __init__(self,*args,**kwargs): # pragma: no cover
|
||||
pass
|
||||
|
||||
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
BIN
rowers/tests/testdata/testdata.tcx.gz
vendored
Binary file not shown.
Reference in New Issue
Block a user