From 1374f36a6a2f1aeb29bb5227ad599b56d0296a1c Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Tue, 13 Jan 2026 10:06:00 +0000 Subject: [PATCH 01/27] tidy whitespace --- templates/layout.html | 3 --- 1 file changed, 3 deletions(-) diff --git a/templates/layout.html b/templates/layout.html index ffdf242..2a093c7 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -17,10 +17,8 @@

{{ site.WebsiteName }}

{% else %}
  • Login
  • {% endif %} - -
    @@ -34,7 +32,6 @@

    {{ site.WebsiteName }}

    {% endblock %} From 6279ba13bd38e13642bdd252fc1dc3d74e9931a0 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Tue, 13 Jan 2026 10:16:51 +0000 Subject: [PATCH 02/27] Enhance privacy policy for Auth0 integration and clarify data collection practices --- templates/privacy.html | 89 ++++++++++++++++++++++++++++++++---------- 1 file changed, 69 insertions(+), 20 deletions(-) diff --git a/templates/privacy.html b/templates/privacy.html index 106520c..4d60147 100644 --- a/templates/privacy.html +++ b/templates/privacy.html @@ -23,26 +23,45 @@

    2. Who We Are (Data Controller)

    3. The Information We Collect

    -

    We collect very limited personal information - when you log in using your GitHub or Google account:

    +{% if auth_provider == "Auth0" %} +

    We collect limited personal information when you log in using Auth0, our third-party authentication provider:

    • - Google/GitHub User - ID: When you log in using the third-party authentication service (Google or - GitHub), we retrieve your user name and ID number and store only your unique user ID number. This is a - persistent identifier provided - by the third party. + User ID: When you log in using Auth0 (which supports authentication via Google, GitHub, + or other identity providers), we receive and store your unique user ID from Auth0. This is a persistent + identifier that allows us to recognize you on subsequent visits. +
    • +
    • + Email Address: We receive your email address from Auth0 to identify your account. +
    • +
    • + Name: We may receive your name from Auth0 as provided by your chosen identity provider.
    • Session Data: We use a session cookie to maintain your logged-in status. This cookie - itself stores a secure, random string (session ID) that links back to your user ID & name on our server. The + stores a secure, random string (session ID) that links back to your user information on our server. The + data is only stored for the duration of your visit (session). +
    • +
    +

    We do not collect additional personal details such as location, browsing history, + or any other information beyond what is necessary for authentication and service provision.

    +{% else %} +

    We collect very limited personal information when you log in using your GitHub account:

    +
      +
    • + GitHub User ID: When you log in using GitHub authentication, we retrieve your + user name and ID number and store only your unique user ID number. This is a persistent identifier + provided by GitHub. +
    • +
    • + Session Data: We use a session cookie to maintain your logged-in status. This cookie + stores a secure, random string (session ID) that links back to your user ID & name on our server. The data is only stored for the duration of your visit (session).
    • -
    -

    We do not collect your - name, email address, profile picture, location, or any other personal details unless explicitly stated - here.

    +

    We do not collect your email address, profile picture, location, or any other personal + details unless explicitly stated here.

    +{% endif %}

    4. How We Use Your Information

    We use the collected information for the @@ -65,18 +84,40 @@

    4. How We Use Your Information

    analytics, or any other non-essential purpose.

    5. Third-Party Data Sharing

    -

    We use a third-party service for - authentication:

    +{% if auth_provider == "Auth0" %} +

    We use third-party services for authentication and these services process your data:

    +
      +
    • + Auth0 (by Okta): We use Auth0 as our authentication service provider. When you log in, + Auth0 handles the authentication process and provides us with your user ID, email, and name. Auth0 acts + as a data processor on our behalf. Auth0 may store additional information about your authentication sessions. + Please review the Auth0 Privacy Policy + for details on how they handle your data. +
    • +
    • + Identity Providers (Google, GitHub, etc.): When you choose to log in via Google, GitHub, + or another identity provider through Auth0, you interact with their services. These providers authenticate + your identity and share limited information with Auth0, which then shares it with us. Please review their + respective privacy policies: +
        +
      • Google Privacy Policy
      • +
      • GitHub Privacy Statement
      • +
      + + +

      We do not share your information with any other third parties for marketing or other purposes.

      +{% else %} +

      We use a third-party service for authentication:

      • - GitHub/Google: When you log in, you interact with their - services. They provide us with your unique user ID. Please review the GitHub Privacy - Statement or Google Privacy Policy for details on - how they handle your data. + GitHub: When you log in, you interact with GitHub's authentication service. + They provide us with your unique user ID and username. Please review the + GitHub Privacy Statement + for details on how they handle your data.
      -

      We do not share your information with any other - third parties.

      +

      We do not share your information with any other third parties.

      +{% endif %}

      6. Our Cookie Policy

      We only use strictly @@ -126,7 +167,15 @@

      7. Your Data Protection Rights

      UK Information Commissioner's Office (ICO) if you believe we have not handled your information correctly.

      +{% if auth_provider == "Auth0" %} +

      8. Data Retention

      +

      We retain your user ID, email, and name for as long as your account is active. If you wish to delete your + account and associated data, please contact us at the email address provided above.

      + +

      9. Updates to this Policy

      +{% else %}

      8. Updates to this Policy

      +{% endif %}

      We may update this policy from time to time. The latest version will always be posted on this page.

      {% endblock %} \ No newline at end of file From a3eca668b74811a1095a938dc06ca360edb525bb Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Tue, 13 Jan 2026 10:37:59 +0000 Subject: [PATCH 03/27] Fixing Render --- README.md | 111 +++++++++++++++++++++++++++++++++++++++++++++++++--- render.yaml | 31 ++++++++++----- 2 files changed, 128 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index c4e9538..016fab7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ - # Flask Todo App with Dual Authentication ![Python](https://img.shields.io/badge/Python-3.10-blue) @@ -186,10 +185,112 @@ Once you have your code how you want ## Deployment on Render -- Add `render.yaml` to repo -- Push to GitHub -- Create Blueprint on Render -- Add environment variables in Render dashboard +### Prerequisites + +1. **GitHub Repository**: Your code must be pushed to a GitHub repository +2. **Render Account**: Sign up at [render.com](https://render.com) (free tier available) +3. **Auth0 Application**: Configured with your production callback URL + +### Step 1: Prepare Your Repository + +Ensure your repository contains: +- `render.yaml` (blueprint configuration file) +- `requirements.txt` (Python dependencies) +- All application code pushed to GitHub + +### Step 2: Create a Blueprint on Render + +1. **Log in to Render Dashboard** + - Go to [dashboard.render.com](https://dashboard.render.com) + +2. **Create New Blueprint** + - Click the "New +" button in the top right + - Select "Blueprint" from the dropdown menu + - [Direct Link to Create Blueprint](https://dashboard.render.com/select-repo?type=blueprint) + +3. **Connect Your GitHub Repository** + - Click "Connect account" if this is your first time + - Authorize Render to access your GitHub repositories + - Search for and select `mr-eggleton/python-flask-todo` (or your fork) + - Click "Connect" + +4. **Review Blueprint Configuration** + - Render will detect your `render.yaml` file + - Review the services that will be created (web service, database, etc.) + - Give your blueprint instance a name (e.g., "flask-todo-app") + - Click "Apply" + +### Step 3: Configure Environment Variables + +After the blueprint is created, you need to add your environment variables: + +1. **Navigate to Your Web Service** + - In the Render dashboard, click on your web service + - Go to the "Environment" tab + +2. **Add Environment Variables** + - Click "Add Environment Variable" + - Add each variable from your `.env` file: + ``` + APP_SECRET_KEY= + AUTH0_DOMAIN=.auth0.com + AUTH0_CLIENT_ID= + AUTH0_CLIENT_SECRET= + AUTH0_CALLBACK_URL=https://.onrender.com/callback + ``` + - **Important**: Generate a NEW `APP_SECRET_KEY` for production (don't reuse your local one) + - **Note**: Do NOT set `OAUTHLIB_INSECURE_TRANSPORT` in production + - Click "Save Changes" + +3. **Automatic Deployment** + - Render will automatically build and deploy your application + - Wait for the build to complete (check the "Logs" tab) + - Your app will be available at `https://.onrender.com` + +### Step 4: Update Auth0 Settings + +1. **Add Production Callback URL** + - Go to [Auth0 Dashboard](https://manage.auth0.com) + - Navigate to your application settings + - Add to "Allowed Callback URLs": `https://.onrender.com/callback` + - Add to "Allowed Logout URLs": `https://.onrender.com/` + - Add to "Allowed Web Origins": `https://.onrender.com` + - Click "Save Changes" + +### Step 5: Test Your Deployment + +1. Visit your Render URL: `https://.onrender.com` +2. Click "Login" - should redirect to Auth0 +3. Complete authentication +4. Verify you can create and manage todos + +### Continuous Deployment + +Once set up, Render automatically deploys when you push to your main branch: + +1. Make changes to your code locally +2. Commit and push to GitHub: + ```bash + git add . + git commit -m "Your commit message" + git push origin main + ``` +3. Render detects the push and automatically rebuilds/redeploys +4. Monitor deployment progress in the Render dashboard + +### Troubleshooting + +- **Build Fails**: Check the "Logs" tab in Render dashboard for errors +- **Auth0 Redirect Error**: Verify callback URLs match exactly (including https://) +- **Environment Variables**: Ensure all required variables are set in Render +- **Database Issues**: Render free tier databases sleep after inactivity; first request may be slow + +### Useful Links + +- [Render Blueprint Documentation](https://render.com/docs/infrastructure-as-code) +- [Render Python Deployment Guide](https://render.com/docs/deploy-flask) +- [Render Environment Variables](https://render.com/docs/environment-variables) +- [Auth0 Production Checklist](https://auth0.com/docs/deploy-monitor/deploy/production-checklist) ## Things we are ignoring diff --git a/render.yaml b/render.yaml index 837f8ce..ed7197e 100644 --- a/render.yaml +++ b/render.yaml @@ -1,19 +1,32 @@ - services: - type: web name: flask-todo-app env: python plan: free - buildCommand: "pip install -r requirements.txt" - startCommand: "gunicorn app:app" + buildCommand: pip install -r requirements.txt + startCommand: gunicorn app:app envVars: + - key: PYTHON_VERSION + value: 3.10 + - key: OAUTHLIB_INSECURE_TRANSPORT + value: "0" - key: APP_SECRET_KEY + generateValue: true + - key: AUTH0_DOMAIN sync: false - - key: GITHUB_CLIENT_ID - sync: false - - key: GITHUB_CLIENT_SECRET - sync: false - - key: GOOGLE_CLIENT_ID + - key: AUTH0_CLIENT_ID sync: false - - key: GOOGLE_CLIENT_SECRET + - key: AUTH0_CLIENT_SECRET sync: false + - key: AUTH0_CALLBACK_URL + value: https://${RENDER_EXTERNAL_HOSTNAME}/callback + - key: DATABASE_URL + fromDatabase: + name: flask-todo-db + property: connectionString + +databases: + - name: flask-todo-db + databaseName: flask_todo + plan: free + region: oregon From 40e1081415761467d8b4539025228759738aa38b Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Tue, 13 Jan 2026 10:45:04 +0000 Subject: [PATCH 04/27] SQLite for now, postgress later --- POSTGRESQL_SETUP.md | 214 ++++++++++++++++++++++++++++++++++++++++++++ README.md | 17 ++-- render.yaml | 10 --- 3 files changed, 224 insertions(+), 17 deletions(-) create mode 100644 POSTGRESQL_SETUP.md diff --git a/POSTGRESQL_SETUP.md b/POSTGRESQL_SETUP.md new file mode 100644 index 0000000..7e25f0c --- /dev/null +++ b/POSTGRESQL_SETUP.md @@ -0,0 +1,214 @@ +# Migrating to PostgreSQL + +This guide explains how to upgrade your Flask Todo App from SQLite to PostgreSQL for production use on Render. + +## Why Migrate to PostgreSQL? + +- **Reliability**: SQLite is file-based and not ideal for production web apps +- **Concurrency**: PostgreSQL handles multiple concurrent users better +- **Scalability**: Better performance as your app grows +- **Data Persistence**: Render's free PostgreSQL databases are more stable than file-based SQLite + +## When to Migrate + +- Your app is getting real users +- You need guaranteed data persistence +- You're moving beyond testing/development + +## Prerequisites + +- Existing Flask Todo App deployed on Render +- Access to your Render dashboard +- Your app source code updated locally + +## Step 1: Create PostgreSQL Database on Render + +1. **Log in to Render Dashboard** + - Go to [dashboard.render.com](https://dashboard.render.com) + +2. **Create New PostgreSQL Database** + - Click "New +" button + - Select "PostgreSQL" + - Choose your preferred region (same as your web service recommended) + - Name your database (e.g., "flask-todo-db") + - Plan: Free tier available + - Click "Create Database" + +3. **Wait for Database to Initialize** + - This takes a few minutes + - Once ready, you'll see the connection details + +## Step 2: Update Your Application Code + +### Install PostgreSQL Driver + +Add psycopg2 to your `requirements.txt`: + +``` +Flask==2.3.0 +SQLAlchemy==2.0.0 +psycopg2-binary==2.9.6 +# ...other dependencies... +``` + +### Update Database Configuration + +In your `app.py`, update the database URI to use PostgreSQL when the `DATABASE_URL` environment variable is present: + +```python +import os +from flask import Flask +from sqlalchemy import create_engine + +app = Flask(__name__) + +# Use DATABASE_URL if available (Render), otherwise use SQLite +database_url = os.getenv('DATABASE_URL') +if database_url: + # Fix the PostgreSQL URI format for SQLAlchemy + if database_url.startswith('postgres://'): + database_url = database_url.replace('postgres://', 'postgresql://', 1) + app.config['SQLALCHEMY_DATABASE_URI'] = database_url +else: + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db' + +app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False +``` + +## Step 3: Update render.yaml + +Update your `render.yaml` to include the PostgreSQL database and link it to your web service: + +```yaml +services: + - type: web + name: flask-todo-app + env: python + plan: free + buildCommand: pip install -r requirements.txt + startCommand: gunicorn app:app + envVars: + - key: PYTHON_VERSION + value: 3.10 + - key: OAUTHLIB_INSECURE_TRANSPORT + value: "0" + - key: APP_SECRET_KEY + generateValue: true + - key: AUTH0_DOMAIN + sync: false + - key: AUTH0_CLIENT_ID + sync: false + - key: AUTH0_CLIENT_SECRET + sync: false + - key: AUTH0_CALLBACK_URL + value: https://${RENDER_EXTERNAL_HOSTNAME}/callback + - key: DATABASE_URL + fromDatabase: + name: flask-todo-db + property: connectionString + +databases: + - name: flask-todo-db + databaseName: flask_todo + plan: free +``` + +## Step 4: Create Database Tables + +When your app first connects to PostgreSQL, it needs to create the tables: + +### Option A: Automatic (Recommended) + +Update your app initialization to create tables on startup: + +```python +from flask_sqlalchemy import SQLAlchemy + +db = SQLAlchemy(app) + +# In your init_todo() function or app creation: +with app.app_context(): + db.create_all() +``` + +### Option B: Manual via Shell + +1. SSH into your Render web service +2. Run: + ```bash + python + >>> from app import app, db + >>> with app.app_context(): + ... db.create_all() + >>> exit() + ``` + +## Step 5: Deploy Updated Code + +1. **Commit and push your changes** + ```bash + git add requirements.txt app.py render.yaml + git commit -m "Add PostgreSQL support" + git push origin main + ``` + +2. **Render automatically redeploys** + - Check the "Logs" tab in Render dashboard + - Wait for build to complete + +## Step 6: Verify Migration + +1. Visit your app: `https://.onrender.com` +2. Create a test todo +3. Refresh the page - data should persist +4. Check Render PostgreSQL dashboard to confirm queries are running + +## Rollback to SQLite (If Needed) + +If you need to go back to SQLite: + +1. Remove the `DATABASE_URL` environment variable from Render +2. Revert your `app.py` to use SQLite only +3. Push to GitHub +4. Render will redeploy with SQLite + +## Troubleshooting + +### "Ident authentication failed" + +- Your `DATABASE_URL` may be malformed +- Ensure you're using `postgresql://` not `postgres://` +- Check that the connection string includes username and password + +### "relation 'todo' does not exist" + +- Tables haven't been created yet +- Ensure `db.create_all()` runs on app startup +- Check application logs for errors + +### Connection Timeout + +- PostgreSQL service may still be starting +- Wait a few minutes and try again +- Check that your web service can reach the database (same region recommended) + +### Data Lost After Redeploy + +- Free tier databases may have limitations +- Consider upgrading to a paid plan for production +- Alternatively, implement regular backups + +## Useful Links + +- [Render PostgreSQL Documentation](https://render.com/docs/databases) +- [SQLAlchemy PostgreSQL Dialect](https://docs.sqlalchemy.org/en/20/dialects/postgresql.html) +- [PostgreSQL Connection Strings](https://www.postgresql.org/docs/current/libpq-envars.html) +- [Database Migrations with Flask-Migrate](https://flask-migrate.readthedocs.io/) + +## Next Steps + +Once PostgreSQL is running reliably: + +- Implement database migrations using [Flask-Migrate](https://flask-migrate.readthedocs.io/) +- Set up automated backups in Render +- Consider upgrading to a paid database plan for production use diff --git a/README.md b/README.md index 016fab7..781603a 100644 --- a/README.md +++ b/README.md @@ -171,17 +171,19 @@ Without this, Auth0 cannot reach your callback URL and login will fail. ## The Database -This code uses [SQLAlchemy](https://www.sqlalchemy.org/) to set up classes that have methods to talk to many [databases](https://docs.sqlalchemy.org/en/20/dialects/index.html) we use SQLite for simplicity here. +This code uses [SQLAlchemy](https://www.sqlalchemy.org/) to set up classes that have methods to talk to many [databases](https://docs.sqlalchemy.org/en/20/dialects/index.html). We use **SQLite for simplicity and easy local development**. -### SQLite Viewer extension +### Local Development (SQLite) -The database file is in /instance/ +The database file is stored in `/instance/todo.db` -The database can be changed to +### Production Deployment (SQLite) -## First deployment +For initial deployment on Render, SQLite works fine for testing and small user bases. The database persists in Render's filesystem. -Once you have your code how you want +### Upgrading to PostgreSQL + +Once your app grows and you need a more robust database, see [POSTGRESQL_SETUP.md](POSTGRESQL_SETUP.md) for a complete migration guide. ## Deployment on Render @@ -230,7 +232,7 @@ After the blueprint is created, you need to add your environment variables: 2. **Add Environment Variables** - Click "Add Environment Variable" - - Add each variable from your `.env` file: + - Add each variable: ``` APP_SECRET_KEY= AUTH0_DOMAIN=.auth0.com @@ -246,6 +248,7 @@ After the blueprint is created, you need to add your environment variables: - Render will automatically build and deploy your application - Wait for the build to complete (check the "Logs" tab) - Your app will be available at `https://.onrender.com` + - **Note**: The SQLite database file will persist on Render's filesystem ### Step 4: Update Auth0 Settings diff --git a/render.yaml b/render.yaml index ed7197e..1c9f6ad 100644 --- a/render.yaml +++ b/render.yaml @@ -20,13 +20,3 @@ services: sync: false - key: AUTH0_CALLBACK_URL value: https://${RENDER_EXTERNAL_HOSTNAME}/callback - - key: DATABASE_URL - fromDatabase: - name: flask-todo-db - property: connectionString - -databases: - - name: flask-todo-db - databaseName: flask_todo - plan: free - region: oregon From bf109a22020e637d1327b8ebc7456b4ba52de31a Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Tue, 13 Jan 2026 10:52:33 +0000 Subject: [PATCH 05/27] Update Python version to 3.12.1 in render.yaml --- render.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/render.yaml b/render.yaml index 1c9f6ad..12b55d0 100644 --- a/render.yaml +++ b/render.yaml @@ -7,7 +7,7 @@ services: startCommand: gunicorn app:app envVars: - key: PYTHON_VERSION - value: 3.10 + value: 3.12.1 - key: OAUTHLIB_INSECURE_TRANSPORT value: "0" - key: APP_SECRET_KEY From eaacba54785b053bc63843992722223351d3a790 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Tue, 13 Jan 2026 11:46:29 +0000 Subject: [PATCH 06/27] fix on render --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index f34dcae..f01572b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ Flask-SQLAlchemy==3.1.1 Flask-Dance==7.0.0 gunicorn==21.2.0 python-dotenv==1.0.0 +psycopg2-binary==2.9.11 \ No newline at end of file From 09b811cfade525294185b46efbf5bac64bd961ec Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Tue, 13 Jan 2026 12:06:54 +0000 Subject: [PATCH 07/27] gunicorn fix --- render.yaml | 2 +- requirements.txt | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/render.yaml b/render.yaml index 12b55d0..4946f01 100644 --- a/render.yaml +++ b/render.yaml @@ -4,7 +4,7 @@ services: env: python plan: free buildCommand: pip install -r requirements.txt - startCommand: gunicorn app:app + startCommand: python -m gunicorn app:app envVars: - key: PYTHON_VERSION value: 3.12.1 diff --git a/requirements.txt b/requirements.txt index f01572b..f8efd1d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,5 +3,4 @@ Flask==2.3.2 Flask-SQLAlchemy==3.1.1 Flask-Dance==7.0.0 gunicorn==21.2.0 -python-dotenv==1.0.0 -psycopg2-binary==2.9.11 \ No newline at end of file +python-dotenv==1.0.0 \ No newline at end of file From 8ee1f24fb3dfab7bfcd011c37b1bcd2934d40ff5 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Tue, 13 Jan 2026 14:06:41 +0000 Subject: [PATCH 08/27] gunicorn compatibility --- README.md | 1 + app.py | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/README.md b/README.md index 781603a..587aafd 100644 --- a/README.md +++ b/README.md @@ -199,6 +199,7 @@ Ensure your repository contains: - `render.yaml` (blueprint configuration file) - `requirements.txt` (Python dependencies) - All application code pushed to GitHub +- Use `python -m gunicorn app:app --bind 0.0.0.0:5000` to confirm that everything works ok under gunicorn before trying Render ### Step 2: Create a Blueprint on Render diff --git a/app.py b/app.py index 7bedf09..8115d6e 100644 --- a/app.py +++ b/app.py @@ -1,3 +1,7 @@ +# Load environment variables from .env file (needed for gunicorn) +from dotenv import load_dotenv +load_dotenv() + import os from flask import Flask from auth import auth_bp, auth0_bp, github_bp, github_auth_bp @@ -35,5 +39,13 @@ def inject_dict_for_all_templates(): # Initialize todo module (db and tables) init_todo(app) +# Set AUTH0_CALLBACK_URL dynamically based on Render's hostname +if 'RENDER_EXTERNAL_HOSTNAME' in os.environ: + auth0_callback_url = f"https://{os.environ['RENDER_EXTERNAL_HOSTNAME']}/callback" +else: + auth0_callback_url = os.environ.get('AUTH0_CALLBACK_URL', 'http://localhost:5000/callback') + +# Use auth0_callback_url in your Auth0 configuration + if __name__ == '__main__': app.run(debug=True) From 3e0ad4cf32e000682d08160e04a5e16f65943a80 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Tue, 13 Jan 2026 14:41:43 +0000 Subject: [PATCH 09/27] Render Fix --- app.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app.py b/app.py index 8115d6e..baf4eb8 100644 --- a/app.py +++ b/app.py @@ -45,6 +45,8 @@ def inject_dict_for_all_templates(): else: auth0_callback_url = os.environ.get('AUTH0_CALLBACK_URL', 'http://localhost:5000/callback') +app.config['AUTH0_CALLBACK_URL'] = auth0_callback_url + # Use auth0_callback_url in your Auth0 configuration if __name__ == '__main__': From 2cfd6af768a5b756cdf04df4ef4049c678dc5c65 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Wed, 14 Jan 2026 09:56:37 +0000 Subject: [PATCH 10/27] Documentation updates --- CODESPACES_SETUP.md | 100 +++++++++++++++++++++++++ README.md | 175 +++----------------------------------------- RENDER_SETUP.md | 136 ++++++++++++++++++++++++++++++++++ 3 files changed, 245 insertions(+), 166 deletions(-) create mode 100644 CODESPACES_SETUP.md create mode 100644 RENDER_SETUP.md diff --git a/CODESPACES_SETUP.md b/CODESPACES_SETUP.md new file mode 100644 index 0000000..67b4632 --- /dev/null +++ b/CODESPACES_SETUP.md @@ -0,0 +1,100 @@ +# GitHub Codespaces Setup + +GitHub Codespaces is a flexible cloud-based development environment. Your editor runs in the cloud, allowing you to work from anywhere. + +## Creating and Starting a Codespace + +### Create a New Codespace + +1. **Go to the Repository** + - Navigate to [https://github.com/stretchyboy/python-todo](https://github.com/stretchyboy/python-todo) (or your fork) + +2. **Create a Codespace** + - Click the green **"Code"** button + - Select the **"Codespaces"** tab + - Click **"Create codespace on main"** (or your preferred branch) + +3. **Wait for Setup** + - GitHub will provision your Codespace (this takes 1-2 minutes) + - VS Code will open in your browser automatically + - The environment is ready when you see the terminal + +### Start an Existing Codespace + +If you've created a Codespace before: + +1. **Go to Your Codespaces** + - Visit [https://github.com/codespaces](https://github.com/codespaces) + - Click on your Codespace name to open it + +2. **Or via GitHub** + - Click the green **"Code"** button on the repository + - Select the **"Codespaces"** tab + - Click on an existing Codespace to resume it + +## Install Dependencies + +```bash +py -m pip install -r requirements.txt +``` + +## Copy Example Environment File + +```bash +# On linux or codespaces +cp .env.example .env +``` + +## Auth0 Setup (Codespaces & Production) + +For Codespaces and Render deployment: + +1. **Create an Auth0 Account** + - Go to [auth0.com](https://auth0.com) and sign up + +2. **Create an Application** + - Dashboard → Applications → Create Application + - Choose "Regular Web Applications" + - Name: Flask Todo App + +3. **Configure Application Settings** + - "Allowed Callback URLs": `https:///callback` + - "Allowed Logout URLs": `https:///` + - "Allowed Web Origins": `https://` + - Codespaces URL format: `https://-5000./` + - Example: `https://shiny-space-pancake-g5w6pqr4v7h2pgx-5000.app.github.dev/callback` + +4. **Copy Credentials** + - Add Auth0 Domain, Client ID, and Client Secret to `.env` + +## Running the Application + +Start the Flask development server: + +```bash +python -m flask run +``` + +The app will be available at [http://localhost:5000](http://localhost:5000) + +## Important: Codespaces Port Configuration + +If you're running in **GitHub Codespaces**, you must set the forwarded port to **Public** for Auth0 callbacks to work: + +1. Open the **Ports** panel (bottom of VS Code) +2. Right-click the port 5000 +3. Select "Port Visibility" → **Public** + +Without this, Auth0 cannot reach your callback URL and login will fail. + +## Using the App + +1. Visit [http://localhost:5000](http://localhost:5000) +2. Click "Login" - it will automatically route to Auth0 +3. After successful login, manage your todos + +## Authentication Resources + +- [Flask-Dance Documentation](https://flask-dance.readthedocs.io/) +- [Auth0 Python Quickstart](https://auth0.com/docs/quickstart/webapp/python) +- [Auth0 Dashboard](https://manage.auth0.com/) diff --git a/README.md b/README.md index 587aafd..79f2a4a 100644 --- a/README.md +++ b/README.md @@ -112,32 +112,6 @@ For local Windows development with GitHub Desktop: 3. **Enable Insecure Transport for Local Dev** - Set `OAUTHLIB_INSECURE_TRANSPORT=1` in `.env` (only for local development) -### Auth0 Setup (Codespaces & Production) - -For Codespaces and Render deployment: - -1. **Create an Auth0 Account** - - Go to [auth0.com](https://auth0.com) and sign up - -2. **Create an Application** - - Dashboard → Applications → Create Application - - Choose "Regular Web Applications" - - Name: Flask Todo App - -3. **Configure Application Settings** - - "Allowed Callback URLs": - - Local: `http://localhost:5000/callback` - - Codespaces: `https:///callback` - - Production: `https://your-app.onrender.com/callback` - - "Allowed Logout URLs": - - Local: `http://localhost:5000/` - - Production: `https://your-app.onrender.com/` - - "Allowed Web Origins": Same as callback URLs - - Codespaces URL format: `https://-5000./` (use `/callback` for the callback and `/` for logout) - -4. **Copy Credentials** - - Add Auth0 Domain, Client ID, and Client Secret to `.env` - ## Running the Application Start the Flask development server: @@ -148,27 +122,6 @@ python -m flask run The app will be available at [http://localhost:5000](http://localhost:5000) -### Important: Codespaces Port Configuration - -If you're running in **GitHub Codespaces**, you must set the forwarded port to **Public** for Auth0 callbacks to work: - -1. Open the **Ports** panel (bottom of VS Code) -2. Right-click the port 5000 -3. Select "Port Visibility" → **Public** - -Without this, Auth0 cannot reach your callback URL and login will fail. - -**To use the app:** -1. Visit [http://localhost:5000](http://localhost:5000) -2. Click "Login" - it will automatically route to GitHub (local) or Auth0 (Codespaces) -3. After successful login, manage your todos - -## Authentication Resources - -- [Flask-Dance Documentation](https://flask-dance.readthedocs.io/) -- [Auth0 Python Quickstart](https://auth0.com/docs/quickstart/webapp/python) -- [Auth0 Dashboard](https://manage.auth0.com/) - ## The Database This code uses [SQLAlchemy](https://www.sqlalchemy.org/) to set up classes that have methods to talk to many [databases](https://docs.sqlalchemy.org/en/20/dialects/index.html). We use **SQLite for simplicity and easy local development**. @@ -177,129 +130,19 @@ This code uses [SQLAlchemy](https://www.sqlalchemy.org/) to set up classes that The database file is stored in `/instance/todo.db` -### Production Deployment (SQLite) +## Things we are ignoring -For initial deployment on Render, SQLite works fine for testing and small user bases. The database persists in Render's filesystem. +- Persistent records in a database. The current database will be destroyed each time you push to render, ( You can modify the code once it's on Render to move to PostgreSQL ). +- Changing database structure SQLAlchemy Migrations. Currently we aren't handling changes to the database structure so you need to delete the local .db and start again (render wil do this anyway on a rebuild as mentioned above). They can be handled with Migrations +- Storing any user data in a database (other than an id from github ). To have users on this system to store any other PII refer to [https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy](https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy) and change the privacy statement. +- Adding extra security [https://flask-security.readthedocs.io/en/stable/quickstart.html#basic-flask-sqlalchemy-application](https://flask-security.readthedocs.io/en/stable/quickstart.html#basic-flask-sqlalchemy-application) +- Testing. There are no tests in this code. -### Upgrading to PostgreSQL +## Codespaces Setup -Once your app grows and you need a more robust database, see [POSTGRESQL_SETUP.md](POSTGRESQL_SETUP.md) for a complete migration guide. +See [CODESPACES_SETUP.md](CODESPACES_SETUP.md) for complete GitHub Codespaces setup instructions. ## Deployment on Render -### Prerequisites - -1. **GitHub Repository**: Your code must be pushed to a GitHub repository -2. **Render Account**: Sign up at [render.com](https://render.com) (free tier available) -3. **Auth0 Application**: Configured with your production callback URL - -### Step 1: Prepare Your Repository - -Ensure your repository contains: -- `render.yaml` (blueprint configuration file) -- `requirements.txt` (Python dependencies) -- All application code pushed to GitHub -- Use `python -m gunicorn app:app --bind 0.0.0.0:5000` to confirm that everything works ok under gunicorn before trying Render - -### Step 2: Create a Blueprint on Render - -1. **Log in to Render Dashboard** - - Go to [dashboard.render.com](https://dashboard.render.com) - -2. **Create New Blueprint** - - Click the "New +" button in the top right - - Select "Blueprint" from the dropdown menu - - [Direct Link to Create Blueprint](https://dashboard.render.com/select-repo?type=blueprint) - -3. **Connect Your GitHub Repository** - - Click "Connect account" if this is your first time - - Authorize Render to access your GitHub repositories - - Search for and select `mr-eggleton/python-flask-todo` (or your fork) - - Click "Connect" - -4. **Review Blueprint Configuration** - - Render will detect your `render.yaml` file - - Review the services that will be created (web service, database, etc.) - - Give your blueprint instance a name (e.g., "flask-todo-app") - - Click "Apply" - -### Step 3: Configure Environment Variables - -After the blueprint is created, you need to add your environment variables: - -1. **Navigate to Your Web Service** - - In the Render dashboard, click on your web service - - Go to the "Environment" tab - -2. **Add Environment Variables** - - Click "Add Environment Variable" - - Add each variable: - ``` - APP_SECRET_KEY= - AUTH0_DOMAIN=.auth0.com - AUTH0_CLIENT_ID= - AUTH0_CLIENT_SECRET= - AUTH0_CALLBACK_URL=https://.onrender.com/callback - ``` - - **Important**: Generate a NEW `APP_SECRET_KEY` for production (don't reuse your local one) - - **Note**: Do NOT set `OAUTHLIB_INSECURE_TRANSPORT` in production - - Click "Save Changes" - -3. **Automatic Deployment** - - Render will automatically build and deploy your application - - Wait for the build to complete (check the "Logs" tab) - - Your app will be available at `https://.onrender.com` - - **Note**: The SQLite database file will persist on Render's filesystem - -### Step 4: Update Auth0 Settings - -1. **Add Production Callback URL** - - Go to [Auth0 Dashboard](https://manage.auth0.com) - - Navigate to your application settings - - Add to "Allowed Callback URLs": `https://.onrender.com/callback` - - Add to "Allowed Logout URLs": `https://.onrender.com/` - - Add to "Allowed Web Origins": `https://.onrender.com` - - Click "Save Changes" - -### Step 5: Test Your Deployment - -1. Visit your Render URL: `https://.onrender.com` -2. Click "Login" - should redirect to Auth0 -3. Complete authentication -4. Verify you can create and manage todos - -### Continuous Deployment - -Once set up, Render automatically deploys when you push to your main branch: - -1. Make changes to your code locally -2. Commit and push to GitHub: - ```bash - git add . - git commit -m "Your commit message" - git push origin main - ``` -3. Render detects the push and automatically rebuilds/redeploys -4. Monitor deployment progress in the Render dashboard - -### Troubleshooting - -- **Build Fails**: Check the "Logs" tab in Render dashboard for errors -- **Auth0 Redirect Error**: Verify callback URLs match exactly (including https://) -- **Environment Variables**: Ensure all required variables are set in Render -- **Database Issues**: Render free tier databases sleep after inactivity; first request may be slow - -### Useful Links - -- [Render Blueprint Documentation](https://render.com/docs/infrastructure-as-code) -- [Render Python Deployment Guide](https://render.com/docs/deploy-flask) -- [Render Environment Variables](https://render.com/docs/environment-variables) -- [Auth0 Production Checklist](https://auth0.com/docs/deploy-monitor/deploy/production-checklist) +See [RENDER_SETUP.md](RENDER_SETUP.md) for complete Render deployment instructions, including setup, configuration, environment variables, and continuous deployment. -## Things we are ignoring - -- Persistent records in a database. The current database will be destroyed each time you push to render, ( we are only testing, not building a real system that works for years). -- Changing database structure SQLAlchemy Migrations. Currently we aren't handling changes to the database structure so you need to delete the local .db and start again (render wil do this anyway on a rebuild as mentioned above). They can be handled with Migrations -- Storing any user data in a database (other than an id from github ). To have users on this system to store any other PII refer to [https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy](https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy) and change the privacy statement. -- Adding extra security [https://flask-security.readthedocs.io/en/stable/quickstart.html#basic-flask-sqlalchemy-application](https://flask-security.readthedocs.io/en/stable/quickstart.html#basic-flask-sqlalchemy-application) -- Testing. There are no tests in this code. diff --git a/RENDER_SETUP.md b/RENDER_SETUP.md new file mode 100644 index 0000000..b494983 --- /dev/null +++ b/RENDER_SETUP.md @@ -0,0 +1,136 @@ +# Deployment on Render + +## Prerequisites + +1. **GitHub Repository**: Your code must be pushed to a GitHub repository +2. **Render Account**: Sign up at [render.com](https://render.com) (free tier available) +3. **Auth0 Application**: Configured with your production callback URL + +## Auth0 Setup (Production) + +Before deploying to Render, set up Auth0 for production: + +1. **Create an Auth0 Account** + - Go to [auth0.com](https://auth0.com) and sign up + +2. **Create an Application** + - Dashboard → Applications → Create Application + - Choose "Regular Web Applications" + - Name: Flask Todo App + +3. **Configure Application Settings** + - "Allowed Callback URLs": `https://.onrender.com/callback` + - "Allowed Logout URLs": `https://.onrender.com/` + - "Allowed Web Origins": `https://.onrender.com` + - Example: `https://flask-todo-app.onrender.com/callback` + +4. **Save Credentials** + - Copy your Auth0 Domain, Client ID, and Client Secret + - You'll need these for Render environment variables in Step 3 + +## Step 1: Prepare Your Repository + +Ensure your repository contains: +- `render.yaml` (blueprint configuration file) +- `requirements.txt` (Python dependencies) +- All application code pushed to GitHub +- Use `python -m gunicorn app:app --bind 0.0.0.0:5000` to confirm that everything works ok under gunicorn before trying Render + +## Step 2: Create a Blueprint on Render + +1. **Log in to Render Dashboard** + - Go to [dashboard.render.com](https://dashboard.render.com) + +2. **Create New Blueprint** + - Click the "New +" button in the top right + - Select "Blueprint" from the dropdown menu + - [Direct Link to Create Blueprint](https://dashboard.render.com/select-repo?type=blueprint) + +3. **Connect Your GitHub Repository** + - Click "Connect account" if this is your first time + - Authorize Render to access your GitHub repositories + - Search for and select `mr-eggleton/python-flask-todo` (or your fork) + - Click "Connect" + +4. **Review Blueprint Configuration** + - Render will detect your `render.yaml` file + - Review the services that will be created (web service, database, etc.) + - Give your blueprint instance a name (e.g., "flask-todo-app") + - Click "Apply" + +## Step 3: Configure Environment Variables + +After the blueprint is created, you need to add your environment variables: + +1. **Navigate to Your Web Service** + - In the Render dashboard, click on your web service + - Go to the "Environment" tab + +2. **Add Environment Variables** + - Click "Add Environment Variable" + - Add each variable: + ``` + APP_SECRET_KEY= + AUTH0_DOMAIN=.auth0.com + AUTH0_CLIENT_ID= + AUTH0_CLIENT_SECRET= + AUTH0_CALLBACK_URL=https://.onrender.com/callback + ``` + - **Important**: Generate a NEW `APP_SECRET_KEY` for production (don't reuse your local one) + - **Note**: Do NOT set `OAUTHLIB_INSECURE_TRANSPORT` in production + - Click "Save Changes" + +3. **Automatic Deployment** + - Render will automatically build and deploy your application + - Wait for the build to complete (check the "Logs" tab) + - Your app will be available at `https://.onrender.com` + - **Note**: The SQLite database file will persist on Render's filesystem + +## Step 4: Update Auth0 Settings + +1. **Add Production Callback URL** + - Go to [Auth0 Dashboard](https://manage.auth0.com) + - Navigate to your application settings + - Add to "Allowed Callback URLs": `https://.onrender.com/callback` + - Add to "Allowed Logout URLs": `https://.onrender.com/` + - Add to "Allowed Web Origins": `https://.onrender.com` + - Click "Save Changes" + +## Step 5: Test Your Deployment + +1. Visit your Render URL: `https://.onrender.com` +2. Click "Login" - should redirect to Auth0 +3. Complete authentication +4. Verify you can create and manage todos + +## Continuous Deployment + +Once set up, Render automatically deploys when you push to your main branch: + +1. Make changes to your code locally +2. Commit and push to GitHub: + ```bash + git add . + git commit -m "Your commit message" + git push origin main + ``` +3. Render detects the push and automatically rebuilds/redeploys +4. Monitor deployment progress in the Render dashboard + +## Troubleshooting + +- **Build Fails**: Check the "Logs" tab in Render dashboard for errors +- **Auth0 Redirect Error**: Verify callback URLs match exactly (including https://) +- **Environment Variables**: Ensure all required variables are set in Render +- **Database Issues**: Render free tier databases sleep after inactivity; first request may be slow + +## Upgrading to PostgreSQL + +Once your app grows and you need a more robust database, see [POSTGRESQL_SETUP.md](POSTGRESQL_SETUP.md) for a complete migration guide. + +## Useful Links + +- [Render Blueprint Documentation](https://render.com/docs/infrastructure-as-code) +- [Render Python Deployment Guide](https://render.com/docs/deploy-flask) +- [Render Environment Variables](https://render.com/docs/environment-variables) +- [Auth0 Production Checklist](https://auth0.com/docs/deploy-monitor/deploy/production-checklist) From 45ff8b15027181f512a06b56ee6179376c332b0e Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Wed, 14 Jan 2026 10:07:28 +0000 Subject: [PATCH 11/27] Tweaks to environment variables --- .env.example | 14 ++++---------- RENDER_SETUP.md | 33 +++++++++++++-------------------- app.py | 17 ++++++++++++++++- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/.env.example b/.env.example index 9f78f6d..043d9db 100644 --- a/.env.example +++ b/.env.example @@ -1,15 +1,9 @@ -DATABASE_URL=sqlite:///todo.db APP_SECRET_KEY=your_flask_secret - - -# GitHub OAuth for local development -GITHUB_CLIENT_ID=your-github-client-id -GITHUB_CLIENT_SECRET=your-github-client-secret -# Only needed for local/GitHub OAuth OAUTHLIB_INSECURE_TRANSPORT=0 +DATABASE_URL=sqlite:///todo.db # Example environment variables for Auth0 integration -AUTH0_DOMAIN=your-auth0-domain.auth0.com -AUTH0_CLIENT_ID=your-auth0-client-id -AUTH0_CLIENT_SECRET=your-auth0-client-secret +AUTH0_DOMAIN=your_auth0_domain +AUTH0_CLIENT_ID=your_client_id +AUTH0_CLIENT_SECRET=your_client_secret AUTH0_CALLBACK_URL=http://localhost:5000/callback diff --git a/RENDER_SETUP.md b/RENDER_SETUP.md index b494983..29848b9 100644 --- a/RENDER_SETUP.md +++ b/RENDER_SETUP.md @@ -59,26 +59,19 @@ Ensure your repository contains: - Click "Apply" ## Step 3: Configure Environment Variables - -After the blueprint is created, you need to add your environment variables: - -1. **Navigate to Your Web Service** - - In the Render dashboard, click on your web service - - Go to the "Environment" tab - -2. **Add Environment Variables** - - Click "Add Environment Variable" - - Add each variable: - ``` - APP_SECRET_KEY= - AUTH0_DOMAIN=.auth0.com - AUTH0_CLIENT_ID= - AUTH0_CLIENT_SECRET= - AUTH0_CALLBACK_URL=https://.onrender.com/callback - ``` - - **Important**: Generate a NEW `APP_SECRET_KEY` for production (don't reuse your local one) - - **Note**: Do NOT set `OAUTHLIB_INSECURE_TRANSPORT` in production - - Click "Save Changes" + + Add these in Render Dashboard → Environment: + + ``` + AUTH0_CLIENT_ID=your_client_id + AUTH0_CLIENT_SECRET=your_client_secret + AUTH0_DOMAIN=your_auth0_domain + APP_SECRET_KEY=your_secret_key + ``` + + **Important:** Do NOT set `RENDER_EXTERNAL_HOSTNAME` manually. Render sets this automatically, but it's only available at runtime, not during build. + + **For Auth0 Configuration:** Use your actual Render app URL (e.g., `https://python-todo.onrender.com`) in Auth0 settings, not the variable name. 3. **Automatic Deployment** - Render will automatically build and deploy your application diff --git a/app.py b/app.py index baf4eb8..a3261d7 100644 --- a/app.py +++ b/app.py @@ -17,7 +17,7 @@ } app = Flask(__name__) -app.secret_key = os.getenv("APP_SECRET_KEY", "supersecret") +app.secret_key = os.environ.get("APP_SECRET_KEY") app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', 'sqlite:///todo.db') app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False @@ -47,6 +47,21 @@ def inject_dict_for_all_templates(): app.config['AUTH0_CALLBACK_URL'] = auth0_callback_url +# Set redirect_uri based on environment +if os.getenv('CODESPACE_NAME'): + # Running in GitHub Codespaces + redirect_uri = f"https://{os.getenv('CODESPACE_NAME')}-5000.{os.getenv('GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN')}/callback" +elif os.getenv('RENDER'): + # Running on Render - use RENDER_EXTERNAL_URL which is set at runtime + render_url = os.getenv('RENDER_EXTERNAL_URL', '') + if render_url: + redirect_uri = f"{render_url}/callback" + else: + redirect_uri = None # Will fall back to default +else: + # Local development + redirect_uri = "http://localhost:5000/callback" + # Use auth0_callback_url in your Auth0 configuration if __name__ == '__main__': From 638be9d5337107e4b922f177aac1292b1e07fae2 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Wed, 14 Jan 2026 10:56:51 +0000 Subject: [PATCH 12/27] Update Auth0 callback URL handling and documentation for Render deployment --- RENDER_SETUP.md | 3 +++ app.py | 11 ++--------- render.yaml | 2 +- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/RENDER_SETUP.md b/RENDER_SETUP.md index 29848b9..9259767 100644 --- a/RENDER_SETUP.md +++ b/RENDER_SETUP.md @@ -67,8 +67,11 @@ Ensure your repository contains: AUTH0_CLIENT_SECRET=your_client_secret AUTH0_DOMAIN=your_auth0_domain APP_SECRET_KEY=your_secret_key + AUTH0_CALLBACK_URL=https://your-app-name.onrender.com/callback ``` + **Important:** Replace `your-app-name.onrender.com` with your actual Render app URL (found in your Render dashboard). + **Important:** Do NOT set `RENDER_EXTERNAL_HOSTNAME` manually. Render sets this automatically, but it's only available at runtime, not during build. **For Auth0 Configuration:** Use your actual Render app URL (e.g., `https://python-todo.onrender.com`) in Auth0 settings, not the variable name. diff --git a/app.py b/app.py index a3261d7..47ca576 100644 --- a/app.py +++ b/app.py @@ -51,16 +51,9 @@ def inject_dict_for_all_templates(): if os.getenv('CODESPACE_NAME'): # Running in GitHub Codespaces redirect_uri = f"https://{os.getenv('CODESPACE_NAME')}-5000.{os.getenv('GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN')}/callback" -elif os.getenv('RENDER'): - # Running on Render - use RENDER_EXTERNAL_URL which is set at runtime - render_url = os.getenv('RENDER_EXTERNAL_URL', '') - if render_url: - redirect_uri = f"{render_url}/callback" - else: - redirect_uri = None # Will fall back to default else: - # Local development - redirect_uri = "http://localhost:5000/callback" + # Use AUTH0_CALLBACK_URL from environment (for both local and production) + redirect_uri = os.getenv('AUTH0_CALLBACK_URL', 'http://localhost:5000/callback') # Use auth0_callback_url in your Auth0 configuration diff --git a/render.yaml b/render.yaml index 4946f01..51eaa26 100644 --- a/render.yaml +++ b/render.yaml @@ -19,4 +19,4 @@ services: - key: AUTH0_CLIENT_SECRET sync: false - key: AUTH0_CALLBACK_URL - value: https://${RENDER_EXTERNAL_HOSTNAME}/callback + sync: false From 3bbf969f43d5a330dc393f771e485e894a5bbfdb Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Wed, 14 Jan 2026 12:58:32 +0000 Subject: [PATCH 13/27] Refactor README for clarity and detail on features and setup --- README.md | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 79f2a4a..150f89d 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,15 @@ -# Flask Todo App with Dual Authentication +# Flask Todo App Starter ![Python](https://img.shields.io/badge/Python-3.10-blue) ![Flask](https://img.shields.io/badge/Flask-2.3-green) ![Render](https://img.shields.io/badge/Deploy-Render-purple) ## Features - + ### Flask + - Webserver with routing (a function for each url endpoint) + - Jinja templates for looping though and outputting data. + - todo.py contains the endpoints for the Todo app -### SQLAlchemy & SQLite +### SQLAlchemy & SQLite / PostgreSQL + - SQL Database + - Managed by SQLAlchemy an Object Relationship Manager which allows you to write classes that define the data and provides the storage & CRUD for you. + - ORMs build the database for you from your classes, start with SQLite but you can move PostgreSQL or others when you are ready. + - todo.py includes the Todo class that provdes all you need for the building of the database and all the CRUD. ### Authentication (GitHub + Auth0) + - GitHub OAuth (Flask-Dance) for local Windows development + - Auth0 OAuth for Codespaces and Render production -### Render - -### Github Actions +### Render & Github Actions +- Ready for Render deployment +- GitHub Actions CI/CD ## Setup @@ -138,6 +150,12 @@ The database file is stored in `/instance/todo.db` - Adding extra security [https://flask-security.readthedocs.io/en/stable/quickstart.html#basic-flask-sqlalchemy-application](https://flask-security.readthedocs.io/en/stable/quickstart.html#basic-flask-sqlalchemy-application) - Testing. There are no tests in this code. +## Your Development + + + + + ## Codespaces Setup See [CODESPACES_SETUP.md](CODESPACES_SETUP.md) for complete GitHub Codespaces setup instructions. From 44a47cfa58515437aec23ec43a598945444603a2 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Wed, 14 Jan 2026 12:58:40 +0000 Subject: [PATCH 14/27] Refactor Todo model to use SQLAlchemy's mapped_column and remove dataclass decorator --- todo.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/todo.py b/todo.py index d6361a6..299a7ed 100644 --- a/todo.py +++ b/todo.py @@ -1,26 +1,27 @@ # todo.py - todo functionality from flask import Blueprint, render_template, request, redirect, session +# models.py from flask_sqlalchemy import SQLAlchemy -from dataclasses import dataclass +from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass, Mapped, mapped_column from auth import get_current_user + +# Base that adds dataclass behaviors to mapped classes +class Base(MappedAsDataclass, DeclarativeBase): + pass + + todo_bp = Blueprint('todo', __name__) -db = SQLAlchemy() +db = SQLAlchemy(model_class=Base) -@dataclass class Todo(db.Model): - id: int - task: str - done: bool - user_id: str - - __tablename__ = 'todos' + __tablename__ = "todos" - id = db.Column(db.Integer, primary_key=True) - task = db.Column(db.String(200), nullable=False) - done = db.Column(db.Boolean, default=False) - user_id = db.Column(db.String(100), nullable=False) + id: Mapped[int] = mapped_column(primary_key=True, init=False) + task: Mapped[str] = mapped_column(db.String(200), nullable=False) + user_id: Mapped[str] = mapped_column(db.String(100), nullable=False) + done: Mapped[bool] = mapped_column(db.Boolean, default=False) @todo_bp.route('/') From 4d9483d05abb8042a8583f19709b645acf0cb12f Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Wed, 14 Jan 2026 13:38:47 +0000 Subject: [PATCH 15/27] Add admin interface with authentication and update requirements - Implemented AuthenticatedAdminIndexView and AuthenticatedModelView for secured admin access. - Initialized admin interface in app.py. - Added freeze.txt for dependency management. - Updated requirements.txt to include flask-admin with necessary extras. - Minor formatting adjustments in todo.py. --- admin.py | 32 +++++++++++ app.py | 6 +- freeze.txt | 145 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 4 +- todo.py | 1 + 5 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 admin.py create mode 100644 freeze.txt diff --git a/admin.py b/admin.py new file mode 100644 index 0000000..be8e3a3 --- /dev/null +++ b/admin.py @@ -0,0 +1,32 @@ +from flask import redirect, request, url_for +from flask_admin import Admin, AdminIndexView +from flask_admin.contrib.sqla import ModelView +from flask_babel import Babel +from auth import get_current_user + + +class AuthenticatedAdminIndexView(AdminIndexView): + def is_accessible(self): + return get_current_user() is not None + + def inaccessible_callback(self, name, **kwargs): + return redirect(url_for('auth.login', next=request.url)) + + +class AuthenticatedModelView(ModelView): + def is_accessible(self): + return get_current_user() is not None + + def inaccessible_callback(self, name, **kwargs): + return redirect(url_for('auth.login', next=request.url)) + + +def init_admin(app, db, model): + """Attach Babel and register secured admin views for the given model.""" + Babel(app, locale_selector=lambda: 'en') + admin = Admin(app, name="Admin", template_mode="bootstrap4", + index_view=AuthenticatedAdminIndexView()) + admin.add_view(AuthenticatedModelView(model, db.session, + endpoint="todo_admin", + name="Todos")) + return admin diff --git a/app.py b/app.py index 47ca576..89d09fd 100644 --- a/app.py +++ b/app.py @@ -7,6 +7,9 @@ from auth import auth_bp, auth0_bp, github_bp, github_auth_bp from auth import is_codespaces, is_render from todo import todo_bp, init_app as init_todo +from todo import db, Todo +from admin import init_admin + SITE = { "WebsiteName": "TodoApp", @@ -55,7 +58,8 @@ def inject_dict_for_all_templates(): # Use AUTH0_CALLBACK_URL from environment (for both local and production) redirect_uri = os.getenv('AUTH0_CALLBACK_URL', 'http://localhost:5000/callback') -# Use auth0_callback_url in your Auth0 configuration +# Initialize admin interface (secured) +init_admin(app, db, Todo) if __name__ == '__main__': app.run(debug=True) diff --git a/freeze.txt b/freeze.txt new file mode 100644 index 0000000..97f331f --- /dev/null +++ b/freeze.txt @@ -0,0 +1,145 @@ +anyio==4.11.0 +argon2-cffi==25.1.0 +argon2-cffi-bindings==25.1.0 +arrow==1.4.0 +asttokens==3.0.0 +async-lru==2.0.5 +attrs==25.4.0 +babel==2.17.0 +beautifulsoup4==4.14.2 +bleach==6.3.0 +blinker==1.9.0 +boto3==1.42.27 +botocore==1.42.27 +certifi==2025.10.5 +cffi==2.0.0 +charset-normalizer==3.4.4 +click==8.3.1 +colorama==0.4.6 +comm==0.2.3 +contourpy==1.3.3 +cycler==0.12.1 +debugpy==1.8.17 +decorator==5.2.1 +defusedxml==0.7.1 +executing==2.2.1 +fastjsonschema==2.21.2 +filelock==3.19.1 +Flask==2.3.2 +Flask-Admin==2.0.2 +flask-babel==4.0.0 +Flask-Dance==7.0.0 +Flask-SQLAlchemy==3.1.1 +fonttools==4.60.1 +fqdn==1.5.1 +fsspec==2025.9.0 +gitdb==4.0.12 +GitPython==3.1.45 +greenlet==3.2.4 +gunicorn==21.2.0 +h11==0.16.0 +httpcore==1.0.9 +httpx==0.28.1 +idna==3.11 +ipykernel==7.1.0 +ipython==9.7.0 +ipython_pygments_lexers==1.1.1 +isoduration==20.11.0 +itsdangerous==2.2.0 +jedi==0.19.2 +Jinja2==3.1.6 +jmespath==1.0.1 +joblib==1.5.2 +json5==0.12.1 +jsonpointer==3.0.0 +jsonschema==4.25.1 +jsonschema-specifications==2025.9.1 +jupyter-events==0.12.0 +jupyter-lsp==2.3.0 +jupyter-server-mathjax==0.2.6 +jupyter_client==8.6.3 +jupyter_core==5.9.1 +jupyter_server==2.17.0 +jupyter_server_terminals==0.5.3 +jupyterlab==4.4.10 +jupyterlab_git==0.51.2 +jupyterlab_pygments==0.3.0 +jupyterlab_server==2.28.0 +kiwisolver==1.4.9 +lark==1.3.1 +MarkupSafe==3.0.3 +matplotlib==3.10.7 +matplotlib-inline==0.2.1 +mistune==3.1.4 +mpmath==1.3.0 +narwhals==2.10.2 +nbclient==0.10.2 +nbconvert==7.16.6 +nbdime==4.0.2 +nbformat==5.10.4 +nest-asyncio==1.6.0 +networkx==3.5 +notebook_shim==0.2.4 +numpy==2.3.4 +oauthlib==3.3.1 +packaging==25.0 +pandas==2.3.3 +pandocfilters==1.5.1 +parso==0.8.5 +pexpect==4.9.0 +pillow==12.0.0 +platformdirs==4.5.0 +plotly==6.4.0 +prometheus_client==0.23.1 +prompt_toolkit==3.0.52 +psutil==7.1.3 +psycopg2-binary==2.9.11 +ptyprocess==0.7.0 +pure_eval==0.2.3 +pycparser==2.23 +Pygments==2.19.2 +pyparsing==3.2.5 +python-dateutil==2.9.0.post0 +python-dotenv==1.0.0 +python-json-logger==4.0.0 +pytz==2025.2 +PyYAML==6.0.3 +pyzmq==27.1.0 +referencing==0.37.0 +requests==2.32.5 +requests-oauthlib==2.0.0 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +rfc3987-syntax==1.1.0 +rpds-py==0.28.0 +s3transfer==0.16.0 +scikit-learn==1.7.2 +scipy==1.16.3 +seaborn==0.13.2 +Send2Trash==1.8.3 +setuptools==80.9.0 +six==1.17.0 +smmap==5.0.2 +sniffio==1.3.1 +soupsieve==2.8 +SQLAlchemy==2.0.44 +stack-data==0.6.3 +sympy==1.14.0 +tablib==3.9.0 +terminado==0.18.1 +threadpoolctl==3.6.0 +tinycss2==1.4.0 +torch==2.9.0+cpu +tornado==6.5.2 +traitlets==5.14.3 +typing_extensions==4.15.0 +tzdata==2025.2 +uri-template==1.3.0 +urllib3==2.5.0 +URLObject==3.0.0 +wcwidth==0.2.14 +webcolors==25.10.0 +webencodings==0.5.1 +websocket-client==1.9.0 +Werkzeug==3.1.4 +WTForms==3.2.1 diff --git a/requirements.txt b/requirements.txt index f8efd1d..45a1f4f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,6 @@ Flask==2.3.2 Flask-SQLAlchemy==3.1.1 Flask-Dance==7.0.0 gunicorn==21.2.0 -python-dotenv==1.0.0 \ No newline at end of file +python-dotenv==1.0.0 +flask-admin[sqlalchemy,s3,images,export,translation]==1.6.1 +setuptools<81 \ No newline at end of file diff --git a/todo.py b/todo.py index 299a7ed..e8f2e97 100644 --- a/todo.py +++ b/todo.py @@ -1,5 +1,6 @@ # todo.py - todo functionality from flask import Blueprint, render_template, request, redirect, session + # models.py from flask_sqlalchemy import SQLAlchemy from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass, Mapped, mapped_column From 1f4d3885664ae256a3c6d532daaceafc5b204537 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Wed, 14 Jan 2026 14:03:04 +0000 Subject: [PATCH 16/27] Refactor README for improved formatting and clarity --- README.md | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 150f89d..4b6191d 100644 --- a/README.md +++ b/README.md @@ -18,22 +18,27 @@ - Ready for Render deployment - GitHub Actions CI/CD --> + ### Flask - - Webserver with routing (a function for each url endpoint) - - Jinja templates for looping though and outputting data. - - todo.py contains the endpoints for the Todo app + +- Webserver with routing (a function for each url endpoint) +- Jinja templates for looping though and outputting data. +- todo.py contains the endpoints for the Todo app ### SQLAlchemy & SQLite / PostgreSQL - - SQL Database - - Managed by SQLAlchemy an Object Relationship Manager which allows you to write classes that define the data and provides the storage & CRUD for you. - - ORMs build the database for you from your classes, start with SQLite but you can move PostgreSQL or others when you are ready. - - todo.py includes the Todo class that provdes all you need for the building of the database and all the CRUD. + +- SQL Database +- Managed by SQLAlchemy an Object Relationship Manager which allows you to write classes that define the data and provides the storage & CRUD for you. +- ORMs build the database for you from your classes, start with SQLite but you can move PostgreSQL or others when you are ready. +- todo.py includes the Todo class that provdes all you need for the building of the database and all the CRUD. ### Authentication (GitHub + Auth0) - - GitHub OAuth (Flask-Dance) for local Windows development - - Auth0 OAuth for Codespaces and Render production + +- GitHub OAuth (Flask-Dance) for local Windows development +- Auth0 OAuth for Codespaces and Render production ### Render & Github Actions + - Ready for Render deployment - GitHub Actions CI/CD @@ -42,12 +47,14 @@ ### Clone the Repository **Using Git Command Line:** + ```bash git clone https://github.com/stretchyboy/python-todo.git cd python-todo ``` **Using GitHub Desktop:** + 1. Open GitHub Desktop 2. Click `File` → `Clone repository` 3. Select the `URL` tab @@ -71,12 +78,11 @@ cp .env.example .env Open `.env.example` and save as `.env` - ## Environment Configuration (.env) Create a `.env` file in the root directory with the following variables: -``` +```bash APP_SECRET_KEY=your-secret-key-here GITHUB_CLIENT_ID=your-github-client-id GITHUB_CLIENT_SECRET=your-github-client-secret @@ -129,7 +135,7 @@ For local Windows development with GitHub Desktop: Start the Flask development server: ```bash -python -m flask run +py -m flask run --host=localhost --port=5000 #it maybe python3 on your machine ``` The app will be available at [http://localhost:5000](http://localhost:5000) @@ -163,4 +169,3 @@ See [CODESPACES_SETUP.md](CODESPACES_SETUP.md) for complete GitHub Codespaces se ## Deployment on Render See [RENDER_SETUP.md](RENDER_SETUP.md) for complete Render deployment instructions, including setup, configuration, environment variables, and continuous deployment. - From 93a3817d022104376f3af827685fc7da78263a54 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Wed, 14 Jan 2026 14:03:15 +0000 Subject: [PATCH 17/27] Add flask_babel to requirements for internationalization support --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 45a1f4f..3c58234 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,5 +4,6 @@ Flask-SQLAlchemy==3.1.1 Flask-Dance==7.0.0 gunicorn==21.2.0 python-dotenv==1.0.0 +flask_babel==3.1.0 flask-admin[sqlalchemy,s3,images,export,translation]==1.6.1 setuptools<81 \ No newline at end of file From 6007c9b10bf9f39ecd09224e5e08db4d4b06d3cb Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Wed, 14 Jan 2026 14:05:12 +0000 Subject: [PATCH 18/27] Fix formatting in README for clarity in Flask run command --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4b6191d..c7fc449 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,7 @@ For local Windows development with GitHub Desktop: Start the Flask development server: ```bash -py -m flask run --host=localhost --port=5000 #it maybe python3 on your machine +py -m flask run --host=localhost --port=5000 # it maybe python3 on your machine ``` The app will be available at [http://localhost:5000](http://localhost:5000) From b88ab2c3b0dc8ebcc05739ae203401292b1a1364 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Wed, 14 Jan 2026 14:49:04 +0000 Subject: [PATCH 19/27] Adding catergories exercise --- .vscode/extensions.json | 3 +- ADDING_CATERGORIES.md | 300 ++++++++++++++++++++++++++++++++++++++++ README.md | 3 + 3 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 ADDING_CATERGORIES.md diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 8c9cbc8..d6ad130 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -3,6 +3,7 @@ "recommendations": [ "ms-python.python", "ms-python.vscode-pylance", - "qwtel.sqlite-viewer" + "qwtel.sqlite-viewer", + "mermaidchart.vscode-mermaid-chart" ] } diff --git a/ADDING_CATERGORIES.md b/ADDING_CATERGORIES.md new file mode 100644 index 0000000..aca93f6 --- /dev/null +++ b/ADDING_CATERGORIES.md @@ -0,0 +1,300 @@ +# How to Add Categories to Your Todo App + +This guide will walk you through adding categories (like "Urgent" and "Non-urgent") to your todo app. Follow each step carefully and copy the code exactly as shown. + +## What We're Building + +We're adding a **category system** to organize todos. Each todo must belong to one category (like "Urgent" or "Non-urgent"). Users will select a category from a dropdown menu when creating a new todo. Administrators can add, edit, or delete categories through the admin interface at `/admin/`. + +The system uses two database tables with a **one-to-many relationship**: one category can have many todos, but each todo belongs to exactly one category. + +```mermaid +erDiagram + Category ||--o{ Todo : "has many" + + Category { + int id PK + string name UK + } + + Todo { + int id PK + string task + string user_id + int category_id FK + boolean done + } +``` + +--- + +## Step 1: Update `todo.py` - Add the Category Model + +### 1.1: Add ForeignKey import +Find this line near the top of `todo.py`: +```python +from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass, Mapped, mapped_column +``` + +Change it to: +```python +from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass, Mapped, mapped_column +from sqlalchemy import ForeignKey +``` + +### 1.2: Add the Category class +Find the line that says `todo_bp = Blueprint('todo', __name__)`. + +**Just BEFORE** that line, add this new class: +```python +class Category(db.Model): + __tablename__ = "categories" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + name: Mapped[str] = mapped_column(db.String(50), nullable=False, unique=True) + + def __repr__(self): + return self.name + + +``` + +**Important:** Make sure to leave a blank line after `pass` and before `todo_bp = Blueprint`. + +### 1.3: Update the Todo class +Find the `Todo` class. It should look like this: +```python +class Todo(db.Model): + __tablename__ = "todos" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + task: Mapped[str] = mapped_column(db.String(200), nullable=False) + user_id: Mapped[str] = mapped_column(db.String(100), nullable=False) + done: Mapped[bool] = mapped_column(db.Boolean, default=False) +``` + +Add a new line after `user_id` to add the category field: +```python +class Todo(db.Model): + __tablename__ = "todos" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + task: Mapped[str] = mapped_column(db.String(200), nullable=False) + user_id: Mapped[str] = mapped_column(db.String(100), nullable=False) + category_id: Mapped[int] = mapped_column(ForeignKey('categories.id'), nullable=False) + done: Mapped[bool] = mapped_column(db.Boolean, default=False) +``` + +--- + +## Step 2: Update Routes in `todo.py` + +### 2.1: Update the home() function +Find the `home()` function and change it to pass categories to the template: + +**Old code:** +```python +@todo_bp.route('/') +def home(): + user = get_current_user() + if not user: + return render_template('login.html') + session['user_id'] = user["id"] + todos = Todo.query.filter_by(user_id=session['user_id']).all() + return render_template('index.html', todos=todos, user=user) +``` + +**New code:** +```python +@todo_bp.route('/') +def home(): + user = get_current_user() + if not user: + return render_template('login.html') + session['user_id'] = user["id"] + todos = Todo.query.filter_by(user_id=session['user_id']).all() + categories = Category.query.all() + return render_template('index.html', todos=todos, categories=categories, user=user) +``` + +### 2.2: Update the add() function +Find the `add()` function and change it to capture the category: + +**Old code:** +```python +@todo_bp.route('/add', methods=['POST']) +def add(): + if 'user_id' not in session: + return redirect('/') + task_text = request.form['task'] + new_task = Todo(task=task_text, done=False, user_id=session['user_id']) + db.session.add(new_task) + db.session.commit() + return redirect('/') +``` + +**New code:** +```python +@todo_bp.route('/add', methods=['POST']) +def add(): + if 'user_id' not in session: + return redirect('/') + task_text = request.form['task'] + category_id = request.form.get('category_id', type=int) + if not category_id: + return redirect('/') + new_task = Todo(task=task_text, category_id=category_id, user_id=session['user_id']) + db.session.add(new_task) + db.session.commit() + return redirect('/') +``` + +### 2.3: Update the init_app() function +Find the `init_app()` function at the bottom of `todo.py`. Add code to seed the initial categories: + +**Old code:** +```python +def init_app(app): + db.init_app(app) + with app.app_context(): + db.create_all() +``` + +**New code:** +```python +def init_app(app): + db.init_app(app) + with app.app_context(): + db.create_all() + # Seed initial categories if they don't exist + if Category.query.count() == 0: + urgent = Category(name="Urgent") + non_urgent = Category(name="Non-urgent") + db.session.add(urgent) + db.session.add(non_urgent) + db.session.commit() +``` + +--- + +## Step 3: Update `templates/index.html` - Add Category Dropdown + +Find the form in `index.html`: + +**Old code:** +```html +
      + + +
      +``` + +**New code:** +```html +
      + + + +
      +``` + +--- + +## Step 4: Update `app.py` - Import Category + +Find this line near the top of `app.py`: +```python +from todo import todo_bp, init_app as init_todo +from todo import db, Todo +``` + +Change it to: +```python +from todo import todo_bp, init_app as init_todo +from todo import db, Todo, Category +``` + +Then find this line near the bottom: +```python +init_admin(app, db, Todo) +``` + +Change it to: +```python +init_admin(app, db, Todo, Category) +``` + +--- + +## Step 5: Update `admin.py` - Add Category Admin View + +Find the `init_admin()` function in `admin.py`: + +**Old code:** +```python +def init_admin(app, db, model): + """Attach Babel and register secured admin views for the given model.""" + Babel(app, locale_selector=lambda: 'en') + admin = Admin(app, name="Admin", template_mode="bootstrap4", + index_view=AuthenticatedAdminIndexView()) + admin.add_view(AuthenticatedModelView(model, db.session, + endpoint="todo_admin", + name="Todos")) + return admin +``` + +**New code:** +```python +def init_admin(app, db, todo_model, category_model): + """Attach Babel and register secured admin views for the given models.""" + Babel(app, locale_selector=lambda: 'en') + admin = Admin(app, name="Admin", template_mode="bootstrap4", + index_view=AuthenticatedAdminIndexView()) + admin.add_view(AuthenticatedModelView(todo_model, db.session, + endpoint="todo_admin", + name="Todos")) + admin.add_view(AuthenticatedModelView(category_model, db.session, + endpoint="category_admin", + name="Categories")) + return admin +``` + +--- + +## Step 6: Reset Your Database + +Because you've changed the database structure, you need to delete the old database: + +1. Stop your Flask app if it's running (press Ctrl+C in the terminal) +2. Delete the database file from teh instance folder. + +Restart your Flask app: +```bash +py -m flask run --host=localhost --port=5000 # it maybe python3 on your machine +``` + +The app will create a new database with the "Urgent" and "Non-urgent" categories automatically. + +--- + +## Testing Your Changes + +1. Go to the home page - you should see a dropdown to select a category when adding a task +2. Add a task with a category selected +3. Log in and go to `/admin/` to see the Categories section where you can add, edit, or delete categories + +--- + +## Summary of Changes + +- **Created** a new `Category` model +- **Added** a foreign key relationship from `Todo` to `Category` +- **Updated** the form to include a category dropdown +- **Modified** the add route to capture the selected category +- **Added** automatic seeding of initial categories +- **Enabled** category management in the admin interface \ No newline at end of file diff --git a/README.md b/README.md index c7fc449..dfa3861 100644 --- a/README.md +++ b/README.md @@ -158,8 +158,11 @@ The database file is stored in `/instance/todo.db` ## Your Development +Try [ADDING_CATERGORIES.md](ADDING_CATERGORIES.md) to add one-to-many relationship and Catergories for the tasks. +Then what could you make with the same ideas but different entities (things)? +Books and People could make a library etc .... ## Codespaces Setup From 247f7c9c6a754b2172552615bb8d2472453c71c0 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Thu, 15 Jan 2026 09:04:56 +0000 Subject: [PATCH 20/27] Add initial sample Todo item for new users and fix the userid creation for github only login --- auth/github.py | 2 +- todo.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/auth/github.py b/auth/github.py index dace956..2922f08 100644 --- a/auth/github.py +++ b/auth/github.py @@ -20,7 +20,7 @@ def get_github_user(): data = session["github"] # Prefix user id for compatibility user = { - "id": f"github:{data['id']}", + "id": f"github|{data['id']}", "name": data["login"], "email": data.get("email", "") } diff --git a/todo.py b/todo.py index e8f2e97..d9b460c 100644 --- a/todo.py +++ b/todo.py @@ -4,6 +4,7 @@ # models.py from flask_sqlalchemy import SQLAlchemy from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass, Mapped, mapped_column +from sqlalchemy import ForeignKey from auth import get_current_user @@ -68,3 +69,8 @@ def init_app(app): db.init_app(app) with app.app_context(): db.create_all() + + if Todo.query.count() == 0: + mreggleton = Todo(task="Mr Eggleton checking your Todo App!", done=False, user_id="github|5987806") + db.session.add(mreggleton) + db.session.commit() \ No newline at end of file From c5911503487561e447bdbc715786ac77a8f1fc31 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Thu, 15 Jan 2026 10:46:54 +0000 Subject: [PATCH 21/27] Improve the documention --- ADDING_CATERGORIES.md | 52 ++++++++++++++++++++------------- CODESPACES_SETUP.md | 2 +- README.md | 68 +++++++++++++++---------------------------- RENDER_SETUP.md | 2 +- 4 files changed, 57 insertions(+), 67 deletions(-) diff --git a/ADDING_CATERGORIES.md b/ADDING_CATERGORIES.md index aca93f6..863d4ce 100644 --- a/ADDING_CATERGORIES.md +++ b/ADDING_CATERGORIES.md @@ -30,22 +30,10 @@ erDiagram ## Step 1: Update `todo.py` - Add the Category Model -### 1.1: Add ForeignKey import -Find this line near the top of `todo.py`: -```python -from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass, Mapped, mapped_column -``` +### 1.1: Add the Category class +Find the line that says `db = SQLAlchemy(model_class=Base)`. -Change it to: -```python -from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass, Mapped, mapped_column -from sqlalchemy import ForeignKey -``` - -### 1.2: Add the Category class -Find the line that says `todo_bp = Blueprint('todo', __name__)`. - -**Just BEFORE** that line, add this new class: +**Just AFTER** that line, add this new class: ```python class Category(db.Model): __tablename__ = "categories" @@ -53,15 +41,13 @@ class Category(db.Model): id: Mapped[int] = mapped_column(primary_key=True, init=False) name: Mapped[str] = mapped_column(db.String(50), nullable=False, unique=True) - def __repr__(self): + def __repr__(self): # When you try to print or put this object in a template represent it as it's name return self.name ``` -**Important:** Make sure to leave a blank line after `pass` and before `todo_bp = Blueprint`. - -### 1.3: Update the Todo class +### 1.2: Update the Todo class Find the `Todo` class. It should look like this: ```python class Todo(db.Model): @@ -73,7 +59,7 @@ class Todo(db.Model): done: Mapped[bool] = mapped_column(db.Boolean, default=False) ``` -Add a new line after `user_id` to add the category field: +Add a new line after `user_id` to add the category field. And add a new function / method which will make todo.catergory return the Catergory object that is linked by the catergory_id Foreign Key: ```python class Todo(db.Model): __tablename__ = "todos" @@ -83,6 +69,10 @@ class Todo(db.Model): user_id: Mapped[str] = mapped_column(db.String(100), nullable=False) category_id: Mapped[int] = mapped_column(ForeignKey('categories.id'), nullable=False) done: Mapped[bool] = mapped_column(db.Boolean, default=False) + + @property # todo.category is a property (member variable) of the todo object + def category(self): # return the category object linked to this Todo by category_id + return Category.query.get(self.category_id) ``` --- @@ -158,6 +148,11 @@ def init_app(app): db.init_app(app) with app.app_context(): db.create_all() + + if Todo.query.count() == 0: + mreggleton = Todo(task="Mr Eggleton checking your Todo App!", done=False, user_id="github|5987806") + db.session.add(mreggleton) + db.session.commit() ``` **New code:** @@ -173,6 +168,11 @@ def init_app(app): db.session.add(urgent) db.session.add(non_urgent) db.session.commit() + + if Todo.query.count() == 0: + mreggleton_check = Todo(task="Mr Eggleton checking your Todo App!", done=False, user_id="github|5987806", category_id=non_urgent.id) + db.session.add(mreggleton_check) + db.session.commit() ``` --- @@ -203,6 +203,18 @@ Find the form in `index.html`: ``` +Find the task text being printed out and add the + +**Old code:** +```html + {{ todo.task }} +``` + +**New code:** +```html + {{ todo.task }} [{{ todo.category }}] +``` + --- ## Step 4: Update `app.py` - Import Category diff --git a/CODESPACES_SETUP.md b/CODESPACES_SETUP.md index 67b4632..cdc1fe7 100644 --- a/CODESPACES_SETUP.md +++ b/CODESPACES_SETUP.md @@ -7,7 +7,7 @@ GitHub Codespaces is a flexible cloud-based development environment. Your editor ### Create a New Codespace 1. **Go to the Repository** - - Navigate to [https://github.com/stretchyboy/python-todo](https://github.com/stretchyboy/python-todo) (or your fork) + - Navigate to [https://github.com/mr-eggleton/python-flask-todo](https://github.com/mr-eggleton/python-flask-todo) (or your fork) 2. **Create a Codespace** - Click the green **"Code"** button diff --git a/README.md b/README.md index dfa3861..da73eee 100644 --- a/README.md +++ b/README.md @@ -4,43 +4,37 @@ ![Flask](https://img.shields.io/badge/Flask-2.3-green) ![Render](https://img.shields.io/badge/Deploy-Render-purple) +A simple Python Todo Web App to do some improvments on and be a starting point for your own more apps. + + ## Features - ### Flask -- Webserver with routing (a function for each url endpoint) -- Jinja templates for looping though and outputting data. +- [Flask](https://flask.palletsprojects.com/en/stable/) based Python Webserver with routing (a function for each url endpoint users can visit) +- HTML / [Jinja templates](https://jinja.palletsprojects.com/en/stable/templates/) for looping though and outputting data. - todo.py contains the endpoints for the Todo app ### SQLAlchemy & SQLite / PostgreSQL -- SQL Database -- Managed by SQLAlchemy an Object Relationship Manager which allows you to write classes that define the data and provides the storage & CRUD for you. -- ORMs build the database for you from your classes, start with SQLite but you can move PostgreSQL or others when you are ready. -- todo.py includes the Todo class that provdes all you need for the building of the database and all the CRUD. +- SQL Databases the modern way +- Managed by [SQLAlchemy](https://www.sqlalchemy.org/) an ORM / [Object Relationship Mapper](https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping) which allows you to write classes that define the data and provides the storage & [CRUD](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete) for you. +- ORMs build the database for you from your classes so you define what you want to store how it connects together and any extras calculations / functions you need . +- Start with SQLite but you can move to proffesional systems like PostgreSQL or others when you are ready. +- todo.py includes the Todo class that provdes all you need for the building of the database and all the [CRUD](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete). ### Authentication (GitHub + Auth0) +Authentication is the act of proving who you are, in this system we use external Authentication systems so we aren't storing usernames & passwords (reducing the DPA responsiblilties ) + - GitHub OAuth (Flask-Dance) for local Windows development - Auth0 OAuth for Codespaces and Render production ### Render & Github Actions -- Ready for Render deployment -- GitHub Actions CI/CD +- Ready for Render deployment so you can publish and use the site for free (there are some speed limitations) +- GitHub Actions CI/CD to build the site when you commit a working version +- Can be upgraded to use a free PostgreSQL daatbase server (but there are some other ) ## Setup @@ -49,8 +43,8 @@ **Using Git Command Line:** ```bash -git clone https://github.com/stretchyboy/python-todo.git -cd python-todo +git clone https://github.com/mr-eggleton/python-flask-todo.git +cd python-flask-todo ``` **Using GitHub Desktop:** @@ -58,7 +52,7 @@ cd python-todo 1. Open GitHub Desktop 2. Click `File` → `Clone repository` 3. Select the `URL` tab -4. Enter: `https://github.com/stretchyboy/python-todo.git` +4. Enter: `https://github.com/mr-eggleton/python-flask-todo.git` 5. Choose a local path and click `Clone` ### Install Dependencies @@ -74,30 +68,13 @@ py -m pip install -r requirements.txt cp .env.example .env ``` -### On Windows in VS Code +#### On Windows in VS Code Open `.env.example` and save as `.env` ## Environment Configuration (.env) -Create a `.env` file in the root directory with the following variables: - -```bash -APP_SECRET_KEY=your-secret-key-here -GITHUB_CLIENT_ID=your-github-client-id -GITHUB_CLIENT_SECRET=your-github-client-secret -AUTH0_DOMAIN=your-auth0-domain.auth0.com -AUTH0_CLIENT_ID=your-auth0-client-id -AUTH0_CLIENT_SECRET=your-auth0-client-secret -AUTH0_CALLBACK_URL=http://localhost:5000/callback -OAUTHLIB_INSECURE_TRANSPORT=1 -``` - -### Generate APP_SECRET_KEY - -```bash -python -c "import secrets; print(secrets.token_hex(32))" -``` +Edit the file to put the details you need in. But @ UTC Sheffield OLP, Mr Eggleton will give you a .env file that will work with github, and you don't need to do the "Authentication Setup" and you can skip to ['Running the Application'](#running-the-application) ## Authentication Setup @@ -152,13 +129,14 @@ The database file is stored in `/instance/todo.db` - Persistent records in a database. The current database will be destroyed each time you push to render, ( You can modify the code once it's on Render to move to PostgreSQL ). - Changing database structure SQLAlchemy Migrations. Currently we aren't handling changes to the database structure so you need to delete the local .db and start again (render wil do this anyway on a rebuild as mentioned above). They can be handled with Migrations -- Storing any user data in a database (other than an id from github ). To have users on this system to store any other PII refer to [https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy](https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy) and change the privacy statement. +- Minimal Autorisation all Authenticated users can do everything on the site. +- Storing any user data in a database (other than an id from github or Auth0 ). To have users on this system to store any other PII refer to [https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy](https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy) and change the privacy statement. - Adding extra security [https://flask-security.readthedocs.io/en/stable/quickstart.html#basic-flask-sqlalchemy-application](https://flask-security.readthedocs.io/en/stable/quickstart.html#basic-flask-sqlalchemy-application) - Testing. There are no tests in this code. ## Your Development -Try [ADDING_CATERGORIES.md](ADDING_CATERGORIES.md) to add one-to-many relationship and Catergories for the tasks. +Try [ADDING_CATERGORIES.md](ADDING_CATERGORIES.md) to add a one-to-many relationship and Categories for the tasks. Then what could you make with the same ideas but different entities (things)? diff --git a/RENDER_SETUP.md b/RENDER_SETUP.md index 9259767..fbf910a 100644 --- a/RENDER_SETUP.md +++ b/RENDER_SETUP.md @@ -74,7 +74,7 @@ Ensure your repository contains: **Important:** Do NOT set `RENDER_EXTERNAL_HOSTNAME` manually. Render sets this automatically, but it's only available at runtime, not during build. - **For Auth0 Configuration:** Use your actual Render app URL (e.g., `https://python-todo.onrender.com`) in Auth0 settings, not the variable name. + **For Auth0 Configuration:** Use your actual Render app URL (e.g., `https://python-flask-todo.onrender.com`) in Auth0 settings, not the variable name. 3. **Automatic Deployment** - Render will automatically build and deploy your application From 35a87858459852cabcc5bb2b342cc7c8b1fab27c Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Thu, 15 Jan 2026 15:12:37 +0000 Subject: [PATCH 22/27] Update .gitignore and improve README for use as a slide show --- .gitignore | 4 ++++ README.md | 68 ++++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 52 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index b7faf40..0882edc 100644 --- a/.gitignore +++ b/.gitignore @@ -205,3 +205,7 @@ cython_debug/ marimo/_static/ marimo/_lsp/ __marimo__/ + + +# Obsidian-Vault +.obsidian/ \ No newline at end of file diff --git a/README.md b/README.md index da73eee..39d44d0 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,9 @@ ![Flask](https://img.shields.io/badge/Flask-2.3-green) ![Render](https://img.shields.io/badge/Deploy-Render-purple) -A simple Python Todo Web App to do some improvments on and be a starting point for your own more apps. +A simple Python Todo Web App to do some improvements on and be a starting point for your own simple web apps. +--- ## Features @@ -15,13 +16,21 @@ A simple Python Todo Web App to do some improvments on and be a starting point f - HTML / [Jinja templates](https://jinja.palletsprojects.com/en/stable/templates/) for looping though and outputting data. - todo.py contains the endpoints for the Todo app +--- + ### SQLAlchemy & SQLite / PostgreSQL -- SQL Databases the modern way +- SQL Databases the modern way - Managed by [SQLAlchemy](https://www.sqlalchemy.org/) an ORM / [Object Relationship Mapper](https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping) which allows you to write classes that define the data and provides the storage & [CRUD](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete) for you. + +-- +###  [Object Relationship Mapper](https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping) + - ORMs build the database for you from your classes so you define what you want to store how it connects together and any extras calculations / functions you need . - Start with SQLite but you can move to proffesional systems like PostgreSQL or others when you are ready. -- todo.py includes the Todo class that provdes all you need for the building of the database and all the [CRUD](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete). +- todo.py includes the Todo class that provdes all you need for the building of the database and all the [CRUD](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete). + +--- ### Authentication (GitHub + Auth0) @@ -30,22 +39,23 @@ Authentication is the act of proving who you are, in this system we use external - GitHub OAuth (Flask-Dance) for local Windows development - Auth0 OAuth for Codespaces and Render production +--- + ### Render & Github Actions -- Ready for Render deployment so you can publish and use the site for free (there are some speed limitations) +- Ready for [Render](https://render.com/) deployment so you can publish and use the site online for free (there are some speed limitations) - GitHub Actions CI/CD to build the site when you commit a working version - Can be upgraded to use a free PostgreSQL daatbase server (but there are some other ) +--- + ## Setup -### Clone the Repository +### Start from the Template -**Using Git Command Line:** +1. Go to the github repository: -```bash -git clone https://github.com/mr-eggleton/python-flask-todo.git -cd python-flask-todo -``` +### Clone the Repository **Using GitHub Desktop:** @@ -54,27 +64,34 @@ cd python-flask-todo 3. Select the `URL` tab 4. Enter: `https://github.com/mr-eggleton/python-flask-todo.git` 5. Choose a local path and click `Clone` +6. Click 'Open in Visual Studio Code' to open the project in VS Code -### Install Dependencies +--- + +**Using Git Command Line:** ```bash -py -m pip install -r requirements.txt +git clone https://github.com/mr-eggleton/python-flask-todo.git +cd python-flask-todo ``` -### Copy Example Environment File +--- + +### Install Dependencies ```bash -# On linux or codespaces -cp .env.example .env +py -m pip install -r requirements.txt # You'll need python3 ... in linux ``` -#### On Windows in VS Code +--- -Open `.env.example` and save as `.env` +### Environment Configuration (.env) -## Environment Configuration (.env) +In VS Code open `.env.example` and save it as `.env` -Edit the file to put the details you need in. But @ UTC Sheffield OLP, Mr Eggleton will give you a .env file that will work with github, and you don't need to do the "Authentication Setup" and you can skip to ['Running the Application'](#running-the-application) +Edit the file to put the details you need in. But @ UTC Sheffield OLP, Mr Eggleton will give you a .env file that will work with github, and you don't need to do the "Authentication Setup" as you are using his and you can skip to ['Running the Application'](#running-the-application) + +--- ## Authentication Setup @@ -88,6 +105,8 @@ This app automatically detects your environment and uses the appropriate authent The app checks for Codespaces environment variables (`CODESPACES`, `CODESPACE_NAME`) and routes accordingly. +--- + ### GitHub OAuth Setup (Local Development) For local Windows development with GitHub Desktop: @@ -107,6 +126,8 @@ For local Windows development with GitHub Desktop: 3. **Enable Insecure Transport for Local Dev** - Set `OAUTHLIB_INSECURE_TRANSPORT=1` in `.env` (only for local development) +--- + ## Running the Application Start the Flask development server: @@ -117,6 +138,8 @@ py -m flask run --host=localhost --port=5000 # it maybe python3 on your machine The app will be available at [http://localhost:5000](http://localhost:5000) +--- + ## The Database This code uses [SQLAlchemy](https://www.sqlalchemy.org/) to set up classes that have methods to talk to many [databases](https://docs.sqlalchemy.org/en/20/dialects/index.html). We use **SQLite for simplicity and easy local development**. @@ -125,6 +148,8 @@ This code uses [SQLAlchemy](https://www.sqlalchemy.org/) to set up classes that The database file is stored in `/instance/todo.db` +--- + ## Things we are ignoring - Persistent records in a database. The current database will be destroyed each time you push to render, ( You can modify the code once it's on Render to move to PostgreSQL ). @@ -132,7 +157,9 @@ The database file is stored in `/instance/todo.db` - Minimal Autorisation all Authenticated users can do everything on the site. - Storing any user data in a database (other than an id from github or Auth0 ). To have users on this system to store any other PII refer to [https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy](https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy) and change the privacy statement. - Adding extra security [https://flask-security.readthedocs.io/en/stable/quickstart.html#basic-flask-sqlalchemy-application](https://flask-security.readthedocs.io/en/stable/quickstart.html#basic-flask-sqlalchemy-application) -- Testing. There are no tests in this code. +- Testing. There are no tests in this code, although Flask, SQL Alchemy and the other libraries used are thouroughly tested and are checked for security issues. + +--- ## Your Development @@ -142,6 +169,7 @@ Then what could you make with the same ideas but different entities (things)? Books and People could make a library etc .... +--- ## Codespaces Setup From 871be2f96069ec05f2886c23ea34b9cd6b2a47e6 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Thu, 15 Jan 2026 15:26:00 +0000 Subject: [PATCH 23/27] Update setup documentation for clarity and consistency across files --- CODESPACES_SETUP.md | 4 ++-- README.md | 17 ++++++++++++++--- RENDER_SETUP.md | 2 +- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CODESPACES_SETUP.md b/CODESPACES_SETUP.md index cdc1fe7..b3c7d50 100644 --- a/CODESPACES_SETUP.md +++ b/CODESPACES_SETUP.md @@ -6,8 +6,8 @@ GitHub Codespaces is a flexible cloud-based development environment. Your editor ### Create a New Codespace -1. **Go to the Repository** - - Navigate to [https://github.com/mr-eggleton/python-flask-todo](https://github.com/mr-eggleton/python-flask-todo) (or your fork) +1. **Go to your Repository** + - Navigate to your **python-flask-todo** 2. **Create a Codespace** - Click the green **"Code"** button diff --git a/README.md b/README.md index 39d44d0..c9ecba8 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,18 @@ Authentication is the act of proving who you are, in this system we use external ### Start from the Template -1. Go to the github repository: +1. Go to the github repository [https://github.com/UTCSheffield/python-flask-todo](https://github.com/UTCSheffield/python-flask-todo) +2. Click the green "Use this template" button at the top of the page +3. Select "Create a new repository" +4. Fill in your new repository details: + - Choose a repository name (e.g., `python-flask-todo`) + - Add a description (optional) + - Choose Public or Private visibility +5. Click "Create repository from template" +6. Your new repository will be created with all the template files +7. Now clone your new repository using one of the methods below + +--- ### Clone the Repository @@ -62,7 +73,7 @@ Authentication is the act of proving who you are, in this system we use external 1. Open GitHub Desktop 2. Click `File` → `Clone repository` 3. Select the `URL` tab -4. Enter: `https://github.com/mr-eggleton/python-flask-todo.git` +4. Enter: `https://github.com/UTCSheffield/python-flask-todo.git` 5. Choose a local path and click `Clone` 6. Click 'Open in Visual Studio Code' to open the project in VS Code @@ -71,7 +82,7 @@ Authentication is the act of proving who you are, in this system we use external **Using Git Command Line:** ```bash -git clone https://github.com/mr-eggleton/python-flask-todo.git +git clone https://github.com/UTCSheffield/python-flask-todo.git cd python-flask-todo ``` diff --git a/RENDER_SETUP.md b/RENDER_SETUP.md index fbf910a..4f0f275 100644 --- a/RENDER_SETUP.md +++ b/RENDER_SETUP.md @@ -49,7 +49,7 @@ Ensure your repository contains: 3. **Connect Your GitHub Repository** - Click "Connect account" if this is your first time - Authorize Render to access your GitHub repositories - - Search for and select `mr-eggleton/python-flask-todo` (or your fork) + - Search for select your version of `python-flask-todo` - Click "Connect" 4. **Review Blueprint Configuration** From 3327cf9e7f425203bb2710010e691eee6a45a998 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Fri, 16 Jan 2026 13:08:14 +0000 Subject: [PATCH 24/27] Lesson plan --- .env.example | 8 +- ADDING_CATERGORIES.md | 40 +++- LESSON.md | 487 ++++++++++++++++++++++++++++++++++++++++++ README.md | 58 ++--- SaveAs.png | Bin 0 -> 2431 bytes 5 files changed, 560 insertions(+), 33 deletions(-) create mode 100644 LESSON.md create mode 100644 SaveAs.png diff --git a/.env.example b/.env.example index 043d9db..11505d0 100644 --- a/.env.example +++ b/.env.example @@ -1,7 +1,13 @@ APP_SECRET_KEY=your_flask_secret -OAUTHLIB_INSECURE_TRANSPORT=0 DATABASE_URL=sqlite:///todo.db +# Example environment variables for GitHub OAuth for local development +GITHUB_CLIENT_ID=your_client_id +GITHUB_CLIENT_SECRET=your_client_secret +# Only needed for local/GitHub OAuth +# OAUTHLIB_INSECURE_TRANSPORT=1 + + # Example environment variables for Auth0 integration AUTH0_DOMAIN=your_auth0_domain AUTH0_CLIENT_ID=your_client_id diff --git a/ADDING_CATERGORIES.md b/ADDING_CATERGORIES.md index 863d4ce..a99eeea 100644 --- a/ADDING_CATERGORIES.md +++ b/ADDING_CATERGORIES.md @@ -8,6 +8,8 @@ We're adding a **category system** to organize todos. Each todo must belong to o The system uses two database tables with a **one-to-many relationship**: one category can have many todos, but each todo belongs to exactly one category. +--- + ```mermaid erDiagram Category ||--o{ Todo : "has many" @@ -31,9 +33,11 @@ erDiagram ## Step 1: Update `todo.py` - Add the Category Model ### 1.1: Add the Category class + Find the line that says `db = SQLAlchemy(model_class=Base)`. **Just AFTER** that line, add this new class: + ```python class Category(db.Model): __tablename__ = "categories" @@ -48,7 +52,9 @@ class Category(db.Model): ``` ### 1.2: Update the Todo class + Find the `Todo` class. It should look like this: + ```python class Todo(db.Model): __tablename__ = "todos" @@ -59,7 +65,8 @@ class Todo(db.Model): done: Mapped[bool] = mapped_column(db.Boolean, default=False) ``` -Add a new line after `user_id` to add the category field. And add a new function / method which will make todo.catergory return the Catergory object that is linked by the catergory_id Foreign Key: +Add a new line after `user_id` to add the category field. And add a new function / method which will make todo.category return the Category object that is linked by the category_id Foreign Key: + ```python class Todo(db.Model): __tablename__ = "todos" @@ -80,9 +87,11 @@ class Todo(db.Model): ## Step 2: Update Routes in `todo.py` ### 2.1: Update the home() function + Find the `home()` function and change it to pass categories to the template: **Old code:** + ```python @todo_bp.route('/') def home(): @@ -95,6 +104,7 @@ def home(): ``` **New code:** + ```python @todo_bp.route('/') def home(): @@ -108,9 +118,11 @@ def home(): ``` ### 2.2: Update the add() function + Find the `add()` function and change it to capture the category: **Old code:** + ```python @todo_bp.route('/add', methods=['POST']) def add(): @@ -124,6 +136,7 @@ def add(): ``` **New code:** + ```python @todo_bp.route('/add', methods=['POST']) def add(): @@ -140,9 +153,11 @@ def add(): ``` ### 2.3: Update the init_app() function + Find the `init_app()` function at the bottom of `todo.py`. Add code to seed the initial categories: **Old code:** + ```python def init_app(app): db.init_app(app) @@ -156,6 +171,7 @@ def init_app(app): ``` **New code:** + ```python def init_app(app): db.init_app(app) @@ -182,6 +198,7 @@ def init_app(app): Find the form in `index.html`: **Old code:** + ```html
      @@ -190,6 +207,7 @@ Find the form in `index.html`: ``` **New code:** + ```html @@ -203,14 +221,16 @@ Find the form in `index.html`:
      ``` -Find the task text being printed out and add the +Find the task text being printed out and add the category next to it: **Old code:** + ```html {{ todo.task }} ``` **New code:** + ```html {{ todo.task }} [{{ todo.category }}] ``` @@ -220,23 +240,27 @@ Find the task text being printed out and add the ## Step 4: Update `app.py` - Import Category Find this line near the top of `app.py`: + ```python from todo import todo_bp, init_app as init_todo from todo import db, Todo ``` Change it to: + ```python from todo import todo_bp, init_app as init_todo from todo import db, Todo, Category ``` Then find this line near the bottom: + ```python init_admin(app, db, Todo) ``` Change it to: + ```python init_admin(app, db, Todo, Category) ``` @@ -248,6 +272,7 @@ init_admin(app, db, Todo, Category) Find the `init_admin()` function in `admin.py`: **Old code:** + ```python def init_admin(app, db, model): """Attach Babel and register secured admin views for the given model.""" @@ -261,6 +286,7 @@ def init_admin(app, db, model): ``` **New code:** + ```python def init_admin(app, db, todo_model, category_model): """Attach Babel and register secured admin views for the given models.""" @@ -283,12 +309,12 @@ def init_admin(app, db, todo_model, category_model): Because you've changed the database structure, you need to delete the old database: 1. Stop your Flask app if it's running (press Ctrl+C in the terminal) -2. Delete the database file from teh instance folder. - +2. Delete the database file from the instance folder. + Restart your Flask app: + ```bash -py -m flask run --host=localhost --port=5000 # it maybe python3 on your machine -``` +python3 -m flask run --host=localhost --port=5000 The app will create a new database with the "Urgent" and "Non-urgent" categories automatically. @@ -309,4 +335,4 @@ The app will create a new database with the "Urgent" and "Non-urgent" categories - **Updated** the form to include a category dropdown - **Modified** the add route to capture the selected category - **Added** automatic seeding of initial categories -- **Enabled** category management in the admin interface \ No newline at end of file +- **Enabled** category management in the admin interface diff --git a/LESSON.md b/LESSON.md new file mode 100644 index 0000000..f7f2b61 --- /dev/null +++ b/LESSON.md @@ -0,0 +1,487 @@ + +# Python as Dynamic Webserver + +--- + +## Web Tech + +```mermaid +mindmap + Web Server + HTML #10003; + Assets + Images #10003; + CSS #10003; + Javascript #10003; + Data Sources + Text Files #10003; + API + Database + Authentication + Types + Hand Built #10003; + Static Built #10003; + Dynamic + +``` + +--- +## Flask Todo App Starter + +A simple Python Todo Web App to do some improvements on and be a starting point for your own simple web apps. + +## [https://github.com/UTCSheffield/python-flask-todo](https://github.com/UTCSheffield/python-flask-todo) + +--- + +## Features + +### Flask + +- [Flask](https://flask.palletsprojects.com/en/stable/) based Python Webserver with routing (a function for each url endpoint users can visit) +- HTML / [Jinja templates](https://jinja.palletsprojects.com/en/stable/templates/) for looping though and outputting data and keeping process and display seperate.. +- todo.py contains the endpoints for the Todo app + +--- + +### SQLAlchemy & SQLite / PostgreSQL + +- SQL Databases the modern way +- Managed by [SQLAlchemy](https://www.sqlalchemy.org/) an ORM / [Object Relationship Mapper](https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping) which allows you to write classes that define the data and provides the storage & [CRUD](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete) for you. + +--- + +###  [Object Relationship Mapper](https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping) + +- ORMs build the database for you from your classes so you define what you want to store how it connects together and any extras calculations / functions you need . +- Start with SQLite but you can move to professional systems like PostgreSQL or others when you are ready. +- todo.py includes the Todo class that provides all you need for the building of the database and all the [CRUD](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete). + +--- + +### SQLAlchemy Snippet + +```python +class Todo(db.Model): +    __tablename__ = "todos" + +    id: Mapped[int] = mapped_column(primary_key=True, init=False) +    task: Mapped[str] = mapped_column(db.String(200), nullable=False) +    user_id: Mapped[str] = mapped_column(db.String(100), nullable=False) +    done: Mapped[bool] = mapped_column(db.Boolean, default=False) +``` + +--- +### Flask Snippet + +```python +@todo_bp.route('/') +def home(): +    user = get_current_user() +    if not user: +        return render_template('login.html') + +    session['user_id'] = user["id"] +    todos = Todo.query.filter_by(user_id=session['user_id']).all() +    return render_template('index.html', todos=todos, user=user) +``` +#### CRUD Admin Snippet + +```python +init_admin(app, db, Todo) +``` + +--- + +### Authentication (GitHub + Auth0) + +Authentication is the act of proving who you are, in this system we use external authentication systems so we aren't storing usernames & passwords (reducing the DPA responsiblilties ). There are still some so we provide a privacy policy. + +- GitHub OAuth (Flask-Dance) for local Windows development +- Auth0 OAuth for Codespaces and Render production + +--- + +### Render & Github Actions + +- Ready for [Render](https://render.com/) deployment so you can publish and use the site online for free (there are some speed limitations) +- GitHub Actions CI/CD to build the site when you commit a working version +- Can be upgraded to use a free PostgreSQL database server (but there are some other steps) + +--- + +## Setup + +### Start from the Template + +1. Login to [github.com](https://github.com/) +2. Go to the github repository [https://github.com/UTCSheffield/python-flask-todo](https://github.com/UTCSheffield/python-flask-todo) +3. Click the green "Use this template" button at the top of the page +4. Select "Create a new repository" +5. Fill in your new repository details: + - Choose a repository name (e.g., `python-flask-todo`) + - Add a description (optional) + - Choose Public or Private visibility +6. Click "Create repository from template" +7. Your new repository will be created with all the template files + +--- + +### Clone your Repository locally + +**Using GitHub Desktop:** + +1. On the GitHub page for your new repository +2. Click the green "Code" button +3. Click "Open with GitHub Desktop" +4. You may need to login to GitHub Desktop if you haven't already +5. You may be prompted to choose a local path to clone the repository to +6. Click 'Open in Visual Studio Code' to open the project in VS Code + +--- + +## Top Tip + +Split screen with the browser with README or LESSON open on one side and VS Code on the other. + +--- + +### Install Dependencies + +```bash +py -m pip install -r requirements.txt # You'll need python3 ... in linux +``` + +--- + +### Environment Configuration (.env) + +In VS Code open `.env.example` and save it as `.env` + +![[SaveAs.png]] + +You will need to set **Save as type** to "No Extension (*.)" which is at the bottom of the list + +@ UTC Sheffield OLP, Mr Eggleton will give you the contents for the `.env` file that will work with our github setup, + +--- + +## Running the Application + +Start the Flask development server: + +```bash +py -m flask run --host=localhost --port=5000 # it maybe python3 on your machine +``` + +The app will be available at [http://localhost:5000](http://localhost:5000) + +Try it, login and create a few tasks! + +--- + +## The Database + +This code uses [SQLAlchemy](https://www.sqlalchemy.org/) to set up classes that have methods to talk to many [databases](https://docs.sqlalchemy.org/en/20/dialects/index.html). We use **SQLite for simplicity and easy local development**. + +--- + +### Local Development (SQLite) + +The database file is stored in `/instance/todo.db` + +Hopefully Visual Code has promoted you to install the recommended extensions including the SQLite extension. and so it should appear in the left hand side explorer view with a red icon. + +Have a look, can you see the tables and data? + +--- + +## What We're Building Next + +Next your going to add a **category system** to organize todos. Each todo must belong to one category (like "Urgent" or "Non-urgent"). Users will select a category from a dropdown menu when creating a new todo. Administrators can add, edit, or delete categories through the admin interface at `/admin/`. + +--- + +The system uses two database tables with a **one-to-many relationship**: one category can have many todos, but each todo belongs to exactly one category. + +```mermaid +erDiagram + Category ||--o{ Todo : "has many" + + Category { + int id PK + string name UK + } + + Todo { + int id PK + string task + string user_id + int category_id FK + boolean done + } +``` + +--- + +## Step 1: Update `todo.py` - Add the Category Model + +### 1.1: Add the Category class + +Find the line that says `db = SQLAlchemy(model_class=Base)`. + +**Just AFTER** that line, add this new class: + +```python +class Category(db.Model): + __tablename__ = "categories" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + name: Mapped[str] = mapped_column(db.String(50), nullable=False, unique=True) + + def __repr__(self): # When you try to print or put this object in a template represent it as it's name + return self.name + + +``` + +--- + +### 1.2: Update the Todo class + +Find the `Todo` class. It should look like this: + +Add a new line after `user_id` to add the category field. And add a new function / method which will make todo.category return the Category object that is linked by the category_id Foreign Key: + +```python +class Todo(db.Model): + __tablename__ = "todos" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + task: Mapped[str] = mapped_column(db.String(200), nullable=False) + user_id: Mapped[str] = mapped_column(db.String(100), nullable=False) + category_id: Mapped[int] = mapped_column(ForeignKey('categories.id'), nullable=False) + done: Mapped[bool] = mapped_column(db.Boolean, default=False) + + @property # todo.category is a property (member variable) of the todo object + def category(self): # return the category object linked to this Todo by category_id + return Category.query.get(self.category_id) +``` + + +--- + + +## Step 2: Update Routes in `todo.py` + +### 2.1: Update the home() function + +Find the `home()` function and change it to pass categories to the template: + +**New code:** + +```python +@todo_bp.route('/') +def home(): + user = get_current_user() + if not user: + return render_template('login.html') + session['user_id'] = user["id"] + todos = Todo.query.filter_by(user_id=session['user_id']).all() + categories = Category.query.all() + return render_template('index.html', todos=todos, categories=categories, user=user) +``` + +--- + +### 2.2: Update the add() function + +Find the `add()` function and change it to capture the category: + +**New code:** + +```python +@todo_bp.route('/add', methods=['POST']) +def add(): + if 'user_id' not in session: + return redirect('/') + task_text = request.form['task'] + category_id = request.form.get('category_id', type=int) + if not category_id: + return redirect('/') + new_task = Todo(task=task_text, category_id=category_id, user_id=session['user_id']) + db.session.add(new_task) + db.session.commit() + return redirect('/') +``` + +--- + +### 2.3: Update the init_app() function + +Find the `init_app()` function at the bottom of `todo.py`. Add code to seed the initial categories: + +**New code:** + +```python +def init_app(app): + db.init_app(app) + with app.app_context(): + db.create_all() + # Seed initial categories if they don't exist + if Category.query.count() == 0: + urgent = Category(name="Urgent") + non_urgent = Category(name="Non-urgent") + db.session.add(urgent) + db.session.add(non_urgent) + db.session.commit() + + if Todo.query.count() == 0: + mreggleton_check = Todo(task="Mr Eggleton checking your Todo App!", done=False, user_id="github|5987806", category_id=non_urgent.id) + db.session.add(mreggleton_check) + db.session.commit() +``` + +--- + +## Step 3: Update `templates/index.html` - Add Category Dropdown + +Find the form in `index.html`: + +**New code:** + +```html +
      + + + +
      +``` + +--- + +Find the task text being printed out and add the category next to it: + +**New code:** + +```html + {{ todo.task }} [{{ todo.category }}] +``` + +--- + +## Step 4: Update `app.py` - Import Category + +Find this line near the top of `app.py`: + +```python +from todo import todo_bp, init_app as init_todo +from todo import db, Todo +``` + +Change it to: + +```python +from todo import todo_bp, init_app as init_todo +from todo import db, Todo, Category +``` + +--- + +Then find this line near the bottom: + +```python +init_admin(app, db, Todo) +``` + +Change it to: + +```python +init_admin(app, db, Todo, Category) +``` + +--- + +## Step 5: Update `admin.py` - Add Category Admin View + +Find the `init_admin()` function in `admin.py`: + +**New code:** + +```python +def init_admin(app, db, todo_model, category_model): + """Attach Babel and register secured admin views for the given models.""" + Babel(app, locale_selector=lambda: 'en') + admin = Admin(app, name="Admin", template_mode="bootstrap4", + index_view=AuthenticatedAdminIndexView()) + admin.add_view(AuthenticatedModelView(todo_model, db.session, + endpoint="todo_admin", + name="Todos")) + admin.add_view(AuthenticatedModelView(category_model, db.session, + endpoint="category_admin", + name="Categories")) + return admin +``` + +--- + +## Step 6: Reset Your Database + +Because you've changed the database structure, you need to delete the old database: + +1. Stop your Flask app if it's running (press Ctrl+C in the terminal) +2. Delete the database file from the instance folder. + +Restart your Flask app: + +```bash +py -m flask run --host=localhost --port=5000 # it maybe python3 on your machine +``` + +The app will create a new database with the "Urgent" and "Non-urgent" categories automatically. + +--- + +## Testing Your Changes + +1. Go to the home page - you should see a dropdown to select a category when adding a task +2. Add a task with a category selected +3. Log in and go to [http://localhost:5000/admin/](http://localhost:5000/admin/) to see the Categories section where you can add, edit, or delete categories + +--- + +## Summary of Changes + +- **Created** a new `Category` model +- **Added** a foreign key relationship from `Todo` to `Category` +- **Updated** the form to include a category dropdown +- **Modified** the add route to capture the selected category +- **Added** automatic seeding of initial categories +- **Enabled** category management in the admin interface + +--- + +## Things we are ignoring + +- Persistent records in a database. The current database will be destroyed each time you push to render, ( You can modify the code once it's on Render to move to PostgreSQL ). +- Changing database structure SQLAlchemy Migrations. Currently we aren't handling changes to the database structure so you need to delete the local .db and start again (render wil do this anyway on a rebuild as mentioned above). They can be handled with Migrations +- Minimal Autorisation all Authenticated users can do everything on the site. + +--- +## Things we are ignoring 2 + +- Storing any user data in a database (other than an id from github or Auth0 ). To have users on this system to store any other PII refer to [https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy](https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy) and change the privacy statement. +- Testing. There are no tests in this code, although Flask, SQL Alchemy and the other libraries used are thoroughly tested and are checked for security issues. + +--- + +## Your Development + +Then what could you make with the same ideas but different entities (things)? + +Books and People could make a library etc .... diff --git a/README.md b/README.md index c9ecba8..65cbf09 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ A simple Python Todo Web App to do some improvements on and be a starting point - SQL Databases the modern way - Managed by [SQLAlchemy](https://www.sqlalchemy.org/) an ORM / [Object Relationship Mapper](https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping) which allows you to write classes that define the data and provides the storage & [CRUD](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete) for you. --- +--- ###  [Object Relationship Mapper](https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping) - ORMs build the database for you from your classes so you define what you want to store how it connects together and any extras calculations / functions you need . @@ -34,7 +34,7 @@ A simple Python Todo Web App to do some improvements on and be a starting point ### Authentication (GitHub + Auth0) -Authentication is the act of proving who you are, in this system we use external Authentication systems so we aren't storing usernames & passwords (reducing the DPA responsiblilties ) +Authentication is the act of proving who you are, in this system we use external authentication systems so we aren't storing usernames & passwords (reducing the DPA responsiblilties ). There are still some so we provide a privacy policy. - GitHub OAuth (Flask-Dance) for local Windows development - Auth0 OAuth for Codespaces and Render production @@ -45,7 +45,7 @@ Authentication is the act of proving who you are, in this system we use external - Ready for [Render](https://render.com/) deployment so you can publish and use the site online for free (there are some speed limitations) - GitHub Actions CI/CD to build the site when you commit a working version -- Can be upgraded to use a free PostgreSQL daatbase server (but there are some other ) +- Can be upgraded to use a free PostgreSQL database server (but there are some other steps) --- @@ -53,28 +53,28 @@ Authentication is the act of proving who you are, in this system we use external ### Start from the Template -1. Go to the github repository [https://github.com/UTCSheffield/python-flask-todo](https://github.com/UTCSheffield/python-flask-todo) -2. Click the green "Use this template" button at the top of the page -3. Select "Create a new repository" -4. Fill in your new repository details: +1. Login to [github.com](https://github.com/) +2. Go to the github repository [https://github.com/UTCSheffield/python-flask-todo](https://github.com/UTCSheffield/python-flask-todo) +3. Click the green "Use this template" button at the top of the page +4. Select "Create a new repository" +5. Fill in your new repository details: - Choose a repository name (e.g., `python-flask-todo`) - Add a description (optional) - Choose Public or Private visibility -5. Click "Create repository from template" -6. Your new repository will be created with all the template files -7. Now clone your new repository using one of the methods below +6. Click "Create repository from template" +7. Your new repository will be created with all the template files --- -### Clone the Repository +### Clone your Repository locally **Using GitHub Desktop:** -1. Open GitHub Desktop -2. Click `File` → `Clone repository` -3. Select the `URL` tab -4. Enter: `https://github.com/UTCSheffield/python-flask-todo.git` -5. Choose a local path and click `Clone` +1. On the GitHub page for your new repository +2. Click the green "Code" button +3. Click "Open with GitHub Desktop" +4. You may need to login to GitHub Desktop if you haven't already +5. You may be prompted to choose a local path to clone the repository to 6. Click 'Open in Visual Studio Code' to open the project in VS Code --- @@ -91,16 +91,16 @@ cd python-flask-todo ### Install Dependencies ```bash -py -m pip install -r requirements.txt # You'll need python3 ... in linux +python3 -m pip install -r requirements.txt ``` --- ### Environment Configuration (.env) -In VS Code open `.env.example` and save it as `.env` - -Edit the file to put the details you need in. But @ UTC Sheffield OLP, Mr Eggleton will give you a .env file that will work with github, and you don't need to do the "Authentication Setup" as you are using his and you can skip to ['Running the Application'](#running-the-application) +```bash +cp .env.example .env +``` --- @@ -144,11 +144,13 @@ For local Windows development with GitHub Desktop: Start the Flask development server: ```bash -py -m flask run --host=localhost --port=5000 # it maybe python3 on your machine +python3 -m flask run --host=localhost --port=5000 ``` The app will be available at [http://localhost:5000](http://localhost:5000) +Try it, login and create a few tasks! + --- ## The Database @@ -159,6 +161,10 @@ This code uses [SQLAlchemy](https://www.sqlalchemy.org/) to set up classes that The database file is stored in `/instance/todo.db` +Hopefully Visual Code has promoted you to install the recommended extensions including the SQLite extension. and so todo.db should appear in the left hand side explorer view with a red icon. + +Have a look, can you see the tables and data? + --- ## Things we are ignoring @@ -168,7 +174,7 @@ The database file is stored in `/instance/todo.db` - Minimal Autorisation all Authenticated users can do everything on the site. - Storing any user data in a database (other than an id from github or Auth0 ). To have users on this system to store any other PII refer to [https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy](https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy) and change the privacy statement. - Adding extra security [https://flask-security.readthedocs.io/en/stable/quickstart.html#basic-flask-sqlalchemy-application](https://flask-security.readthedocs.io/en/stable/quickstart.html#basic-flask-sqlalchemy-application) -- Testing. There are no tests in this code, although Flask, SQL Alchemy and the other libraries used are thouroughly tested and are checked for security issues. +- Testing. There are no tests in this code, although Flask, SQL Alchemy and the other libraries used are thoroughly tested and are checked for security issues. --- @@ -182,10 +188,12 @@ Books and People could make a library etc .... --- -## Codespaces Setup - -See [CODESPACES_SETUP.md](CODESPACES_SETUP.md) for complete GitHub Codespaces setup instructions. ## Deployment on Render See [RENDER_SETUP.md](RENDER_SETUP.md) for complete Render deployment instructions, including setup, configuration, environment variables, and continuous deployment. + + +## Codespaces Setup + +See [CODESPACES_SETUP.md](CODESPACES_SETUP.md) for complete GitHub Codespaces setup instructions. \ No newline at end of file diff --git a/SaveAs.png b/SaveAs.png new file mode 100644 index 0000000000000000000000000000000000000000..857fbdd1afb252fb6c3dfc1e60e62c0c3c630d78 GIT binary patch literal 2431 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 Gm-II@xPs&W literal 0 HcmV?d00001 From e8ca6d194743bc26d6f336418af72a333f7217f7 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Fri, 16 Jan 2026 15:22:12 +0000 Subject: [PATCH 25/27] Updated the LESSON --- LESSON.md | 35 ++++++++++++++++++++++------------- LESSON.pdf | Bin 0 -> 190889 bytes 2 files changed, 22 insertions(+), 13 deletions(-) create mode 100644 LESSON.pdf diff --git a/LESSON.md b/LESSON.md index f7f2b61..5501d83 100644 --- a/LESSON.md +++ b/LESSON.md @@ -1,5 +1,5 @@ -# Python as Dynamic Webserver +# Python as Dynamic Web Server --- @@ -7,8 +7,22 @@ ```mermaid mindmap - Web Server - HTML #10003; + server)Web Server( + Program that responds to HTTP requests with HTML or Assets + Static Site + Hand Built #10003; + Coded one page at a time + Static Built #10003; + Build pages and layout into static pages + Dynamic + Build from templates and data on each request + Allows for the data to be changed + Authentication + Can be an API as well as HTML + SPA + Single Page Applications + Javascript heavy + Use APIs to get data Assets Images #10003; CSS #10003; @@ -17,12 +31,6 @@ mindmap Text Files #10003; API Database - Authentication - Types - Hand Built #10003; - Static Built #10003; - Dynamic - ``` --- @@ -59,7 +67,7 @@ A simple Python Todo Web App to do some improvements on and be a starting point --- -### SQLAlchemy Snippet +### SQLAlchemy Snippet ```python class Todo(db.Model): @@ -72,6 +80,7 @@ class Todo(db.Model): ``` --- + ### Flask Snippet ```python @@ -85,6 +94,7 @@ def home():     todos = Todo.query.filter_by(user_id=session['user_id']).all()     return render_template('index.html', todos=todos, user=user) ``` + #### CRUD Admin Snippet ```python @@ -196,7 +206,7 @@ Have a look, can you see the tables and data? --- -## What We're Building Next +## What We're Building Next Next your going to add a **category system** to organize todos. Each todo must belong to one category (like "Urgent" or "Non-urgent"). Users will select a category from a dropdown menu when creating a new todo. Administrators can add, edit, or delete categories through the admin interface at `/admin/`. @@ -268,10 +278,8 @@ class Todo(db.Model): return Category.query.get(self.category_id) ``` - --- - ## Step 2: Update Routes in `todo.py` ### 2.1: Update the home() function @@ -473,6 +481,7 @@ The app will create a new database with the "Urgent" and "Non-urgent" categories - Minimal Autorisation all Authenticated users can do everything on the site. --- + ## Things we are ignoring 2 - Storing any user data in a database (other than an id from github or Auth0 ). To have users on this system to store any other PII refer to [https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy](https://flask-dance.readthedocs.io/en/latest/storages.html#sqlalchemy) and change the privacy statement. diff --git a/LESSON.pdf b/LESSON.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b70ec8067000b5e0aca507a0a8108168b69e8f12 GIT binary patch literal 190889 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
      - - - -``` - **New code:** ```html @@ -221,13 +163,9 @@ Find the form in `index.html`: ``` -Find the task text being printed out and add the category next to it: - -**Old code:** +--- -```html - {{ todo.task }} -``` +Find the task text being printed out and add the category next to it: **New code:** @@ -271,20 +209,6 @@ init_admin(app, db, Todo, Category) Find the `init_admin()` function in `admin.py`: -**Old code:** - -```python -def init_admin(app, db, model): - """Attach Babel and register secured admin views for the given model.""" - Babel(app, locale_selector=lambda: 'en') - admin = Admin(app, name="Admin", template_mode="bootstrap4", - index_view=AuthenticatedAdminIndexView()) - admin.add_view(AuthenticatedModelView(model, db.session, - endpoint="todo_admin", - name="Todos")) - return admin -``` - **New code:** ```python @@ -315,8 +239,9 @@ Restart your Flask app: ```bash python3 -m flask run --host=localhost --port=5000 +``` -The app will create a new database with the "Urgent" and "Non-urgent" categories automatically. +The app will create a new database with the "Urgent" and "Non-urgent" categories automatically. Test it on [http://localhost:5000/](http://localhost:5000/) --- @@ -324,7 +249,40 @@ The app will create a new database with the "Urgent" and "Non-urgent" categories 1. Go to the home page - you should see a dropdown to select a category when adding a task 2. Add a task with a category selected -3. Log in and go to `/admin/` to see the Categories section where you can add, edit, or delete categories +3. Log in and go to [http://localhost:5000/admin/](http://localhost:5000/admin/) to see the Categories section where you can add, edit, or delete categories + +--- + + +## Adding a REST api for modern web techniques + +1. Stop your Flask app if it's running (press Ctrl+C in the terminal) + +### Step 7: Update `app.py` - + +Find the imports at the top, the last one should be +`from admin import init_admin` add the following line + +```python +from api import api_bp +``` + +And just after `app.register_blueprint(todo_bp)` add + +```python +app.register_blueprint(api_bp) +``` + +--- + +Restart your Flask app: + +```bash +py -m flask run --host=localhost --port=5000 # it maybe python3 on your machine +``` + +Log in and go to [http://localhost:5000/api/](http://localhost:5000/api/) for +api documentation and a testing environment --- @@ -336,3 +294,4 @@ The app will create a new database with the "Urgent" and "Non-urgent" categories - **Modified** the add route to capture the selected category - **Added** automatic seeding of initial categories - **Enabled** category management in the admin interface +- **Added** Full REST API with swagger documentation diff --git a/LESSON.md b/LESSON.md index 5501d83..0f3919f 100644 --- a/LESSON.md +++ b/LESSON.md @@ -210,10 +210,10 @@ Have a look, can you see the tables and data? Next your going to add a **category system** to organize todos. Each todo must belong to one category (like "Urgent" or "Non-urgent"). Users will select a category from a dropdown menu when creating a new todo. Administrators can add, edit, or delete categories through the admin interface at `/admin/`. ---- - The system uses two database tables with a **one-to-many relationship**: one category can have many todos, but each todo belongs to exactly one category. +--- + ```mermaid erDiagram Category ||--o{ Todo : "has many" @@ -259,7 +259,7 @@ class Category(db.Model): ### 1.2: Update the Todo class -Find the `Todo` class. It should look like this: +Find the `Todo` class. Add a new line after `user_id` to add the category field. And add a new function / method which will make todo.category return the Category object that is linked by the category_id Foreign Key: @@ -451,7 +451,7 @@ Restart your Flask app: py -m flask run --host=localhost --port=5000 # it maybe python3 on your machine ``` -The app will create a new database with the "Urgent" and "Non-urgent" categories automatically. +The app will create a new database with the "Urgent" and "Non-urgent" categories automatically. Test it on [http://localhost:5000/](http://localhost:5000/) --- @@ -463,6 +463,38 @@ The app will create a new database with the "Urgent" and "Non-urgent" categories --- +## Adding a REST api for modern web techniques + +1. Stop your Flask app if it's running (press Ctrl+C in the terminal) + +### Step 7: Update `app.py` - + +Find the imports at the top, the last one should be +`from admin import init_admin` add the following line + +```python +from api import api_bp +``` + +And just after `app.register_blueprint(todo_bp)` add + +```python +app.register_blueprint(api_bp) +``` + +--- + +Restart your Flask app: + +```bash +py -m flask run --host=localhost --port=5000 # it maybe python3 on your machine +``` + +Log in and go to [http://localhost:5000/api/](http://localhost:5000/api/) for +api documentation and a testing environment + +--- + ## Summary of Changes - **Created** a new `Category` model @@ -471,6 +503,7 @@ The app will create a new database with the "Urgent" and "Non-urgent" categories - **Modified** the add route to capture the selected category - **Added** automatic seeding of initial categories - **Enabled** category management in the admin interface +- **Added** Full REST API with swagger documentation --- diff --git a/admin.py b/admin.py index be8e3a3..e638fd2 100644 --- a/admin.py +++ b/admin.py @@ -21,12 +21,12 @@ def inaccessible_callback(self, name, **kwargs): return redirect(url_for('auth.login', next=request.url)) -def init_admin(app, db, model): +def init_admin(app, db, todo_model): """Attach Babel and register secured admin views for the given model.""" Babel(app, locale_selector=lambda: 'en') admin = Admin(app, name="Admin", template_mode="bootstrap4", index_view=AuthenticatedAdminIndexView()) - admin.add_view(AuthenticatedModelView(model, db.session, + admin.add_view(AuthenticatedModelView(todo_model, db.session, endpoint="todo_admin", name="Todos")) return admin diff --git a/api.py b/api.py new file mode 100644 index 0000000..d51109c --- /dev/null +++ b/api.py @@ -0,0 +1,125 @@ + + +from flask_restx import Api, Resource, fields, Namespace +from flask import Blueprint, request, abort +from flask_restx import Api, Resource, Namespace, fields +from flask import Blueprint, request, abort +from todo import Category, Todo, db +from auth import get_current_user +from schemas import TodoSchema, CategorySchema + + +api_bp = Blueprint('api', __name__, url_prefix='/api') +api = Api(api_bp, title="Todo API", version="1.0", + description="Simple Todo API with categories") + + +# For docs only +todo_model = api.model('Todo', { + 'id': fields.Integer(readOnly=True), + 'task': fields.String(required=True), + 'user_id': fields.String(readOnly=True), + 'category_id': fields.Integer(required=True), + 'done': fields.Boolean, +}) + +todo_input = api.model('TodoInput', { + 'task': fields.String(required=True), + 'category_id': fields.Integer(required=True), + 'done': fields.Boolean(default=False, required=False), +}) + +category_model = api.model('Category', { + 'id': fields.Integer(readOnly=True), + 'name': fields.String(required=True), +}) + +todo_schema = TodoSchema() +category_schema = CategorySchema() + + +def require_auth(): + user = get_current_user() + if not user or not user.get('id'): + abort(401) + return user + + +@api.route('/categories') +class CategoryList(Resource): + @api.marshal_list_with(category_model) + def get(self): + """List all categories""" + categories = Category.query.all() + return category_schema.dump(categories, many=True) + + +@api.route('/todos') +class TodoList(Resource): + @api.marshal_list_with(todo_model) + def get(self): + """List all todos for the current user""" + user = require_auth() + todos = Todo.query.filter_by(user_id=user['id']).all() + return todo_schema.dump(todos, many=True) + + @api.expect(todo_input, validate=True) + @api.marshal_with(todo_model, code=201) + def post(self): + """Create a new todo for the current user""" + user = require_auth() + data = request.get_json() + errors = todo_schema.validate(data, partial=False) + if errors: + return errors, 400 + todo = Todo( + task=data['task'], + category_id=data['category_id'], + user_id=user['id'], + done=data.get('done', False) + ) + db.session.add(todo) + db.session.commit() + return todo_schema.dump(todo), 201 + + +@api.route('/todos/') +@api.response(404, 'Todo not found') +class TodoResource(Resource): + @api.marshal_with(todo_model) + def get(self, todo_id): + """Get a todo by ID (must belong to user)""" + user = require_auth() + todo = Todo.query.get_or_404(todo_id) + if todo.user_id != user['id']: + abort(403) + return todo_schema.dump(todo) + + @api.expect(todo_input, validate=True) + @api.marshal_with(todo_model) + def put(self, todo_id): + """Update a todo by ID (must belong to user)""" + user = require_auth() + todo = Todo.query.get_or_404(todo_id) + if todo.user_id != user['id']: + abort(403) + data = request.get_json() + errors = todo_schema.validate(data, partial=True) + if errors: + return errors, 400 + todo.task = data.get('task', todo.task) + todo.category_id = data.get('category_id', todo.category_id) + todo.done = data.get('done', todo.done) + db.session.commit() + return todo_schema.dump(todo) + + def delete(self, todo_id): + """Delete a todo by ID (must belong to user)""" + user = require_auth() + todo = Todo.query.get_or_404(todo_id) + if todo.user_id != user['id']: + abort(403) + db.session.delete(todo) + db.session.commit() + return '', 204 + data = api.payload diff --git a/requirements.txt b/requirements.txt index 3c58234..b5c7638 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,3 @@ - Flask==2.3.2 Flask-SQLAlchemy==3.1.1 Flask-Dance==7.0.0 @@ -6,4 +5,6 @@ gunicorn==21.2.0 python-dotenv==1.0.0 flask_babel==3.1.0 flask-admin[sqlalchemy,s3,images,export,translation]==1.6.1 -setuptools<81 \ No newline at end of file +setuptools<81 +marshmallow==3.20.1 +marshmallow-sqlalchemy==0.29.0 \ No newline at end of file diff --git a/schemas.py b/schemas.py new file mode 100644 index 0000000..31b802c --- /dev/null +++ b/schemas.py @@ -0,0 +1,17 @@ +from marshmallow_sqlalchemy import SQLAlchemyAutoSchema +from todo import Todo, Category, db + + +class TodoSchema(SQLAlchemyAutoSchema): + class Meta: + model = Todo + sqla_session = db.session + load_instance = True + include_fk = True + + +class CategorySchema(SQLAlchemyAutoSchema): + class Meta: + model = Category + sqla_session = db.session + load_instance = True From 7cc559c06762efbc6cf88c3b0dbc595b4c60308f Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Mon, 26 Jan 2026 15:12:33 +0000 Subject: [PATCH 27/27] Update LESSON.pdf to improve clarity and add REST API documentation --- LESSON.pdf | Bin 190889 -> 198134 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/LESSON.pdf b/LESSON.pdf index b70ec8067000b5e0aca507a0a8108168b69e8f12..745218fd0aac7b9767ff483077b4653d64890352 100644 GIT binary patch delta 99490 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�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

      -+ZCgZFMl8cf70}$Br{aJa7F(NW#qUR;LI+n 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 literal 0 HcmV?d00001 From 387b343672ef51fa985900cc0814e355e94cde83 Mon Sep 17 00:00:00 2001 From: Mr Eggleton Date: Mon, 26 Jan 2026 15:10:11 +0000 Subject: [PATCH 26/27] Add category management and REST API to Todo app - Created a new `Category` model and updated the `Todo` model to include a category field. - Modified the add route to capture the selected category. - Enabled category management in the admin interface. - Added a full REST API with Swagger documentation for todos and categories. - Updated documentation to reflect changes in functionality. --- ADDING_CATERGORIES.md | 125 ++++++++++++++---------------------------- LESSON.md | 41 ++++++++++++-- admin.py | 4 +- api.py | 125 ++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 5 +- schemas.py | 17 ++++++ 6 files changed, 226 insertions(+), 91 deletions(-) create mode 100644 api.py create mode 100644 schemas.py diff --git a/ADDING_CATERGORIES.md b/ADDING_CATERGORIES.md index a99eeea..7c88e78 100644 --- a/ADDING_CATERGORIES.md +++ b/ADDING_CATERGORIES.md @@ -53,17 +53,7 @@ class Category(db.Model): ### 1.2: Update the Todo class -Find the `Todo` class. It should look like this: - -```python -class Todo(db.Model): - __tablename__ = "todos" - - id: Mapped[int] = mapped_column(primary_key=True, init=False) - task: Mapped[str] = mapped_column(db.String(200), nullable=False) - user_id: Mapped[str] = mapped_column(db.String(100), nullable=False) - done: Mapped[bool] = mapped_column(db.Boolean, default=False) -``` +Find the `Todo` class. Add a new line after `user_id` to add the category field. And add a new function / method which will make todo.category return the Category object that is linked by the category_id Foreign Key: @@ -90,19 +80,6 @@ class Todo(db.Model): Find the `home()` function and change it to pass categories to the template: -**Old code:** - -```python -@todo_bp.route('/') -def home(): - user = get_current_user() - if not user: - return render_template('login.html') - session['user_id'] = user["id"] - todos = Todo.query.filter_by(user_id=session['user_id']).all() - return render_template('index.html', todos=todos, user=user) -``` - **New code:** ```python @@ -117,24 +94,12 @@ def home(): return render_template('index.html', todos=todos, categories=categories, user=user) ``` +--- + ### 2.2: Update the add() function Find the `add()` function and change it to capture the category: -**Old code:** - -```python -@todo_bp.route('/add', methods=['POST']) -def add(): - if 'user_id' not in session: - return redirect('/') - task_text = request.form['task'] - new_task = Todo(task=task_text, done=False, user_id=session['user_id']) - db.session.add(new_task) - db.session.commit() - return redirect('/') -``` - **New code:** ```python @@ -156,20 +121,6 @@ def add(): Find the `init_app()` function at the bottom of `todo.py`. Add code to seed the initial categories: -**Old code:** - -```python -def init_app(app): - db.init_app(app) - with app.app_context(): - db.create_all() - - if Todo.query.count() == 0: - mreggleton = Todo(task="Mr Eggleton checking your Todo App!", done=False, user_id="github|5987806") - db.session.add(mreggleton) - db.session.commit() -``` - **New code:** ```python @@ -197,15 +148,6 @@ def init_app(app): Find the form in `index.html`: -**Old code:** - -```html -