diff --git a/rowers/forms.py b/rowers/forms.py index 27bc35bc..1ee14629 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -251,7 +251,8 @@ class HistorySelectForm(forms.Form): metricchoices = ( ("time","duration"), ("TRIMP","trimp"), - ("rScore","rscore") + ("rScore","rscore"), + ("distance","distance") ) yaxis = forms.ChoiceField(initial='time',choices=metricchoices,label="Measure by") diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 04d65b3d..809ebc2c 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -683,7 +683,7 @@ def interactive_activitychart2(workouts,startdate,enddate,stack='type',toolbar_l rscores = [] trimps = [] links = [] - + distances = [] rowersinitials = {} seen = ['seen'] @@ -719,6 +719,7 @@ def interactive_activitychart2(workouts,startdate,enddate,stack='type',toolbar_l du = w.duration.hour*60+w.duration.minute trimp = w.trimp rscore = w.rscore + distance = w.distance if rscore == 0: # pragma: no cover rscore = w.hrtss @@ -731,6 +732,7 @@ def interactive_activitychart2(workouts,startdate,enddate,stack='type',toolbar_l durations.append(du) trimps.append(trimp) rscores.append(rscore) + distances.append(distance) links.append( "{siteurl}/rowers/workout/{code}/".format( siteurl = settings.SITE_URL, @@ -769,6 +771,7 @@ def interactive_activitychart2(workouts,startdate,enddate,stack='type',toolbar_l durations.append(0) trimps.append(0) rscores.append(0) + distances.append(0) links.append('') types.append('rower') @@ -791,6 +794,7 @@ def interactive_activitychart2(workouts,startdate,enddate,stack='type',toolbar_l 'rscore':rscores, 'type':types, 'rower':rowers, + 'distance':distances, 'link':links, } @@ -805,9 +809,15 @@ def interactive_activitychart2(workouts,startdate,enddate,stack='type',toolbar_l elif yaxis == 'TRIMP': df.drop('duration',inplace=True,axis='columns') df.drop('rscore',inplace=True,axis='columns') + df.drop('distance',inplace=True, axis='columns') elif yaxis == 'rScore': # pragma: no cover df.drop('duration',inplace=True,axis='columns') df.drop('trimp',inplace=True,axis='columns' ) + df.drop('distance',inplace=True, axis='columns') + elif yaxis == 'distance': + df.drop('duration',inplace=True,axis='columns') + df.drop('trimp', inplace=True,axis='columns') + df.drop('rscore',inplace=True,axis='columns') df['color'] = df['type'].apply(lambda x:mapcolors(x)) @@ -848,9 +858,13 @@ def interactive_activitychart2(workouts,startdate,enddate,stack='type',toolbar_l p.yaxis.axis_label = 'Duration (h)' elif yaxis == 'TRIMP': p.yaxis.axis_label = 'TRIMP' + elif yaxis == 'distance': + p.yaxis.axis_label = 'Distance (m)' else: # pragma: no cover p.yaxis.axis_label = 'rScore' + + p.plot_width=550 diff --git a/rowers/models.py b/rowers/models.py index 5db49f02..1659f849 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -520,7 +520,7 @@ class TeamRequest(models.Model): from rowers.utils import ( workflowleftpanel,workflowmiddlepanel, - defaultleft,defaultmiddle,landingpages, + defaultleft,defaultmiddle,landingpages,landingpages2, steps_read_fit, steps_write_fit, ps_dict_order ) @@ -993,6 +993,10 @@ class Rower(models.Model): max_length=200, choices=landingpages, verbose_name="Default Landing Page") + defaultlandingpage2 = models.CharField(default='workout_flexchart_stacked_view', + max_length=200, + choices=landingpages2, + verbose_name="Alternative Landing Page") # Access tokens c2token = models.CharField(default='',max_length=200,blank=True,null=True) @@ -4280,6 +4284,7 @@ class AccountRowerForm(ModelForm): 'fav_analysis', 'usersmooth', 'defaultlandingpage', + 'defaultlandingpage2', 'offercoaching','autojoin','emailalternatives'] widgets = { diff --git a/rowers/templates/list_workouts.html b/rowers/templates/list_workouts.html index bb67af4b..690a7e50 100644 --- a/rowers/templates/list_workouts.html +++ b/rowers/templates/list_workouts.html @@ -35,46 +35,7 @@
    -
  • -

    - Total meters: {{ totalmeters }}. Total time {{ totalhours }}:{{ totalminutes }}h. - Dig deeper. -

    -

    - Activity chart by - TRIMP, - rScore, - Time. -

    - - - - - - {{ interactiveplot |safe }} - - {{ the_div |safe }} -
  • -
  • -

    Filter on date -

    - - {{ dateform.as_table }} -
    - {% csrf_token %} -

    -

    and keyword

    -

    - {{ searchform }} -

    -

    - -

    -

    -

    -

    +

  • {% if workouts.has_previous %} {% if request.GET.q %} @@ -118,7 +79,6 @@ {% endif %} {% endif %} -

  • {% if workouts %} @@ -137,7 +97,7 @@ {% endif %}
    -
    +
    {% with workout.workouttype|icon|safe as templateName %} {% include templateName %} {% endwith %} @@ -154,8 +114,25 @@ {% if workout|may_edit:request %} - + title="{{ rower.defaultlandingpage|verbose }}"> + + {% else %} +   + {% endif %} +
    +
    + {% if workout|may_edit:request %} + {% if rower.defaultlandingpage2 != 'workout_delete' %} + + + {% else %} + + + {% endif %} {% else %}   {% endif %} @@ -168,6 +145,45 @@ {% else %}
  • No workouts found
  • {% endif %} +
  • +

    Filter on date +

    + + {{ dateform.as_table }} +
    + {% csrf_token %} +

    +

    and keyword

    +

    + {{ searchform }} +

    +

    + +

    +

    +
  • +
  • +

    + Total meters: {{ totalmeters }}. Total time {{ totalhours }}:{{ totalminutes }}h. + Dig deeper. +

    +

    + Activity chart by + TRIMP, + rScore, + Time. +

    + + + + + + {{ interactiveplot |safe }} + + {{ the_div |safe }} +
  • {% if announcements %}
  • What's New?

    diff --git a/rowers/templates/menu_workouts.html b/rowers/templates/menu_workouts.html index 24c0bc8f..45778dc5 100644 --- a/rowers/templates/menu_workouts.html +++ b/rowers/templates/menu_workouts.html @@ -8,6 +8,11 @@
  •  Charts
  • +
  • + +  History + +
  • {% if team %} diff --git a/rowers/templatetags/rowerfilters.py b/rowers/templatetags/rowerfilters.py index 57db8e3b..43173126 100644 --- a/rowers/templatetags/rowerfilters.py +++ b/rowers/templatetags/rowerfilters.py @@ -27,7 +27,7 @@ from rowers.mytypes import ( otwtypes,adaptivetypes,sexcategories,weightcategories,workouttypes, workouttypes_icons, ) -from rowers.utils import NoTokenError, step_to_string +from rowers.utils import NoTokenError, step_to_string, landingpages2 import rowers.payments as payments @@ -72,16 +72,29 @@ favanalysisdict = {} for key,value in favanalysischoices: favanalysisdict[key] = value -favanalysisicons = { - 'compare':'fa-balance-scale', - 'stats':'fa-table', - 'boxplot':'fa-box-open', - 'trendflex':'fa-chart-line', - 'histogram':'fa-chart-bar', - 'flexall':'fa-chart-line', - 'cp':'fa-user-chart', +landingpagedict = {} +for key, value in landingpages2: + landingpagedict[key] = value + +landingpageicons = { + 'workout_view':'fas fa-search fa-fw', + 'workout_edit_view':'fas fa-pencil-alt fa-fw', + 'workout_workflow_view':'fas fa-tachometer-alt fa-fw', + 'workout_stats_view':'fal fa-table fa-fw', + 'workout_data_view':'fal fa-table fa-fw', + 'workout_summary_edit_view':'fas fa-pause fa-fw', + 'workout_flexchart_stacked_view':'fas fa-align-justify fa-fw', + 'workout_flexchart3_view':'fas fa-chart-line fa-fw', + 'workout_delete':'fas fa-trash-alt fa-fw' } +@register.filter +def landingicon(landingpage): + try: + return landingpageicons[landingpage] + except KeyError: + return 'fas fa-search fa-fw' + @register.filter def steptostring(steps): res = ps_dict_get_description_html(steps,short=True) @@ -91,16 +104,9 @@ def steptostring(steps): @register.filter def verbose(s): try: - return favanalysisdict[s] + return landingpagedict[s] except KeyError: # pragma: no cover - return '' - -@register.filter -def icon(s): - try: - return favanalysisicons[s] - except KeyError: # pragma: no cover - return 'fa-chart-line' + return 'Details' @register.filter def datarows(data): # pragma: no cover diff --git a/rowers/tests/test_user.py b/rowers/tests/test_user.py index cf604395..b79d6fa7 100644 --- a/rowers/tests/test_user.py +++ b/rowers/tests/test_user.py @@ -116,6 +116,7 @@ class UserPreferencesTest(TestCase): 'fav_analysis':'compare', 'usersmooth':2, 'defaultlandingpage':'workout_edit_view', + 'defaultlandingpage2':'workout_delete', 'first_name': self.u.first_name, 'last_name': self.u.last_name, 'email':self.u.email diff --git a/rowers/utils.py b/rowers/utils.py index 596fc4ff..e03d405e 100644 --- a/rowers/utils.py +++ b/rowers/utils.py @@ -46,6 +46,19 @@ landingpages = ( ('workout_flexchart3_view','Workout Flex Chart') ) +landingpages2 = ( + ('workout_view', 'Workout View'), + ('workout_edit_view','Edit View'), + ('workout_workflow_view','Workflow View'), + ('workout_stats_view','Stats View'), + ('workout_data_view','Data Explore View'), + ('workout_summary_edit_view','Intervals Editor'), + ('workout_flexchart_stacked_view','Workout Stacked Chart'), + ('workout_flexchart3_view','Workout Flex Chart'), + ('workout_delete','Remove Workout') +) + + workflowmiddlepanel = ( diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index 6b1b234a..4504fd6c 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -2336,6 +2336,7 @@ def history_view(request,userid=0): wminutes=wminutes, wseconds=wseconds, ) + ddict['distance'] = wmeters ddict['nrworkouts'] = a_workouts.count() listofdicts.append(ddict) @@ -2439,9 +2440,11 @@ def history_view_data(request,userid=0): yaxis = request.GET.get('yaxis','duration') - if yaxis.lower() not in ['duration','rscore','trimp']: # pragma: no cover + + if yaxis.lower() not in ['duration','rscore','trimp','distance']: # pragma: no cover yaxis = 'duration' + g_workouts = Workout.objects.filter( user=r, startdatetime__gte=activity_startdate, @@ -2535,9 +2538,11 @@ def history_view_data(request,userid=0): totalsdict['nrworkouts'] = g_workouts.count() + # activity chart activity_script, activity_div = interactive_activitychart2(g_workouts,startdate,enddate,yaxis=yaxis) + # interactive hr pie chart if typeselect == 'All': totalseconds = 3600*totalhours+60*totalminutes+totalseconds diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index 95a477e9..887ace01 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -1981,7 +1981,7 @@ def workouts_view(request,message='',successmessage='', else: searchform = SearchForm() - paginator = Paginator(workouts,10) # show 25 workouts per page + paginator = Paginator(workouts,12) # show 25 workouts per page page = request.GET.get('page',1) try: diff --git a/static/css/rowsandall2.css b/static/css/rowsandall2.css index 62e92d7d..fa84ba80 100644 --- a/static/css/rowsandall2.css +++ b/static/css/rowsandall2.css @@ -328,20 +328,28 @@ th.rotate > div > span { border-width: 1px 0 0 0; border-color: #333 #333 #333 #333; border-style: solid; - padding: 2px; + padding: 0px; margin: 0px; } .workoutcontainer { display: grid; - grid-template-columns: 50px repeat(auto-fit, minmax(calc((100% - 100px)/4), 1fr)); + grid-template-columns: 50px repeat(auto-fit, minmax(calc((100% - 100px)/5), 1fr)); /* grid-template-columns: 50px repeat(auto-fit, minmax(100px, 1fr)) 50px; ????*/ padding: 5px; + margin: 0px; } .workoutelement { margin-left: auto; margin-right: auto; + padding: 0px; + margin: 0px; +} + +.icondiv { + padding: 0px; + margin: 0px; } .divlines h3 {