Store your GPX tracks of your running (or other sports activity) in django.
travis-ci.org/jedie/django-for-runners | |
codecov.io/gh/jedie/django-for-runners | |
coveralls.io/r/jedie/django-for-runners | |
landscape.io/github/jedie/django-for-runners/master |
(The name Django-ForRunners has the origin from the great Android tracking app ForRunners by Benoît Hervier: http://rvier.fr/#forrunners )
- GPX track management:
- Upload GPX tracks
- Import GPX tracks from commandline
- Track analysis:
- basics: Track length / Duration / Pace / Hart rate Up-/Downhill
- Display route on OpenStreetMap map
- Graphs with elevation / heart rate / cadence (if available in GPX data)
- Data that is automatically extracted from the web:
- Start/finish Address from OpenStreetMap
- Start/finish weather information from metaweather.com
- Store additional data:
- Ideal track distance (for easier grouping/filtering tracks)
- sports competitions Management:
- Create a List of Sport Events
- Add participation to a event
- link GPX track with a event participation
- Store you event participation:
- official track length
- measured finisher time
- Number of participants who have finished in your discipline
- Add links to webpages relatet to this event
- Record costs (entry fee, T-shirt etc.)
- Create a List of Sport Events
- common
- Multiple user support (However: no rights management and currently only suitable for a handful of users)
dependencies are:
- pip (Debian/Ubuntu package name: python3-pip)
- Download the file boot_django_for_runners.sh (right click and use "save under...")
- run boot_django_for_runners.sh
- double click on ~/Django-ForRunners/Django-ForRunners
- insert user name/password in terminal
All in one step, e.g.:
~$ bash <(curl -s https://raw.githubusercontent.com/jedie/django-for-runners/master/boot_django_for_runners.sh)
Just double click on ~/Django-ForRunners/Django-ForRunners in your file manager ;)
Or start by hand, e.g.:
~$ cd ~/Django-ForRunners/bin ~/Django-ForRunners/bin$ ./for_runners run-server
More details:
The shell script creates a python virtual environment and install all needed requirements into:
- ~/Django-ForRunners
The setup routine will install two commands:
- ~/Django-ForRunners/bin/for_runners - CLI to start the web server to use Django-ForRunners
- ~/Django-ForRunners/bin/manage - Run django manage commands with Django-ForRunners project settings
e.g.:
~$ cd Django-ForRunners/ ~/Django-ForRunners$ source bin/activate (Django-ForRunners) ~/Django-ForRunners$ for_runners --help ... (Django-ForRunners) ~/Django-ForRunners$ manage --help ...
$ createdb -E 'UTF8' -h localhost -p 5432 -U postgres runners_dev "Django for Runners" $ psql -h localhost -U postgres postgres postgres=# CREATE USER runner WITH ENCRYPTED PASSWORD 'plaintext pw generated by KeePass'; postgres=# \connect runners_dev postgres=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO runner; postgres=# \q
Setup environment variables:
source .env
Run (initial) database migration:
make migrate
Create first user:
python -m for_runners_project createsuperuser
Start development server:
make run
Alternative without using make:
export PYTHONPATH=. python for_runners_project/__main__.py runserver
TODO: Create shortcut (via pywin32?)
- Download the file boot_django_for_runners.cmd (right click and use "save under...")
- run boot_django_for_runners.cmd
The batch file creates a python virtual environment and install all needed requirements into:
- C:\Program Files\Django-ForRunners
Start the development server with the test project by double click on:
"C:\Program Files\Django-ForRunners\Scripts\for_runners.exe"
Just run for_runners update e.g.:
~$ cd Django-ForRunners/ ~/Django-ForRunners$ source bin/activate (Django-ForRunners) ~/Django-ForRunners$ for_runners update
e.g.:
~$ ~/Django-ForRunners/bin/manage import_gpx --username <django_username> ~/backups/gpx_files
Note: It is no problem to start import_gpx with the same GPX files: Duplicate entries are avoided. The start/finish (time/latitude/longitude) are compared.
Create a backup into DjangoForRunnersEnv/backups/<timestamp>/ e.g.:
~$ cd Django-ForRunners/ ~/Django-ForRunners$ source bin/activate (Django-ForRunners) ~/Django-ForRunners$ for_runners backup
The backup does:
- backup the database
- export all GPX tracks
- generate .csv files:
- a complete file with all running tracks
- one file for every user
~$ cd Django-ForRunners/ ~/Django-ForRunners$ source bin/activate (Django-ForRunners) ~/Django-ForRunners$ for_runners recreate-svg
(All screenshots are here: github.com/jedie/jedie.github.io/tree/master/screenshots/django-for-runners)
# activate the virtualenv: ~$ cd Django-ForRunners/ ~/Django-ForRunners$ source bin/activate # run the tests: (Django-ForRunners) ~/Django-ForRunners$ cd src/django-for-runners/ (Django-ForRunners) ~/Django-ForRunners/src/django-for-runners$ ./setup.py test # run text via tox: (Django-ForRunners) ~/Django-ForRunners/src/django-for-runners$ ./setup.py tox
Note:
To run all tests, you need:
- Chromium Browser WebDriver e.g.: apt install chromium-chromedriver
- Firefox Browser WebDriver aka geckodriver
install geckodriver e.g.:
~$ cd /tmp /tmp$ wget https://github.com/mozilla/geckodriver/releases/download/v0.20.1/geckodriver-v0.20.1-linux64.tar.gz -O geckodriver.tar.gz /tmp$ sudo sh -c 'tar -x geckodriver -zf geckodriver.tar.gz -O > /usr/bin/geckodriver' /tmp$ sudo chmod +x /usr/bin/geckodriver /tmp$ rm geckodriver.tar.gz /tmp$ geckodriver --version geckodriver 0.20.1 ...
Currently we store the unchanged GPX data in a TextField.
We collect some JavaScript files, for easier startup. These files are:
Project Homepage | License | storage directory |
---|---|---|
leafletjs.com | Leaflet licensed under BSD | for_runners/static/leaflet/ |
dygraphs.com | dygraphs licensed under MIT | for_runners/static/dygraphs/ |
chartjs.org | Chart.js licensed under MIT | for_runners/static/chartjs/ |
GPX files from Garmin (can) contain:
- latitude with 29 decimal places
- longitude with 28 decimal places
- elevation with 19 decimal places
The route on OpenStreetMap does not look more detailed, with more than 5 decimal places.
See also: https://wiki.openstreetmap.org/wiki/Precision_of_coordinates
django-for-runners | django version | python |
---|---|---|
>=v0.7.1 | 2.1 | 3.5, 3.6, 3.7 |
v0.5.x | 2.0 | 3.5, 3.6, 3.7 |
(See also combinations in .travis.yml and tox.ini)
~$ cd Django-ForRunners/ ~/Django-ForRunners$ source bin/activate (Django-ForRunners) ~/Django-ForRunners$ cd src/django-for-runners/ (Django-ForRunners) ~/Django-ForRunners/src/django-for-runners$ git pull origin master (Django-ForRunners) ~/Django-ForRunners/src/django-for-runners$ for_runners update
- The SQlite database was moved.
If you would like to migrate, move/rename this file
~/Django-ForRunners/src/django-for-runners/test_project_db.sqlite3
to:
~/Django-ForRunners/Django-ForRunners-database.sqlite3
- cli arguments changed with click v7.0: "_" -> "-", e.g.: "run_server" -> "run-server"
- compare v0.10.1...master dev
- refactor gpx import code
- tbc
- 09.08.2019 - v0.10.1:
- Enhance "Event Participation" admin view: Add start date and costs in table
- 26.06.2019 - v0.10.0:
- NEW: GPX Admin action to print a small overview from one or a few tracks
- Accept optional server bind address, e.g.: for_runners run-server 127.0.0.1:8080
- 02.04.2019 - v0.9.0:
- NEW: Update complete environment installation with: for_runners update
- Move the SQlite database to virtualenv root dir, e.g.: ~/Django-ForRunners/Django-ForRunners-database.sqlite3
- NEW: save every gpx track to disk
- NEW: Backup/export via cli: $ for_runners backup
- NEW: export GPX Data via django-import-export
- Create xdg-open desktop starter under linux here: ~/Django-ForRunners/Django-ForRunners
- refactor the startup process:
- auto loop the server process
- open web browser on first start
- enable autotask
- rename for_runners_test_project to for_runners_project
- 03.09.2018 - v0.8.1:
- Fix "try-out" section in README, again ;(
- 03.09.2018 - v0.8.0:
- NEW: shell script for easier boot/install, see above
- 02.09.2018 - v0.7.1:
- Update to Django 2.1
- Bugfix Tests
- 02.09.2018 - v0.7.0:
- Use dygraphs in GPX Track change admin view
- Sync mouse over from Elevation/Headrate/Cadence dygraphs to leaflet open streep map
- Fix "try-out" section in README (Thanks adsworth for reporting)
- Add links from gpx tracks to other admin change view
- Bugfixes
- internals:
- refactor stuff around track duration/length
- move manipluation of list_display and list_filter contributed by adsworth
- 19.07.2018 - v0.6.0:
- NEW: event participation
- NEW: costs of event participation (e.g.: entry fee for the competition, cost of a T-Shirt etc.)
- NEW: Display statistics of events/costs per user and total
- 04.07.2018 - v0.5.0:
- remove Django-CMS
- update to Django v2.0
- NOTE: The migrations are simply replaced! So you must delete your database, e.g.: src/django-for-runners$ rm test_project_db.sqlite3
- Add 'net duration' field, for the officially measured time and use it for calculations if available.
- Create django manage command to fill some base data: $ ./manage.py fill_basedata
- speedup by deactivating some django debug toolbar panels
- 26.06.2018 - v0.4.0:
- combine track filters with statistic views
- NEW: GPX info (See length, point count and Average distance in meters between the points)
- NEW: Display GPX metadata
- Add 'creator' to every track and use it as changelist filter
- remove Streetmap image generated via geotiler
- Speedup by using a cache for gpxpy instances
- 23.06.2018 - v0.3.0:
- Start adding statistics (See screenshot above)
- add weather information from metaweather.com to every track
- 21.06.2018 - v0.2.0:
- Display elevations, heart_rates and cadence_values if available
- Add kilometer markers to OpenStreetMap
- 15.06.2018 - v0.1.1:
- a few bugfixes
- 15.06.2018 - v0.1.0:
- Render interactive OpenStreetMap track map with Leaflet JS
- 12.06.2018 - v0.0.4:
- Better Events model
- GPX error handling
- more tests
- Bugfix for Python 3.5 (Geotiler needs Python 3.6 or later)
- 12.06.2018 - v0.0.3:
- display min/average/max heart rate
- use autotask to generate the MAP in background
- 31.05.2018 - v0.0.2:
- generate SVG 'icon' from GPX track
- v0.0.1 - 30.05.2018
- Just create a pre-alpha release to save the PyPi package name ;)
Homepage | http://github.com/jedie/django-for-runners |
PyPi | https://pypi.org/project/django-for-runners/ |
It's sometimes hard to find a working project for exporting activities. So here tools that i use currently:
- Garmin-Connect-Export from rsjrny
- https://github.com/pytrainer/pytrainer (Desktop Program)
- https://github.com/GoldenCheetah/GoldenCheetah/ (Desktop Program)
Online tools:
The whole thing is based on many excellent projects. Especially the following:
- gpxpy GPX file parser
- Leaflet JS A JS library for interactive maps used to render the track on OpenStreetMap
- dygraphs open source JavaScript charting library
- Chart.js HTML5 Charts
- geopy Get geo location names of the GPX track start/end point
- matplotlib plotting 2D graphics
- autotask schedule background jobs
- svgwrite Generating SVG file