Giter Club home page Giter Club logo

skala3ma's Introduction

SKALA3MA

Application to manage climbing gym routes, your daily climbing progress and competitions.

https://skala3ma.com

logo

Features:

  • Add and edit gym with logo, address, URL
  • Add and edit multiple route sets
  • Add and edit activities and mark each ascent as complete, flash or incomplete with a comment
  • View graph of activities
  • Create a competition with a poster
  • Public competition registration link
  • Easy route entry during competition
  • Instant scoring and downloadable CSV results
  • Multi-language
  • Google and Facebook logins
  • Printable route page for gyms

Technologies used

logo

Development environment setup

The following instructions are for local development.

Minimum version of Python is 3.7. You will need to have either Google or Facebook developer account and add the app there to enable local authentication.

  1. Create certificate and key files:
 openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem
  1. Create Python Virtual Environment
  python -m venv .venv
  1. Enter Virtual Environment
  source .venv/bin/activate
  1. Install the requirements
  pip install -r requirements.txt
  1. Modify the .env file to set the correct values
  DATA_DIRECTORY=<path to the data directory>
  GOOGLE_CLIENT_ID=<your Google client id>
  GOOGLE_CLIENT_SECRET=<your Google client secret>
  FACEBOOK_CLIENT_ID=<facebook client id>
  FACEBOOK_CLIENT_SECRET=<facebook client secret>
  GODMODE=true

DATA_DIRECTORY can be relative but must exist. If omitted the system will create db and uploads directories in the current working directory.

See how to create your Google client ID and secret at https://developers.google.com/identity/protocols/oauth2?hl=en

To create your facebook client head to Meta console: https://developers.facebook.com/

You will need to create your development account and create a new app there. Add Facebook login product and add your URL to the redirect list of URLS: https://localhost:5000/facebook/auth

  1. Run the server
  python server.py

You can also run the server using gunicorn:

  gunicorn --timeout 60 --limit-request-line 0 --limit-request-field_size 0 -b :5000 --keyfile=key.pem --certfile=cert.pem  -c app.py server:app
  1. Using your favorite browser go to https://localhost:5000/

  2. The first user that logs in will be given all permissions to create gyms, competitions, etc. This user is assumed to be a full admin. This functionality is independent of the GODMODE setting in .env file. Setting GODMODE=true in .env file will make every user a full admin. This is what happens on skala3ma-develop.onrender.com site where we do beta tests.

  3. The application starts completely empty so to do any tests you will need to:

  • create a gym
  • create a competition
  • sign up yourself for the competition
  • logout and sign up some anonymous users
  • manage the state of competition through admin console

We will try to provide a test database that will have a good set of working data soon.

skala3ma's People

Contributors

davidtayloryangg avatar dependabot[bot] avatar dmossakowski avatar hamidrezasz avatar scorreia avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

skala3ma's Issues

Create a Calendar with the competitions of the season

Add a page to display the list of competitions of a given season in a calendar.
This could become the official calendar if all clubs create their competition at the beginning of the season.

