From a2ef4491bc297292fd3377480c1afaf7d9c3e072 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 3 Jan 2020 13:42:42 +0100 Subject: [PATCH 1/8] broken Dockerfile again --- Dockerfile | 12 +++++++----- init.sh | 7 +++++++ 2 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 init.sh diff --git a/Dockerfile b/Dockerfile index 26847963..cdcd8290 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,16 @@ FROM debian +RUN mkdir /srv/app +RUN mkdir /srv/venv RUN apt-get update RUN apt-get install -y default-libmysqlclient-dev gcc RUN apt-get install -y postgresql postgresql-contrib libpq-dev python-psycopg2 RUN apt-get update && apt-get install \ -y --no-install-recommends python3 python3-virtualenv python3-dev RUN apt-get update && apt-get install libssl-dev -RUN python3 -m virtualenv --python=/usr/bin/python3 /opt/venv -COPY ./requirements.txt /usr/src/app/ -WORKDIR /usr/src/app/ -RUN . /opt/venv/bin/activate && pip install -r requirements.txt +RUN python3 -m virtualenv --python=/srv/venv/ +COPY ./requirements.txt /srv/app/ +WORKDIR /srv/app/ +RUN . /srv/venv/bin/activate && pip install -r requirements.txt COPY . . EXPOSE 8000 -CMD ["python", "./manage.py", "runserver"] +CMD ["init.sh"] diff --git a/init.sh b/init.sh new file mode 100644 index 00000000..c93635f0 --- /dev/null +++ b/init.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +source /srv/venv/bin/activate +cd /srv/app +python manage.py migrate +python manage.py collectstatic --noinput +python manage.py runserver From 95db75d4909314916a86988532f197ed66ab914b Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 3 Jan 2020 14:57:20 +0100 Subject: [PATCH 2/8] almost there - dockerizing --- Dockerfile | 15 +++------------ app.py | 8 ++++++++ 2 files changed, 11 insertions(+), 12 deletions(-) create mode 100644 app.py diff --git a/Dockerfile b/Dockerfile index cdcd8290..7512e062 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,7 @@ -FROM debian -RUN mkdir /srv/app -RUN mkdir /srv/venv -RUN apt-get update -RUN apt-get install -y default-libmysqlclient-dev gcc -RUN apt-get install -y postgresql postgresql-contrib libpq-dev python-psycopg2 -RUN apt-get update && apt-get install \ - -y --no-install-recommends python3 python3-virtualenv python3-dev -RUN apt-get update && apt-get install libssl-dev -RUN python3 -m virtualenv --python=/srv/venv/ +FROM rosti/python:3.6 COPY ./requirements.txt /srv/app/ WORKDIR /srv/app/ -RUN . /srv/venv/bin/activate && pip install -r requirements.txt +ENV VIRTUAL_ENV = /srv/venv +RUN /opt/python/bin/pip install -r /srv/app/requirements.txt COPY . . -EXPOSE 8000 CMD ["init.sh"] diff --git a/app.py b/app.py new file mode 100644 index 00000000..e3fbe54f --- /dev/null +++ b/app.py @@ -0,0 +1,8 @@ +#!/usr/bin/env python +import os +import sys + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "rowsandall_app.settings") +application = get_wsgi_application() + +#execute_from_command_line(sys.argv) From 348e0e209e4eee0876287a73e079f52bf5cdb024 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 3 Jan 2020 15:25:14 +0100 Subject: [PATCH 3/8] container sort of working --- Dockerfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 7512e062..d35cc5c4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,3 @@ FROM rosti/python:3.6 -COPY ./requirements.txt /srv/app/ WORKDIR /srv/app/ -ENV VIRTUAL_ENV = /srv/venv -RUN /opt/python/bin/pip install -r /srv/app/requirements.txt COPY . . -CMD ["init.sh"] From 73ff474ea88c180f9a8678f9a010892149aa75ff Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 3 Jan 2020 16:46:37 +0100 Subject: [PATCH 4/8] first version of mini player --- rowers/templates/embedded_video_mini.html | 681 ++++++++++++++++++++++ rowers/urls.py | 2 + rowers/views/workoutviews.py | 110 ++++ 3 files changed, 793 insertions(+) create mode 100644 rowers/templates/embedded_video_mini.html diff --git a/rowers/templates/embedded_video_mini.html b/rowers/templates/embedded_video_mini.html new file mode 100644 index 00000000..720e2794 --- /dev/null +++ b/rowers/templates/embedded_video_mini.html @@ -0,0 +1,681 @@ +{% extends "newbase.html" %} +{% load staticfiles %} +{% load rowerfilters %} +{% load i18n %} +{% load leaflet_tags %} + + + +{% block title %}Workout Video{% endblock %} +{% block og_title %}{{ analysis.name }}{% endblock %} +{% block description %}Rowing Video Analysis:{{ analysis.name }}{% endblock %} +{% block og_description %}Rowing Video Analysis:{{ analysis.name }}{% endblock %} +{% block og_image %} +{% if analysis %} + + +{% else %} + + +{% endif %} +{% endblock %} + +{% if analysis %} +{% block image_src %} + +{% endblock %} +{% endif %} + +{% block meta %} +{% leaflet_js %} +{% leaflet_css %} + + + + + + +{% endblock %} + +{% block main %} + + + +{% language 'en' %} +

