From 76769266f3bce16095ca182dfc35eaa4241871d2 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 2 Jun 2020 20:13:46 +0200 Subject: [PATCH] cange --- rowers/interactiveplots.py | 145 +++++++++++++++++++++++++++- rowers/models.py | 3 +- rowers/templates/followerform.html | 7 +- rowers/templates/virtualevent.html | 4 + rowers/templatetags/rowerfilters.py | 18 +++- rowers/views/racesviews.py | 77 ++++++++++++++- 6 files changed, 247 insertions(+), 7 deletions(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index dbca08ba..51f4d105 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -2047,6 +2047,147 @@ def leaflet_chart(lat,lon,name=""): + return script,div + +def leaflet_chart_compare(workoutids,labeldict={},startenddict={}): + data = [] + for id in workoutids: + w = Workout.objects.get(id=id) + rowdata = rdata(w.csvfilename) + df = pd.DataFrame({ + 'id':id, + 'lat':rowdata.df[' latitude'], + 'lon':rowdata.df[' longitude'] + }) + data.append(f) + + df = pd.concat(data,axis=0) + + + + + # Throw out 0,0 + df = df.replace(0,np.nan) + df = df.loc[(df!=0).any(axis=1)] + df.fillna(method='bfill',axis=0,inplace=True) + df.fillna(method='ffill',axis=0,inplace=True) + lat = df['lat'] + lon = df['lon'] + if lat.empty or lon.empty: + return [0,"invalid coordinate data"] + + + + coordinates = zip(lat,lon) + + scoordinates = "[" + + for x,y in coordinates: + scoordinates += """[{x},{y}], + """.format( + x=x, + y=y + ) + + scoordinates += "]" + + script = """ + + """.format( + latmean=latmean, + lonmean=lonmean, + latbegin = latbegin, + latend=latend, + longbegin=longbegin, + longend=longend, + scoordinates=scoordinates, + ) + + div = """ +

 

+ """ + + + return script,div def leaflet_chart2(lat,lon,name=""): @@ -5057,13 +5198,11 @@ def interactive_multiple_compare_chart(ids,xparam,yparam,plottype='line', 'time','pace','workoutstate', 'workoutid'] - datadf = dataprep.getsmallrowdata_db(columns,ids=ids,doclean=False,compute=False) - + datadf = dataprep.getsmallrowdata_db(columns,ids=ids) datadf.dropna(axis=1,how='all',inplace=True) datadf.dropna(axis=0,how='any',inplace=True) - nrworkouts = len(ids) try: diff --git a/rowers/models.py b/rowers/models.py index 6e57bfaa..c7cbf391 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2920,7 +2920,8 @@ def update_duplicates_on_delete(sender, instance, **kwargs): class VirtualRaceFollower(models.Model): user = models.ForeignKey(User,on_delete=models.CASCADE,null=True) race = models.ForeignKey(VirtualRace,on_delete=models.CASCADE) - emailaddress = models.EmailField(max_length=254,blank=True,null=True) + emailaddress = models.EmailField(max_length=254,blank=True,null=True, + verbose_name="Email Address") class FollowerForm(ModelForm): class Meta: diff --git a/rowers/templates/followerform.html b/rowers/templates/followerform.html index 248e2d04..15b2231c 100644 --- a/rowers/templates/followerform.html +++ b/rowers/templates/followerform.html @@ -9,9 +9,14 @@ {% block main %} -

Comments {{ plannedession.name }}

+

Follow {{ plannedession.name }}

+
    +
  • +

    To follow this challenge and receive all news per email, fill out your + email address and submit the form. +

  • diff --git a/rowers/templates/virtualevent.html b/rowers/templates/virtualevent.html index 47debfd0..86e61402 100644 --- a/rowers/templates/virtualevent.html +++ b/rowers/templates/virtualevent.html @@ -167,7 +167,9 @@ {% else %}

    Register

    {% endif %} + {% if request.user|isfollower:race.id %}

    Follow this challenge

    + {% endif %}

    {% else %}

    @@ -186,7 +188,9 @@ {% else %}

    Register

    {% endif %} + {% if request.user|isfollower:race.id %}

    Follow this challenge

    + {% endif %}

    {% endif %} {% if button == 'submitbutton' %} diff --git a/rowers/templatetags/rowerfilters.py b/rowers/templatetags/rowerfilters.py index 84b5c947..6a60d032 100644 --- a/rowers/templatetags/rowerfilters.py +++ b/rowers/templatetags/rowerfilters.py @@ -12,7 +12,8 @@ from rowers.utils import calculate_age from rowers.models import ( course_length,WorkoutComment, TrainingMacroCycle,TrainingMesoCycle, TrainingMicroCycle, - Rower,Workout,SiteAnnouncement, TeamInvite, TeamRequest, CoachOffer,CoachRequest + Rower,Workout,SiteAnnouncement, TeamInvite, TeamRequest, CoachOffer,CoachRequest, + VirtualRaceFollower,VirtualRace, ) from rowers.plannedsessions import ( race_can_register, race_can_submit,race_rower_status @@ -40,6 +41,21 @@ from django.template.defaultfilters import stringfilter from six import string_types +@register.filter +def isfollower(user,id): + + if user.is_anonymous: + return True + try: + race = VirtualRace.objects.get(id=id) + except VirtualRace.DoesNotExist: + return False + + followers = VirtualRaceFollower.objects.filter(race=race,user=user) + + + return followers.count()==0 + @register.filter def adaptive(s): u = s diff --git a/rowers/views/racesviews.py b/rowers/views/racesviews.py index d58d1379..09a11a5c 100644 --- a/rowers/views/racesviews.py +++ b/rowers/views/racesviews.py @@ -1625,6 +1625,39 @@ def virtualevent_addboat_view(request,id=0): "You have successfully registered for this race. Good luck!" ) + otherrecords = VirtualRaceResult.objects.filter( + race = race).exclude(userid = r.id) + + for otherrecord in otherrecords: + otheruser = Rower.objects.get(id=otherrecord.userid) + othername = otheruser.user.first_name+' '+otheruser.user.last_name + registeredname = r.user.first_name+' '+r.user.last_name + if otherrecord.emailnotifications: + job = myqueue( + queue, + handle_sendemail_raceregistration, + otheruser.user.email, othername, + registeredname, + race.name, + race.id + ) + + followers = VirtualRaceFollower.objects.filter(race = race) + + for follower in followers: + othername = '' + if follower.user: + othername = follower.user.first_name+' '+follower.user.last_name + + registeredname = r.user.first_name+' '+r.user.last_name + email = follower.emailaddress + job = myqueue( + queue, + handle_sendemail_raceregistration, + email, othername, + registeredname,race.name,race.id, + ) + url = reverse('virtualevent_view', kwargs = { 'id':race.id @@ -1804,7 +1837,12 @@ def virtualevent_register_view(request,id=0): add_rower_race(r,race) - otherrecords = IndoorVirtualRaceResult.objects.filter( + # remove followers + myfollows = VirtualRaceFollower.objects.filter(user=r.user,race=race) + for f in myfollows: + f.delete() + + otherrecords = VirtualRaceResult.objects.filter( race = race).exclude(userid = r.id) for otherrecord in otherrecords: @@ -1821,6 +1859,22 @@ def virtualevent_register_view(request,id=0): race.id ) + followers = VirtualRaceFollower.objects.filter(race = race) + + for follower in followers: + othername = '' + if follower.user: + othername = follower.user.first_name+' '+follower.user.last_name + + registeredname = r.user.first_name+' '+r.user.last_name + email = follower.emailaddress + job = myqueue( + queue, + handle_sendemail_raceregistration, + email, othername, + registeredname,race.name,race.id, + ) + messages.info( request, @@ -2039,6 +2093,11 @@ def indoorvirtualevent_register_view(request,id=0): add_rower_race(r,race) + # remove followers + myfollows = VirtualRaceFollower.objects.filter(user=r.user,race=race) + for f in myfollows: + f.delete() + otherrecords = IndoorVirtualRaceResult.objects.filter( race = race).exclude(userid = r.id) @@ -2056,6 +2115,22 @@ def indoorvirtualevent_register_view(request,id=0): race.id ) + followers = VirtualRaceFollower.objects.filter(race = race) + + for follower in followers: + othername = '' + if follower.user: + othername = follower.user.first_name+' '+follower.user.last_name + + registeredname = r.user.first_name+' '+r.user.last_name + email = follower.emailaddress + job = myqueue( + queue, + handle_sendemail_raceregistration, + email, othername, + registeredname,race.name,race.id, + ) + messages.info( request,