Spaces:
Sleeping
Sleeping
File size: 4,275 Bytes
2315e7a 1d44b76 6fb7683 93a0f5c 9afaf17 2315e7a 6fb7683 9afaf17 2315e7a 401e8b9 2315e7a 6566655 2315e7a 6566655 2315e7a 401e8b9 93a0f5c 316149f 2315e7a bc2853c 2315e7a 6566655 2315e7a 6566655 2315e7a 6fb7683 2315e7a 4cd768f 2315e7a 316149f 2315e7a 93a0f5c 2315e7a 93a0f5c 1d44b76 316149f 2315e7a 69e3818 2315e7a 4cd768f 2315e7a 6fb7683 69e3818 6fb7683 69e3818 6fb7683 69e3818 6fb7683 69e3818 6fb7683 2315e7a 6fb7683 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# components/task_operations.py
import sqlite3
import pandas as pd
from datetime import datetime
import streamlit as st
class TaskManager:
DB_FILE = "tasks.db"
CATEGORIES = ['Learning', 'Gym', 'Personal', 'Family', 'Work', 'Prayer']
def __init__(self):
self.conn = sqlite3.connect(self.DB_FILE)
self.create_table()
def create_table(self):
# Create tasks table with essential fields
query = """
CREATE TABLE IF NOT EXISTS tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
task_name TEXT NOT NULL,
task_time TEXT NOT NULL,
task_duration_hours INTEGER NOT NULL,
task_duration_minutes INTEGER NOT NULL,
category TEXT NOT NULL
);
"""
self.conn.execute(query)
self.conn.commit()
def load_tasks(self):
# Load tasks from the database
query = "SELECT * FROM tasks;"
df = pd.read_sql_query(query, self.conn)
if not df.empty:
# Rename columns explicitly to avoid conflicts
column_mapping = {
'task_name': 'Task Name',
'task_time': 'Task Time',
'task_duration_hours': 'Task Duration (hours)',
'task_duration_minutes': 'Task Duration (minutes)',
'category': 'Category',
'id': 'Task ID'
}
# Check for any conflicts before renaming
existing_columns = set(df.columns)
for original, new_name in column_mapping.items():
if new_name in existing_columns and original != new_name:
raise ValueError(f"Conflict detected: Column '{new_name}' already exists in the DataFrame.")
# Rename columns in the DataFrame
df.rename(columns=column_mapping, inplace=True)
# Convert 'task_time' to datetime after renaming
df['Task Time'] = pd.to_datetime(df['Task Time'])
return df.to_dict(orient='records')
else:
return []
def save_task(self, task):
# Save task into the database
query = """
INSERT INTO tasks (task_name, task_time, task_duration_hours, task_duration_minutes, category)
VALUES (?, ?, ?, ?, ?);
"""
self.conn.execute(query, (task['Task Name'], task['Task Time'], task['Task Duration (hours)'],
task['Task Duration (minutes)'], task['Category']))
self.conn.commit()
def add_task(self, task_name, task_time, task_duration_hours, task_duration_minutes, task_category):
task_time_full = datetime.combine(datetime.today(), task_time)
task_entry = {
"Task Name": task_name,
"Task Time": task_time_full,
"Task Duration (hours)": int(task_duration_hours),
"Task Duration (minutes)": int(task_duration_minutes),
"Category": task_category
}
self.save_task(task_entry)
st.session_state.tasks.append(task_entry)
def delete_task_by_id(self, task_id):
# Delete task by its ID
query = "DELETE FROM tasks WHERE id = ?;"
self.conn.execute(query, (task_id,))
self.conn.commit()
return True
def generate_report(self, timeframe):
df = pd.DataFrame(self.load_tasks())
if df.empty:
return pd.DataFrame()
df['Task Time'] = pd.to_datetime(df['Task Time'])
if timeframe == 'daily':
report = df[df['Task Time'].dt.date == pd.Timestamp.today().date()]
elif timeframe == 'weekly':
week_start = pd.Timestamp.today() - pd.DateOffset(days=pd.Timestamp.today().dayofweek)
report = df[(df['Task Time'] >= week_start) & (df['Task Time'] < pd.Timestamp.today() + pd.DateOffset(days=1))]
elif timeframe == 'monthly':
report = df[df['Task Time'].dt.month == pd.Timestamp.today().month]
elif timeframe == 'yearly':
report = df[df['Task Time'].dt.year == pd.Timestamp.today().year]
else:
report = pd.DataFrame()
report['Total Duration'] = report['Task Duration (hours)'] + report['Task Duration (minutes)'] / 60.0
return report
|