From 98428e736e1bcc6ee4c2ae855121a3deb87777f7 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 12 Jul 2019 10:34:51 +0200 Subject: [PATCH] fixing #490 --- requirements.txt | 5 +- rowers/mytypes.py | 63 ++++++++++++++------------ rowers/tests/test_emails.py | 62 +++++++++++++++++++++++++ rowers/tests/testdata/testdata.csv.gz | Bin 12523 -> 12543 bytes rowers/uploads.py | 12 +++-- rowers/views/analysisviews.py | 2 +- 6 files changed, 108 insertions(+), 36 deletions(-) diff --git a/requirements.txt b/requirements.txt index 5f567c26..4ff5f68c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,7 +30,7 @@ cycler==0.10.0 dask==1.1.4 decorator==4.4.0 defusedxml==0.5.0 -Django==2.1.7 +Django==2.2.1 django-analytical==2.5.0 django-async-messages==0.3.1 django-braces==1.13.0 @@ -157,7 +157,7 @@ ratelim==0.1.6 redis==3.2.1 requests==2.21.0 requests-oauthlib==1.2.0 -rowingdata==2.3.9 +rowingdata==2.4.4 rowingphysics==0.5.0 rq==1.0 rq-dashboard==0.4.0 @@ -190,6 +190,7 @@ wcwidth==0.1.7 webencodings==0.5.1 Werkzeug==0.15.2 widgetsnbextension==3.4.2 +xlrd==1.2.0 xmltodict==0.12.0 yamjam==0.1.7 yamllint==1.15.0 diff --git a/rowers/mytypes.py b/rowers/mytypes.py index e3dd7b46..5c59f8f3 100644 --- a/rowers/mytypes.py +++ b/rowers/mytypes.py @@ -5,37 +5,42 @@ from __future__ import unicode_literals from six import iteritems import collections -workouttypes = ( - ('water','Standard Racing Shell'), - ('rower','Indoor Rower'), - ('skierg','Ski Erg'), - ('bike','Bike Erg'), - ('dynamic','Dynamic Indoor Rower'), - ('slides','Indoor Rower on Slides'), - ('paddle','Paddle Adapter'), - ('snow','On-snow'), - ('coastal','Coastal'), - ('c-boat','Dutch C boat'), - ('churchboat','Finnish Church boat'), - ('Ride','Ride'), - ('Bike','Bike'), - ('Run','Run'), - ('NordicSki','NordicSki'), - ('Swim','Swim'), - ('Hike','Hike'), - ('Walk','Walk'), - ('Canoeing','Canoeing'), - ('Crossfit','Crossfit'), - ('StandUpPaddling','StandUpPaddling'), - ('IceSkate','IceSkate'), - ('WeightTraining','WeightTraining'), - ('InlineSkate','InlineSkate'), - ('Kayaking','Kayaking'), - ('Workout','Workout'), - ('Yoga','Yoga'), - ('other','Other'), +workouttypes_ordered = collections.OrderedDict({ + 'water':'Standard Racing Shell', + 'rower':'Indoor Rower', + 'skierg':'Ski Erg', + 'bikeerg':'Bike Erg', + 'dynamic':'Dynamic Indoor Rower', + 'slides':'Indoor Rower on Slides', + 'paddle':'Paddle Adapter', + 'snow':'On-snow', + 'coastal':'Coastal', + 'c-boat':'Dutch C boat', + 'churchboat':'Finnish Church boat', + 'Ride':'Ride', + 'Bike':'Bike', + 'Run':'Run', + 'NordicSki':'NordicSki', + 'Swim':'Swim', + 'Hike':'Hike', + 'Walk':'Walk', + 'Canoeing':'Canoeing', + 'Crossfit':'Crossfit', + 'StandUpPaddling':'StandUpPaddling', + 'IceSkate':'IceSkate', + 'WeightTraining':'WeightTraining', + 'InlineSkate':'InlineSkate', + 'Kayaking':'Kayaking', + 'Workout':'Workout', + 'Yoga':'Yoga', + 'other':'Other', + } ) +workouttypes = tuple((key, value) for key, value in workouttypes_ordered.items()) + + + stravamapping = collections.OrderedDict({ 'water':'Rowing', 'rower':'Rowing', diff --git a/rowers/tests/test_emails.py b/rowers/tests/test_emails.py index b1f69723..e00c16ea 100644 --- a/rowers/tests/test_emails.py +++ b/rowers/tests/test_emails.py @@ -67,6 +67,68 @@ workout run self.assertEqual(w.workouttype,'Run') +@override_settings(TESTING=True) +class EmailBikeErgUpload(TestCase): + def setUp(self): + redis_connection.publish('tasks','KILL') + u = User.objects.create_user('john', + 'sander@ds.ds', + 'koeinsloot') + r = Rower.objects.create(user=u,gdproptin=True, + gdproptindate=timezone.now() + ) + + self.theadmin = UserFactory(is_staff=True) + self.rtheadmin = Rower.objects.create(user=self.theadmin, + birthdate = faker.profile()['birthdate'], + gdproptin=True, + gdproptindate=timezone.now(), + rowerplan='coach') + + nu = datetime.datetime.now() + workoutsbox = Mailbox.objects.create(name='workouts') + workoutsbox.save() + failbox = Mailbox.objects.create(name='Failed') + failbox.save() + + m = Message(mailbox=workoutsbox, + from_header = u.email, + subject = "bikeerg", + body = """ +workout bikeerg + """) + m.save() + a2 = 'media/mailbox_attachments/colin3.csv' + copy('rowers/tests/testdata/emails/colin.csv',a2) + a = MessageAttachment(message=m,document=a2[6:]) + a.save() + + def tearDown(self): + for filename in os.listdir('media/mailbox_attachments'): + path = os.path.join('media/mailbox_attachments/',filename) + if not os.path.isdir(path): + try: + os.remove(path) + except (IOError,FileNotFoundError,OSError): + pass + + @patch('rowers.dataprep.create_engine') + @patch('rowers.polarstuff.get_polar_notifications') + @patch('rowers.c2stuff.requests.get', side_effect=mocked_requests) + @patch('rowers.c2stuff.requests.post', side_effect=mocked_requests) + def test_emailupload( + self, mocked_sqlalchemy,mocked_polar_notifications, mock_get, mock_post): + out = StringIO() + call_command('processemail', stdout=out,testing=True) + self.assertIn('Successfully processed email attachments',out.getvalue()) + + ws = Workout.objects.filter(name="bikeerg") + + self.assertEqual(len(ws),1) + w = ws[0] + self.assertEqual(w.workouttype,'bikeerg') + + #@pytest.mark.django_db @override_settings(TESTING=True) diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index 7eeee661753d6b675701c16b4add33bd19b6e0f6..86e8974f9f379ea4b5c2c33d81a8207bd673d673 100644 GIT binary patch literal 12543 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 zʩ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