TODO
- DONE: don't use root for uwsgi
- DONE: send booking update mail
- DONE: get floating ip of the jumphost and include it in booking update mail
- DONE: update booking heat_stack_name, engine_version, stack_version, scenario_version, scenario_deploy_log_url
- DONE: enable authentication for nolabs/api endpoints
- DONE: enable password length validation in registration
- DONE: do not use ENUM for user roles
- DONE: return role in api/users
- DONE: enable functional users to update booking details via api
- DONE: limit max booking to 1 - check if there is an active booking and do not allow booking of new one
- DONE: make booking page colorful based on booking status
- DONE: routes and pages
- DONE: use flask-markdown
- DONE: update welcome mail and include link to confirm mail address and more info
- DONE: create separate jenkins jobs for test and production
- DONE: use booking_status table
- DONE: fix user_last_seen -> last_logged_in
- DONE: hide statistics
- DONE: ensure columns have the right properties in DB
- DONE: send new user registration mails to admins
- DONE: check why newbooking is allowed if ssh key deleted after it gets added the first time
- introduce userstatus table and relationship
- check why error flashed after the first ssh key registration
- configure jenkins jobs for handle and delete booking
- document functions inline
- introduce unit tests
- send failure mails in postbuild job to admins
- move NOLABS_ADMINS to .env
- get stacks and scenarios from DB dynamically
- use threading for sending mails
- include labs@lists.nordix.org in confirmation mail
- add checkbox for accepting Terms and Conditions
- look into adding javascript for dynamic stack/scenario list using Bootstrap components https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xx-some-javascript-magic
- look into python rq and redis for long running background tasks https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xxii-background-jobs
- enable prolonging a booking