users can now start activities and see which ones they have in progress

This commit is contained in:
harvey committed 2026-04-08 13:30:08 +01:00
1 parent 70be20aa77
commit f69283fea6
4 files changed
+28 -54

No files matched your search

+18 -23
View File
@@ -300,41 +300,40 @@ def init_activities_database():
"title": "Build a Bird Feeder",
"description": "Create a bird feeder using recycled materials.",
"species": "Bird Conservation",
"duration_days": 3,
"due_date": "12/04/2026",
"difficulty": "Easy"
},
{
"title": "Plant a Tree",
"description": "Plant a tree in your garden or local area to help restore natural habitats and support wildlife.",
"species": "Habitat Restoration",
"duration_days": 5,
"due_date": "13/04/2026",
"difficulty": "Medium"
},
{
"title": "Organise a Conservation Awareness Campaign",
"description": "Plan and deliver a campaign to raise awareness about endangered species.",
"species": "Education & Conservation",
"duration_days": 14,
"due_date": "3/05/2026",
"difficulty": "Hard"
}
]
with get_db() as conn:
# Create activities table if it doesn't exist
conn.execute("""
CREATE TABLE IF NOT EXISTS activities (
activity_id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT,
species TEXT,
duration_days INTEGER,
due_date TEXT,
difficulty TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
print("Activities table created/found.")
# Insert activities if not already in table
for activity in activities_list:
exists = conn.execute(
"SELECT activity_id FROM activities WHERE title = ?",
@@ -346,34 +345,31 @@ def init_activities_database():
conn.execute("""
INSERT INTO activities
(title, description, species, duration_days, difficulty, created_at)
(title, description, species, due_date, difficulty, created_at)
VALUES (?, ?, ?, ?, ?, ?)
""", (
activity["title"],
activity["description"],
activity["species"],
activity["duration_days"],
activity["due_date"],
activity["difficulty"],
datetime.now(),
))
print(f" ADD {activity['title']}")
print("Activities seeding complete.")
def init_user_activities_table():
with get_db() as conn:
conn.execute("""
CREATE TABLE IF NOT EXISTS user_activities (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
activity_id INTEGER NOT NULL,
started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
completed INTEGER DEFAULT 0,
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (activity_id) REFERENCES activities(activity_id)
)
CREATE TABLE IF NOT EXISTS user_activities (
user_id INTEGER NOT NULL,
activity_id INTEGER NOT NULL,
status TEXT DEFAULT 'in_progress',
started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (user_id, activity_id),
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (activity_id) REFERENCES activities(activity_id)
)
""")
print(f" ADD {activity['title']}")
print("Activities seeding complete.")
init_database()
@@ -382,5 +378,4 @@ init_classes_database()
init_programs_database()
init_articles()
init_activities_database()
init_user_activities_table()
register_user("admin", "admin@komodohub.org", "admin", "admin")
+1 -1
View File
@@ -68,4 +68,4 @@ def handle_bad_request(e):
import_pages("routes", app)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=3000, debug=True)
app.run(host="0.0.0.0", port=3001, debug=True)
+3 -22
View File
@@ -1,10 +1,8 @@
from flask import render_template, Blueprint, g, request, redirect, url_for
from database.db_connection import get_db
from datetime import datetime
page = Blueprint('activities', __name__, url_prefix='/activities')
@page.route('/', methods=['GET', 'POST'])
def home():
if request.method == 'POST':
@@ -12,13 +10,13 @@ def home():
with get_db() as conn:
conn.execute("""
INSERT INTO activities
(title, description, species, duration_days, difficulty)
(title, description, species, due_date, difficulty)
VALUES (?, ?, ?, ?, ?)
""", (
request.form['title'],
request.form['description'],
request.form['species'],
int(request.form['duration_days']),
request.form['due_date'],
request.form['difficulty']
))
return redirect(url_for('activities.home'))
@@ -75,24 +73,7 @@ def my_activities():
WHERE ua.user_id = ?
""", (g.user["user_id"],)).fetchall()
activities_with_time = []
for activity in activities:
try:
started_at = datetime.fromisoformat(activity["started_at"])
except:
started_at = datetime.strptime(activity["started_at"], "%Y-%m-%d %H:%M:%S")
duration = activity["duration_days"]
days_passed = (datetime.now() - started_at).days
days_left = duration - days_passed
activity_dict = dict(activity)
activity_dict["days_left"] = days_left
activities_with_time.append(activity_dict)
return render_template(
'activities/my_activities.jinja',
activities=activities_with_time
activities=activities
)
+6 -8
View File
@@ -33,17 +33,15 @@
<h3>{{ activity.title }}</h3>
<p>{{ activity.description }}</p>
<p><strong>Category:</strong> {{ activity.species }}</p>
<p><strong>Duration days:</strong> {{ activity.duration_days }}</p>
<p><strong>Due date:</strong> {{ activity.due_date }}</p>
<p><strong>Difficulty:</strong> {{ activity.difficulty }}</p>
{% if activity.activity_id in started_ids %}
<p><strong>In Progress</strong></p>
<p><strong>In Progress</strong></p>
{% else %}
{{ button(
url=url_for('activities.start_activity', activity_id=activity.activity_id),
button_text='Start Activity'
) }}
{% endif %}
{{ button(url=url_for('activities.start_activity', activity_id=activity.activity_id), button_text='Start Activity', extra_classes='homepage-btn') }}
</button>
{% endif %}
</div>
{% endfor %}
</div>
@@ -61,7 +59,7 @@
<input type="text" name="species" placeholder="Species / Program" required><br><br>
<input type="number" name="duration_days" placeholder="duration_days"><br><br>
<input type="number" name="due_date" placeholder="due_date"><br><br>
<input type="text" name="difficulty" placeholder="difficulty"><br><br>