delete functionality
This commit is contained in:
@@ -380,16 +380,34 @@ class IntervalsIntegration(SyncIntegration):
|
|||||||
|
|
||||||
stepstext = ps.steps_intervals()
|
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 = {
|
data = {
|
||||||
"start_date_local": ps.preferreddate.strftime('%Y-%m-%dT%H:%M:%S'),
|
"start_date_local": startdate,
|
||||||
"type": mytypes.intervalsmapping[ps.sessionsport],
|
"type": mytypes.intervalsmapping[ps.sessionsport],
|
||||||
"category": "WORKOUT",
|
"category": category,
|
||||||
"end_date_local": ps.preferreddate.strftime('%Y-%m-%d') + 'T23:59:59',
|
"end_date_local": enddate,
|
||||||
"name": ps.name,
|
"name": ps.name,
|
||||||
"description": stepstext,
|
"description": stepstext,
|
||||||
"indoor": ps.sessionsport in mytypes.ergtypes,
|
"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'
|
url = self.oauth_data['base_url'] + 'athlete/0/events'
|
||||||
response = requests.post(url, headers=headers, json=data)
|
response = requests.post(url, headers=headers, json=data)
|
||||||
|
|
||||||
@@ -399,8 +417,28 @@ class IntervalsIntegration(SyncIntegration):
|
|||||||
|
|
||||||
data = response.json()
|
data = response.json()
|
||||||
id = data['id']
|
id = data['id']
|
||||||
ps.intervalsid = id
|
ps.intervals_icu_id = id
|
||||||
ps.save()
|
ps.save()
|
||||||
|
|
||||||
return id
|
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 (
|
from rowers.utils import (
|
||||||
# workflowleftpanel, workflowmiddlepanel,
|
# workflowleftpanel, workflowmiddlepanel,
|
||||||
defaultleft, defaultmiddle, landingpages, landingpages2,
|
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.metrics import axlabels
|
||||||
from rowers.utils import geo_distance, move_one_meter
|
from rowers.utils import geo_distance, move_one_meter
|
||||||
@@ -1174,6 +1175,7 @@ class Rower(models.Model):
|
|||||||
c2_auto_import = models.BooleanField(default=False)
|
c2_auto_import = models.BooleanField(default=False)
|
||||||
intervals_auto_export = models.BooleanField(default=False)
|
intervals_auto_export = models.BooleanField(default=False)
|
||||||
intervals_auto_import = 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')
|
intervals_resample_to_1s = models.BooleanField(default=False, verbose_name='Resample to 1s on export')
|
||||||
sporttrackstoken = models.CharField(
|
sporttrackstoken = models.CharField(
|
||||||
default='', max_length=200, blank=True, null=True)
|
default='', max_length=200, blank=True, null=True)
|
||||||
@@ -1247,6 +1249,7 @@ class Rower(models.Model):
|
|||||||
default='', max_length=200, blank=True, null=True)
|
default='', max_length=200, blank=True, null=True)
|
||||||
intervals_owner_id = models.CharField(default='', max_length=200,blank=True, null=True)
|
intervals_owner_id = models.CharField(default='', max_length=200,blank=True, null=True)
|
||||||
|
|
||||||
|
|
||||||
privacychoices = (
|
privacychoices = (
|
||||||
('visible', 'Visible'),
|
('visible', 'Visible'),
|
||||||
('hidden', 'Hidden'),
|
('hidden', 'Hidden'),
|
||||||
@@ -2952,6 +2955,19 @@ class PlannedSession(models.Model):
|
|||||||
s = steps_read_intervals(settings.MEDIA_ROOT+'/'+self.fitfile.name)
|
s = steps_read_intervals(settings.MEDIA_ROOT+'/'+self.fitfile.name)
|
||||||
return s
|
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):
|
def save(self, *args, **kwargs):
|
||||||
if self.sessionvalue <= 0: # pragma: no cover
|
if self.sessionvalue <= 0: # pragma: no cover
|
||||||
self.sessionvalue = 1
|
self.sessionvalue = 1
|
||||||
@@ -4628,6 +4644,7 @@ class RowerExportForm(ModelForm):
|
|||||||
'rp3_auto_import',
|
'rp3_auto_import',
|
||||||
'intervals_auto_import',
|
'intervals_auto_import',
|
||||||
'intervals_auto_export',
|
'intervals_auto_export',
|
||||||
|
'intervals_delete_plannedsession',
|
||||||
'intervals_resample_to_1s',
|
'intervals_resample_to_1s',
|
||||||
'imports_are_private'
|
'imports_are_private'
|
||||||
]
|
]
|
||||||
@@ -4656,6 +4673,7 @@ class RowerExportFormIntervals(ModelForm):
|
|||||||
'intervals_auto_import',
|
'intervals_auto_import',
|
||||||
'intervals_auto_export',
|
'intervals_auto_export',
|
||||||
'intervals_resample_to_1s',
|
'intervals_resample_to_1s',
|
||||||
|
'intervals_delete_plannedsession',
|
||||||
]
|
]
|
||||||
|
|
||||||
class RowerExportFormGarmin(ModelForm):
|
class RowerExportFormGarmin(ModelForm):
|
||||||
|
|||||||
@@ -23,8 +23,8 @@
|
|||||||
{% else %}
|
{% 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>
|
<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 %}
|
{% endif %}
|
||||||
{% if ps.intervalsid != "" %}
|
{% if plannedsession.intervals_icu_id %}
|
||||||
<a href="https://intervals.icu/"><i class="fa-solid fa-wave-pulse"></i> Exported to intervals.icu</a>
|
<a href="https://intervals.icu/?w={{ plannedsession.preferreddate }}"><i class="fa-solid fa-wave-pulse"></i> Exported to intervals.icu</a>
|
||||||
{% else %}
|
{% 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>
|
<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 %}
|
{% endif %}
|
||||||
|
|||||||
@@ -1042,6 +1042,10 @@ def mocked_requests(*args, **kwargs):
|
|||||||
|
|
||||||
|
|
||||||
class MockSession:
|
class MockSession:
|
||||||
|
def __init__(self):
|
||||||
|
self.status_code = 200
|
||||||
|
self.text = "- 20m 200W"
|
||||||
|
|
||||||
class headers:
|
class headers:
|
||||||
def __init__(self,*args,**kwargs): # pragma: no cover
|
def __init__(self,*args,**kwargs): # pragma: no cover
|
||||||
pass
|
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