The admin of the competition must have the ability to change the date or delete the competition (when it's in the created status).

Scripts to compute challenge results

scripts that can help to compute the challenge results from a set of competitions.

Ideally, these scripts will be integrated into the application thanks to #40

Create a video/screencast showing main features of the app (in French)

We have documentation but we need a microvideo walkthrough showing major points of the app. The scenario might be as follows:

  • create new gym (name, icon, address, number of routes..)
  • show editing of routes; mention that the interface works well on mobile
    • show how to add a new route
    • show how to delete a route
  • show the batch route editing screen
  • show how to copy routeset into another routeset for an upcoming competition
  • modify the routeset in the batch mode to only leave routes needed for a competition
  • create a new competition and choose the newly created routeset
  • set the competition to be opened
  • show how it's using a different routset than the main gym

There are many apps that help with screen videos:

https://scribehow.com/features
https://www.tango.us/
https://www.screencastify.com/

Ideally we could add this video on the home page of the app.

Feature to unsubscribe to a competition

Right now, we cannot unsubscribe to a competition and we cannot contact the organizer.
Users should be able to unsubscribe easily.

Ideally, the admin should get a notification (email? notification when connecting?...)
so that they can contact the users on the waiting list.

We could think to update automatically the status of the first user on the waiting list, but we need to notify them if we do that.

Feature: Allow admin to validate the climber on D-day

On the day of the competition, the organizer will usually check that each climber is subscribed.
It would be useful to have a checkbox for that in the administration panel.
The checkbox would indicate whether the climber is present or absent on the day of the competition.

Having this information will help to remove automatically all absent climbers from the results computation.

Error to manage when trying to create a competition without any existing gym

Start the application for the very time (no data created)
Login and create a new competition (without having first created a gym).

then, we get this error:
Traceback (most recent call last):
File "/Users/scorreia/devel/git/skala3ma/.venv/lib/python3.11/site-packages/flask/app.py", line 2463, in call
return self.wsgi_app(environ, start_response)
File "/Users/scorreia/devel/git/skala3ma/.venv/lib/python3.11/site-packages/flask/app.py", line 2449, in wsgi_app
response = self.handle_exception(e)
File "/Users/scorreia/devel/git/skala3ma/.venv/lib/python3.11/site-packages/flask/app.py", line 1866, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/scorreia/devel/git/skala3ma/.venv/lib/python3.11/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/scorreia/devel/git/skala3ma/.venv/lib/python3.11/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/Users/scorreia/devel/git/skala3ma/.venv/lib/python3.11/site-packages/flask/app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/scorreia/devel/git/skala3ma/.venv/lib/python3.11/site-packages/flask/app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/scorreia/devel/git/skala3ma/.venv/lib/python3.11/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/scorreia/devel/git/skala3ma/.venv/lib/python3.11/site-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/scorreia/devel/git/skala3ma/.venv/lib/python3.11/site-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functionsrule.endpoint
File "/Users/scorreia/devel/git/skala3ma/competitionsApp.py", line 163, in decorated_function
return fn(*args, **kwargs)
File "/Users/scorreia/devel/git/skala3ma/competitionsApp.py", line 693, in new_competition_post
competitionId = competitionsEngine.addCompetition(None, name, date, routesid, max_participants)
File "/Users/scorreia/devel/git/skala3ma/competitionsEngine.py", line 149, in addCompetition
competition = {"id": compId, "name": name, "date": date, "gym": gym['name'],"gym_id":gym['id'],

GDPR compliance

  1. Add information about the usage of the data when the user register to a competition
  2. Add a checkbox so the user can refuse the use of their data, and add a text box so the user motivates their opposition

CNIL says:

les structures sportives peuvent publier les résultats sportifs des licenciés en ligne sous réserve
du respect de certaines conditions lors de la collecte des informations :
• la personne concernée a été informée de la publication de ses résultats en ligne ;
• elle peut s’opposer à cette publication de manière simple (ex. : une case à cocher mise à sa dispo-
sition sur le formulaire de participation à une compétition sportive), en faisant valoir une situation
particulière le justifiant.

Ability to group competitions by challenge.

At some point, if we want to be able to distinguish competitions that are part of the FSGT challenge from other competitions internal to each gym, we need a way to group competitions together.
This will help later to filter by challenge (say "Challenge IDF Saison 2023", "Nanterre CarnaGrimpe"...).
This will also help to count the statistics of the challenge (best gym, best climbers of the season,...)

Feature: ability to delete a list of routes from a gym

There are now many lists of routes in the Nanterre gym.
We should probably delete some of them.

When deleting a list of route, this should not impact past activities (maybe, we simply deactivate the list of routes and hide it everywhere if we cannot delete it easily).

Create images table in db and allow adding competition image

sqlite like other dbs supports blob type that can store images, we store images currently as files in a separate directory but this is not as efficient as db and actually might be less performant

to test db solution, add ability to upload competition poster to the competition

display the poster in thumbnail for each competition

Activity timeline is in reverse order

Screenshot 2024-02-01 at 00 18 06 The timeline is from right to left, which is unusual. We should probably change it to the usual order: from left to right (most recent date to the right).

And the below list could be in reverse order as well: showing the most recent activity first.
Screenshot 2024-02-01 at 00 26 27

Add printable view of routes that can be cut and placed at the foot of the routes

To inform climbers of the route details (mainly difficulty) we need to post some information at the foot of the routes. This can be done in variety of ways. Some gyms have one frame that fits a paper where only one route is described. The paper could describe more than one route surely.

We should offer a printable view of the routes that could be cut into smaller pieces and affixed next to the routes. Possibly we could offer different layouts (table, disc, etc.)

IMG_4696

Add sector

A gym is often split in several sectors.
A sector can contain several lines.

Enable edition of participants attributes until the competition is "in progress"

A participant could have made errors when subscribing (wrong club, wrong category).
The admin should be able to modify that.
This could be done when you edit the competition: here we can access to the list of participants. It's possible to remove a participant, but it would be nice if we could also edit the participants information (name, mail, category, ...)

Feature to contact organizer of a competition

Sometimes, people want to contact the organizer (to ask questions, cancel a registration, ...)
Add a form to contact the organizer of a competition (or simply a mailto field) in the competition page.

Split adult and teenager competition

When creating a competition, the admin user must choose whether it's an adult or a teenager competition.
The difference between the 2 competitions is the list of categories.
For adult competitions, the categories are:

Séniors 16-49ans
Titane 50-64ans
Diamant 65ans et +

For teenager competitions, the categories are:

ADOs 12-13 ans
ADOs 14-15 ans
ADOs 16-17 ans

Fix the gym pdf generated from phone

When printing the gym's routes from an Android phone, it looks like this:
1705352264775

It's not the same layout as when generated from the computer and it is useless to print it like this.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.