diff --git a/rowers/c2stuff.py b/rowers/c2stuff.py index 5a132189..88e7d46e 100644 --- a/rowers/c2stuff.py +++ b/rowers/c2stuff.py @@ -192,7 +192,10 @@ def summaryfromsplitdata(splitdata,data,filename,sep='|'): totaldist = data['distance'] totaltime = data['time']/10. - spm = data['stroke_rate'] + try: + spm = data['stroke_rate'] + except KeyError: + spm = 0 try: resttime = data['rest_time']/10. except KeyError: diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 91ba1c7c..b5cb5603 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -80,7 +80,7 @@ from rowsandall_app.settings import SITE_URL from rowers.mytypes import otwtypes from rowers.database import * - +from rowers.opaque import encoder # mapping the DB column names to the CSV file column names @@ -1416,7 +1416,7 @@ def split_workout(r, parent, splitsecond, splitmode): setprivate=setprivate, forceunit='N') messages.append(message) - ids.append(id) + ids.append(encoder.encode_hex(id)) if 'keep second' in splitmode: data2['cumdist'] = data2['cumdist'] - data2.iloc[ 0, @@ -1443,7 +1443,7 @@ def split_workout(r, parent, splitsecond, splitmode): setprivate=setprivate, dt=dt, forceunit='N') messages.append(message) - ids.append(id) + ids.append(encoder.encode_hex(id)) if not 'keep original' in splitmode: if 'keep second' in splitmode or 'keep first' in splitmode: @@ -1451,7 +1451,7 @@ def split_workout(r, parent, splitsecond, splitmode): messages.append('Deleted Workout: ' + parent.name) else: messages.append('That would delete your workout') - ids.append(parent.id) + ids.append(encoder.encode_hex(parent.id)) elif 'originalprivate' in splitmode: parent.privacy = 'hidden' parent.save() diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 271455e8..b17fdc7d 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -2230,7 +2230,7 @@ def interactive_chart(id=0,promember=0,intervaldata = {}): intervaldf['itime'] = intervaldf['itime']*1.e3 intervaldf['time'] = intervaldf['itime'].cumsum() intervaldf['time'] = intervaldf['time'].shift(1) - intervaldf.ix[0,'time'] = 0 + intervaldf.loc[:,'time'].iloc[0] = 0 intervaldf['time_r'] = intervaldf['time'] +intervaldf['itime'] intervaldf['value'] = 100 mask = intervaldf['itype'] == 3 diff --git a/rowers/management/commands/processemail.py b/rowers/management/commands/processemail.py index 95bc028c..52022e06 100644 --- a/rowers/management/commands/processemail.py +++ b/rowers/management/commands/processemail.py @@ -24,9 +24,12 @@ from rowers.mailprocessing import make_new_workout_from_email, send_confirm import rowers.polarstuff as polarstuff import rowers.c2stuff as c2stuff import rowers.stravastuff as stravastuff +from rowers.opaque import encoder + from rowers.models import User,VirtualRace,Workout from rowers.plannedsessions import email_submit_race + workoutmailbox = Mailbox.objects.get(name='workouts') failedmailbox = Mailbox.objects.get(name='Failed') @@ -105,7 +108,7 @@ def processattachment(rower, fileobj, title, uploadoptions,testing=False): link = settings.SITE_URL+reverse( therower.defaultlandingpage, kwargs = { - 'id':workoutid[0], + 'id':encoder.encode_hex(workoutid[0]), } ) diff --git a/rowers/opaque.py b/rowers/opaque.py new file mode 100644 index 00000000..0fc59a69 --- /dev/null +++ b/rowers/opaque.py @@ -0,0 +1,59 @@ +import struct +import base64 + +from rowsandall_app.settings import ( + C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET, + STRAVA_CLIENT_ID, STRAVA_REDIRECT_URI, STRAVA_CLIENT_SECRET, + POLAR_CLIENT_ID, POLAR_REDIRECT_URI, POLAR_CLIENT_SECRET, + SPORTTRACKS_CLIENT_ID, SPORTTRACKS_REDIRECT_URI, + SPORTTRACKS_CLIENT_SECRET, + UNDERARMOUR_CLIENT_ID, UNDERARMOUR_REDIRECT_URI, + UNDERARMOUR_CLIENT_SECRET,UNDERARMOUR_CLIENT_KEY, + RUNKEEPER_CLIENT_ID,RUNKEEPER_REDIRECT_URI,RUNKEEPER_CLIENT_SECRET, + TP_CLIENT_ID,TP_REDIRECT_URI,TP_CLIENT_KEY,TP_CLIENT_SECRET, + BRAINTREE_MERCHANT_ID,BRAINTREE_PUBLIC_KEY,BRAINTREE_PRIVATE_KEY, + PAYMENT_PROCESSING_ON,OPAQUE_SECRET_KEY + ) + +class OpaqueEncoder: + """ + Opaque ID encoder. + Translates between 32-bit integers (such as resource IDs) and obfuscated + scrambled values, as a one-to-one mapping. Supports hex and base64 url-safe + string representations. Expects a secret integer key in the constructor. + (c) 2011 Marek Z. @marekweb + """ + + def __init__(self, key): + self.key = key + self.extra_chars = b'.-'; + + def transform(self, i): + """Produce an integer hash of a 16-bit integer, returning a transformed 16-bit integer.""" + i = (self.key ^ i) * 0x9e3b + return i >> (i & 0xf) & 0xffff + + def transcode(self, i): + """Reversibly transcode a 32-bit integer to a scrambled form, returning a new 32-bit integer.""" + r = i & 0xffff + l = i >> 16 & 0xffff ^ self.transform(r) + return ((r ^ self.transform(l)) << 16) + l + + def encode_hex(self, i): + """Transcode an integer and return it as an 8-character hex string.""" + return "%08x" % self.transcode(i) + + def encode_base64(self, i): + """Transcode an integer and return it as a 6-character base64 string.""" + return base64.b64encode(struct.pack('!L', self.transcode(i)), self.extra_chars)[:6] + + def decode_hex(self, s): + """Decode an 8-character hex string, returning the original integer.""" + return self.transcode(int(s, 16)) + + def decode_base64(self, s): + """Decode a 6-character base64 string, returning the original integer.""" + return self.transcode(struct.unpack('!L', base64.b64decode(s + '==', self.extra_chars))[0]) + + +encoder = OpaqueEncoder(OPAQUE_SECRET_KEY) diff --git a/rowers/templates/advancededit.html b/rowers/templates/advancededit.html index 5ab7140b..66a6c8c8 100644 --- a/rowers/templates/advancededit.html +++ b/rowers/templates/advancededit.html @@ -23,17 +23,17 @@
@@ -52,7 +52,7 @@@@ -80,7 +80,7 @@
{% if user|is_promember %} - Edit Intervals + Edit Intervals {% else %} Edit Intervals* {% endif %} @@ -96,7 +96,7 @@
{% if user|is_promember %} - Dist Metrics Plot + Dist Metrics Plot {% else %} Dist Metrics Plot* {% endif %} @@ -108,7 +108,7 @@
{% if user|is_promember %} - Time Metrics Plot + Time Metrics Plot {% else %} Time Metrics Plot* {% endif %} @@ -120,7 +120,7 @@
{% if user|is_promember %} - Power Histogram + Power Histogram {% else %} Power Histogram* {% endif %} @@ -147,7 +147,7 @@
{% if user|is_promember %} - Sensor Fusion + Sensor Fusion {% else %} Sensor Fusion* {% endif %} @@ -159,7 +159,7 @@
{% if user|is_promember %} - Split Workout + Split Workout {% else %} Split Workout* {% endif %} @@ -172,7 +172,7 @@
- Big Interactive Plot + Big Interactive Plot
See (and save) the big interactive plot @@ -180,7 +180,7 @@
If your workout has in-stroke metrics (like a stroke power curve or boat acceleration curve), you will find it here.
diff --git a/rowers/templates/advancedotw.html b/rowers/templates/advancedotw.html index 56d5a322..59bd5ccf 100644 --- a/rowers/templates/advancedotw.html +++ b/rowers/templates/advancedotw.html @@ -21,17 +21,17 @@ {% endif %} @@ -49,7 +49,7 @@{% if user|is_promember %} - Compare Workouts + Compare Workouts {% else %} Compare Workouts* {% endif %} @@ -70,7 +70,7 @@
- Flexible Interactive Plot + Flexible Interactive Plot
Flexible Interactive plot. Pick your own X and Y axis parameters. @@ -80,7 +80,7 @@
{% if user|is_promember %} - Edit Intervals + Edit Intervals {% else %} Edit Intervals* {% endif %} @@ -97,7 +97,7 @@
{% if user|is_promember %} - CrewNerd Summary + CrewNerd Summary {% else %} CrewNerd Summary* {% endif %} @@ -111,7 +111,7 @@
{% if user|is_promember %} - Stroke Profile (Empower) + Stroke Profile (Empower) {% else %} Stroke Profile (Empower)* {% endif %} @@ -124,7 +124,7 @@
{% if user|is_promember %} - OTW Power Plot + OTW Power Plot {% else %} OTW Power Plot* {% endif %} @@ -144,7 +144,7 @@
{% if user|is_promember %} - Geeky Stuff + Geeky Stuff {% else %} Geeky Stuff* {% endif %} @@ -159,7 +159,7 @@
{% if user|is_promember %} - Smooth out Pace Data + Smooth out Pace Data {% else %} Smooth out Pace Data* {% endif %} @@ -176,7 +176,7 @@
{% if user|is_promember %} - Raw Data + Raw Data {% else %} Reset Smoothing* {% endif %} @@ -203,7 +203,7 @@
{% if user|is_promember %} - Sensor Fusion + Sensor Fusion {% else %} Sensor Fusion* {% endif %} @@ -215,7 +215,7 @@
{% if user|is_promember %} - Split Workout + Split Workout {% else %} Split Workout* {% endif %} @@ -229,7 +229,7 @@
- Big Interactive Plot + Big Interactive Plot
See (and save) the big interactive plot @@ -237,7 +237,7 @@
If your workout has in-stroke metrics (like a stroke power curve or boat acceleration curve), you will find it here.
diff --git a/rowers/templates/biginteractive1.html b/rowers/templates/biginteractive1.html index 0d4cb513..99ab4f4c 100644 --- a/rowers/templates/biginteractive1.html +++ b/rowers/templates/biginteractive1.html @@ -42,12 +42,12 @@ {% if user.is_authenticated and mayedit %} diff --git a/rowers/templates/comparison_list.html b/rowers/templates/comparison_list.html index 2ad2d425..804fd6b9 100644 --- a/rowers/templates/comparison_list.html +++ b/rowers/templates/comparison_list.html @@ -80,7 +80,7 @@
{% if user|is_promember %} - Edit Wind Data + Edit Wind Data {% else %} Edit Wind Data {% endif %} @@ -71,7 +71,7 @@
{% if user|is_promember %} - Edit Stream Data + Edit Stream Data {% else %} Edit Stream Data {% endif %} @@ -84,7 +84,7 @@
{% if user|is_promember %} - OTW Power + OTW Power {% else %} OTW Power {% endif %} @@ -101,7 +101,7 @@
{% if user|is_promember %} - Corrected Pace Plot + Corrected Pace Plot {% else %} Corrected Pace Plot {% endif %} @@ -113,7 +113,7 @@
- Big Interactive Plot + Big Interactive Plot
See (and save) the big interactive plot @@ -128,7 +128,7 @@ {% else %}
- Set wind strength and direction + Set wind strength and direction
diff --git a/rowers/templates/panel_advancededit.html b/rowers/templates/panel_advancededit.html index 58f0182c..8d09e083 100644 --- a/rowers/templates/panel_advancededit.html +++ b/rowers/templates/panel_advancededit.html @@ -1,5 +1,6 @@ +{% load rowerfilters %} diff --git a/rowers/templates/panel_comments.html b/rowers/templates/panel_comments.html index 3250e4fd..09d0d0f0 100644 --- a/rowers/templates/panel_comments.html +++ b/rowers/templates/panel_comments.html @@ -14,12 +14,12 @@- Flex Chart + Flex Chart
-