diff --git a/rowers/dataprepnodjango.py b/rowers/dataprepnodjango.py
index 2c5c6d14..e9e3cd10 100644
--- a/rowers/dataprepnodjango.py
+++ b/rowers/dataprepnodjango.py
@@ -677,10 +677,14 @@ def getsmallrowdata_db(columns,ids=[],debug=False):
def fitnessmetric_to_sql(m,table='powertimefitnessmetric',debug=False,
doclean=False):
# test if nan among values
- if np.nan in m.values():
+ if np.nan in m.values() or np.inf in m.values():
for key in m.keys():
if np.isnan([m[key]]):
m[key] = -1
+ if m[key] == np.inf:
+ m[key] = -1
+ if -m[key] == np.inf:
+ m[key] = -1
if debug:
engine = create_engine(database_url_debug, echo=False)
diff --git a/rowers/email.py b/rowers/email.py
deleted file mode 100644
index b7f6cbf4..00000000
--- a/rowers/email.py
+++ /dev/null
@@ -1,82 +0,0 @@
-import time
-from django.views.generic.base import TemplateView
-from django.shortcuts import render
-from django.http import HttpResponse, HttpResponseRedirect
-from django.contrib.auth import authenticate, login, logout
-from rowers.forms import LoginForm,DocumentsForm,UploadOptionsForm
-from django.core.urlresolvers import reverse
-from django.conf import settings
-from django.utils.datastructures import MultiValueDictKeyError
-from django.utils import timezone,translation
-from django.core.mail import send_mail, BadHeaderError
-from rowers.forms import EmailForm, RegistrationForm, RegistrationFormTermsOfService,RegistrationFormUniqueEmail,CNsummaryForm,UpdateWindForm,UpdateStreamForm
-from rowers.forms import PredictedPieceForm
-from rowers.models import Workout, User, Rower, WorkoutForm,RowerForm,GraphImage,AdvancedWorkoutForm
-import StringIO
-from django.contrib.auth.decorators import login_required,user_passes_test
-from time import strftime,strptime,mktime,time,daylight
-import os,sys
-import datetime
-import iso8601
-import c2stuff
-from c2stuff import C2NoTokenError
-from iso8601 import ParseError
-import stravastuff
-import sporttracksstuff
-from rowsandall_app.settings import C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET, STRAVA_CLIENT_ID, STRAVA_REDIRECT_URI, STRAVA_CLIENT_SECRET
-from rowsandall_app.settings import SPORTTRACKS_CLIENT_ID, SPORTTRACKS_REDIRECT_URI, SPORTTRACKS_CLIENT_SECRET
-import requests
-import json
-from rowers.rows import handle_uploaded_file
-from rowers.tasks import handle_makeplot,handle_otwsetpower,handle_sendemailtcx
-from scipy.signal import savgol_filter
-
-from rowingdata import rower as rrower
-from rowingdata import main as rmain
-from rowingdata import rowingdata as rdata
-from rowingdata import TCXParser,RowProParser,ErgDataParser,TCXParserNoHR
-from rowingdata import painsledDesktopParser,speedcoachParser,ErgStickParser
-from rowingdata import SpeedCoach2Parser,FITParser,fitsummarydata
-from rowingdata import make_cumvalues
-from rowingdata import summarydata,get_file_type
-import pandas as pd
-import numpy as np
-import matplotlib.pyplot as plt
-from pytz import timezone as tz,utc
-import dateutil
-import mpld3
-from mpld3 import plugins
-import stravalib
-from stravalib.exc import ActivityUploadFailed,TimeoutExceeded
-from weather import get_wind_data
-
-import django_rq
-queue = django_rq.get_queue('default')
-queuelow = django_rq.get_queue('low')
-queuehigh = django_rq.get_queue('low')
-
-import plots
-
-from io import BytesIO
-from scipy.special import lambertw
-
-# used in shell to send a newsletter to all Rowers
-def emailall(emailfile,subject):
- rowers = Rower.objects.all()
- for rower in rowers:
- email = rower.user.email
- firstname = rower.user.first_name
-
- print email
-
- with open(emailfile) as f:
- message = f.read()
-
- message = '\nDear '+firstname+',\n\n'+str(message)
-
- send_mail(
- subject,
- message,
- 'info@rowsandall.com',
- [email],
- )
diff --git a/rowers/emails.py b/rowers/emails.py
new file mode 100644
index 00000000..a5682019
--- /dev/null
+++ b/rowers/emails.py
@@ -0,0 +1,31 @@
+from django.core.mail.message import MIMEText
+#from email.mime.application import MIMEApplication
+from django.core.mail.message import MIMEMultipart
+
+# boto3 email functionality
+import boto3
+AWS_REGION = "us-west-2"
+CHARSET = "UTF-8"
+client = boto3.client('ses',region_name=AWS_REGION)
+
+def sendemail(fromaddress,recipients,subjecttext,bodytext,attachment=None):
+ msg = MIMEMultipart()
+ msg['Subject'] = subjecttext
+ msg['From'] = fromaddress
+ msg['To'] = recipients
+ part = MIMEText(bodytext)
+ msg.attach(part)
+
+ # if attachment:
+ # part = MIMEApplication(open(attachment,'rb').read())
+ # part.add_header('Content-Disposition', 'attachment',
+ # filename=attachment)
+ # msg.attach(part)
+
+ result = client.send_raw_email(
+ Source=msg['From'],
+ Destination=msg['To'],
+ RawMessage=msg
+ )
+
+ return result
diff --git a/rowers/models.py b/rowers/models.py
index f8e75a01..c5afa452 100644
--- a/rowers/models.py
+++ b/rowers/models.py
@@ -571,6 +571,8 @@ class Rower(models.Model):
getemailnotifications = models.BooleanField(default=False,
verbose_name='Receive email notifications')
+ emailbounced = models.BooleanField(default=False,
+ verbose_name='Email Address Bounced')
rowerplan = models.CharField(default='basic',max_length=30,
choices=plans)
diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py
index 45a90c63..b11fab3b 100644
--- a/rowers/plannedsessions.py
+++ b/rowers/plannedsessions.py
@@ -213,6 +213,7 @@ def is_session_complete_ws(ws,ps):
if ratio>cratiomin and ratio
The data protection officer for rowsandall.com is Sander Roosendaal and he may be contacted
at support@rowsandall.com.
- {{ ps.sessionvalue }}
{{ actualvalue|lookup:ps.id }}
{{ ps.sessionunit }}
+ {% if completeness|lookup:ps.id == 'partial' %}
+ {{ completiondate|lookup:ps.id|date:"Y-m-d" }}
+ {% else %}
{{ completiondate|lookup:ps.id|date:"Y-m-d" }}
+ {% endif %}
{% endfor %}
diff --git a/rowers/templates/privacypolicy.html b/rowers/templates/privacypolicy.html
index 924c63ca..a3faa516 100644
--- a/rowers/templates/privacypolicy.html
+++ b/rowers/templates/privacypolicy.html
@@ -92,7 +92,28 @@
+ Some actions on the site result in an individual email sent to you. +
+ ++ We will rarely use mass email to communicate to all our users. These cases + are limited to substantial changes in terms and conditions and other + announcements impacting the terms on which you use the site. We will + it is important to get these messages to you. If you do not with + to receive such emails, you can indicate so in the user settings. +
+ ++ Other site related communication (new features, outages, bugs, + price changes) are communicated through announcements on the + website, throught Twitter, Facebook and our blog + posts. +