Video Analysis for {{ workout.name }}

+
    +
  • +

    Playing the video will advance the data in synchronization. Use the regular + YouTube controls to move around in the video and play it.

    +
  • +
  • + + + Share + + + + + + + +
  • +
+
    +
  • +
    + {{ mapdiv | safe}} + +
    +
    + +
    +
    + +
  • +
  • +
    + +
  • +
  • + +
  • +
+

 

+
+
    +
  • + +
  • + +
  • +
      + {% if 'basic' in metricsgroups %} +
    • +
      +
    • +
    • +
      +
    • + {% endif %} + {% if 'forcepower' in metricsgroups %} +
    • +
      +
    • + {% endif %} + {% if 'athlete' in metricsgroups %} +
    • +
      +
    • + {% endif %} + {% if 'stroke' in metricsgroups %} + {% if workout.workouttype == 'water' %} +
    • +
      +
    • + {% endif %} + {% endif %} +
    +
  • +
+
+

 

+ + +{% endlanguage %} + +{% endblock %} + +{% block sidebar %} +{% include 'menu_workout.html' %} +{% endblock %} diff --git a/rowers/urls.py b/rowers/urls.py index 2a9c39d6..4940c251 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -348,6 +348,8 @@ urlpatterns = [ re_path(r'^video/(?P\d+)/delete/$',views.VideoDelete.as_view(),name='video_delete'), re_path(r'^video/(?P\w.+)/$',views.workout_video_view, name='workout_video_view'), + re_path(r'^video/(?P\w.+)/m$',views.workout_video_view_mini, + name='workout_video_view_mini'), re_path(r'^videos/',views.list_videos,name='list_videos'), re_path(r'^add-video/',views.video_selectworkout,name='video_selectworkout'), # re_path(r'^workout/(?P\d+)/$',views.workout_view,name='workout_view'), diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py index eea37716..b72db049 100644 --- a/rowers/views/workoutviews.py +++ b/rowers/views/workoutviews.py @@ -48,6 +48,116 @@ def get_video_id(url): else: raise ValueError +# Show a video compared with data +def workout_video_view_mini(request,id=''): + try: + id = encoder.decode_hex(id) + analysis = VideoAnalysis.objects.get(id=id) + except VideoAnalysis.DoesNotExist: + raise Http404("Video Analysis does not exist") + + w = analysis.workout + delay = analysis.delay + + if w.workouttype in mytypes.otwtypes: + mode = 'water' + else: + mode = 'erg' + + if request.user.is_authenticated: + mayedit = checkworkoutuser(request.user,w) and isprorower(request.user.rower) + rower = request.user.rower + else: + mayedit = False + rower = None + + # get video ID and offset + if mayedit and request.method == 'POST': + form = VideoAnalysisCreateForm(request.POST) + metricsform = VideoAnalysisMetricsForm(request.POST,mode=mode) + if form.is_valid() and metricsform.is_valid(): + video_id = form.cleaned_data['url'] + try: + video_id = get_video_id(form.cleaned_data['url']) + except (TypeError,ValueError): + pass + delay = form.cleaned_data['delay'] + metricsgroups = metricsform.cleaned_data['groups'] + if 'save_button' in request.POST: + analysis.name = form.cleaned_data['name'] + analysis.video_id = video_id + analysis.delay = delay + analysis.metricsgroups = metricsgroups + analysis.save() + else: + video_id = id + delay = 0 + elif mayedit: + form = VideoAnalysisCreateForm( + initial = { + 'name':analysis.name, + 'delay': analysis.delay, + 'url': analysis.video_id, + } + ) + metricsform = VideoAnalysisMetricsForm(initial={'groups':analysis.metricsgroups}, + mode=mode) + metricsgroups = analysis.metricsgroups + video_id = analysis.video_id + else: + form = None + metricsform = None + metricsgroups = analysis.metricsgroups + + data, metrics, maxtime = dataprep.get_video_data(w,groups=metricsgroups,mode=mode) + hascoordinates = pd.Series(data['latitude']).std() > 0 + # create map + if hascoordinates: + mapscript, mapdiv = leaflet_chart_video(data['latitude'],data['longitude'], + w.name) + else: + mapscript, mapdiv = interactive_chart_video(data) + data['longitude'] = data['spm'] + data['latitude'] = list(range(len(data['spm']))) + + + breadcrumbs = [ + { + 'url':'/rowers/list-workouts/', + 'name':'Workouts' + }, + { + 'url':get_workout_default_page(request,encoder.encode_hex(w.id)), + 'name': w.name + }, + { + 'url':reverse('workout_video_view',kwargs={'id':encoder.encode_hex(analysis.id)}), + 'name': 'Video Analysis' + } + + ] + + + return render(request, + 'embedded_video_mini.html', + { + 'workout':w, + 'rower':rower, + 'data': json.dumps(data,default=default), + 'mapscript': mapscript, + 'mapdiv': mapdiv, + 'video_id': analysis.video_id, + 'form':form, + 'breadcrumbs':breadcrumbs, + 'analysis':analysis, + 'maxtime':maxtime, + 'metrics':metrics, + 'locked': True, + 'metricsform':metricsform, + 'metricsgroups': metricsgroups, + 'siteurl': settings.SITE_URL, + }) + # Show a video compared with data def workout_video_view(request,id=''): From 1e6a42d9678d3ba138e60fd51decb131bd5c4469 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 3 Jan 2020 17:00:48 +0100 Subject: [PATCH 5/8] added mini viewer --- app.py | 2 ++ rowers/templates/embedded_video.html | 10 ++++++++++ rowers/templates/embedded_video_mini.html | 1 + 3 files changed, 13 insertions(+) diff --git a/app.py b/app.py index e3fbe54f..2672ad59 100644 --- a/app.py +++ b/app.py @@ -3,6 +3,8 @@ import os import sys os.environ.setdefault("DJANGO_SETTINGS_MODULE", "rowsandall_app.settings") + +from django.core.wsgi import get_wsgi_application application = get_wsgi_application() #execute_from_command_line(sys.argv) diff --git a/rowers/templates/embedded_video.html b/rowers/templates/embedded_video.html index 6bd67499..5543733b 100644 --- a/rowers/templates/embedded_video.html +++ b/rowers/templates/embedded_video.html @@ -40,6 +40,10 @@ $(this).removeAttr('disabled'); }); }); + document.getElementById("smallscreen").style.display = "none"; + if ($(window).width() <= 950) { + $("#smallscreen").show() + } }); + + + + + +{% endblock %} + +{% block main %} + + + +{% language 'en' %} +

Video Analysis for {{ workout.name }}

+
    +
  • +

    Playing the video will advance the data in synchronization. Use the regular + YouTube controls to move around in the video and play it.

    +
  • +
  • + + + Share + + + + + + + +
  • +
+
    +
  • +
    + {{ mapdiv | safe}} + +
    +
    + +
    +
    + +
  • +
  • +
    + +
  • +
  • + +
  • +
+

 

+
+
    +
  • + +
  • + +
  • +
      + {% if 'basic' in metricsgroups %} +
    • +
      +
    • +
    • +
      +
    • + {% endif %} + {% if 'forcepower' in metricsgroups %} +
    • +
      +
    • + {% endif %} + {% if 'athlete' in metricsgroups %} +
    • +
      +
    • + {% endif %} + {% if 'stroke' in metricsgroups %} + {% if workout.workouttype == 'water' %} +
    • +
      +
    • + {% endif %} + {% endif %} +
    +
  • +
+
+

 

+ + +{% endlanguage %} + +{% endblock %} + +{% block sidebar %} +{% include 'menu_workout.html' %} +{% endblock %} From 661febd67d3b1cc31203f98fe91e793391b73190 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 3 Jan 2020 17:16:37 +0100 Subject: [PATCH 8/8] releasing mini video --- rowers/urls.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rowers/urls.py b/rowers/urls.py index 4940c251..5696c0d4 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -346,10 +346,10 @@ urlpatterns = [ re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/video/$',views.workout_video_create_view, name='workout_video_create_view'), re_path(r'^video/(?P\d+)/delete/$',views.VideoDelete.as_view(),name='video_delete'), + re_path(r'^video/(?P\w.+)/m/$',views.workout_video_view_mini, + name='workout_video_view_mini'), re_path(r'^video/(?P\w.+)/$',views.workout_video_view, name='workout_video_view'), - re_path(r'^video/(?P\w.+)/m$',views.workout_video_view_mini, - name='workout_video_view_mini'), re_path(r'^videos/',views.list_videos,name='list_videos'), re_path(r'^add-video/',views.video_selectworkout,name='video_selectworkout'), # re_path(r'^workout/(?P\d+)/$',views.workout_view,name='workout_view'),