forked from Ugric/Komodo-Hub
users can now start activities and see which ones they have in progress
This commit is contained in:
1 parent
70be20aa77
commit
f69283fea6
4 files changed
+28
-54
No files matched your search
+18
-23
@@ -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")
|
||||
@@ -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)
|
||||
@@ -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
|
||||
)
|
||||
@@ -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>
|
||||
|
||||
|
||||
Reference in new issue
Block a user