From 7af00c4bf2c2052b75ebca7246075a2ee318ff59 Mon Sep 17 00:00:00 2001 From: TitanX311 Date: Sun, 23 Nov 2025 15:56:55 +0530 Subject: [PATCH 1/2] csv feature added --- .claude/settings.local.json | 10 ------ main.py | 39 +++++++++++++++++++-- student_manager.py | 67 ++++++++++++++++++++++++++++++++++++- utils.py | 14 ++++++++ 4 files changed, 116 insertions(+), 14 deletions(-) delete mode 100644 .claude/settings.local.json diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index b4f6e51..0000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(python main.py:*)", - "Bash(python -m pytest:*)" - ], - "deny": [], - "ask": [] - } -} diff --git a/main.py b/main.py index 0ba2987..33cb77b 100644 --- a/main.py +++ b/main.py @@ -4,17 +4,19 @@ import argparse from student_manager import StudentManager -from utils import format_date, save_to_json, load_from_json +from utils import format_date def main(): parser = argparse.ArgumentParser(description='StudentHub - Manage your academic life') - parser.add_argument('command', choices=['add-assignment', 'list', 'complete', 'gpa', 'stats'], - help='Command to execute') + parser.add_argument('command', choices=['add-assignment', 'add-grade', 'list', 'complete', 'gpa', 'stats', 'export'], + help='Command to execute') + parser.add_argument('value', nargs='?', help='Value for the command') parser.add_argument('--deadline', help='Deadline in YYYY-MM-DD format') parser.add_argument('--subject', help='Subject name') + parser.add_argument('--output', help='Output filename for export') args = parser.parse_args() @@ -28,6 +30,18 @@ def main(): deadline = format_date(args.deadline) assignment = manager.add_assignment(args.value, deadline, args.subject) print(f"Added assignment: {assignment['title']}") + + elif args.command == 'add-grade': + if not args.subject or not args.value: + print("Error: Provide subject name and grade value") + return + + try: + grade_value = float(args.value) + manager.add_grade(args.subject, grade_value) + print(f"Grade added for {args.subject}: {grade_value}") + except ValueError: + print("Error: Grade must be a number") elif args.command == 'list': assignments = manager.list_assignments() @@ -55,6 +69,25 @@ def main(): print(f"Pending: {stats['pending']}") print(f"GPA: {stats['gpa']:.2f}") + elif args.command == 'export': + if not args.value: + print("Error: choose 'assignments' or 'grades'") + return + if not args.output: + print("Error: specify output with --output filename.csv") + return + + if args.value == "assignments": + manager.export_assignments(args.output) + print(f"Assignments exported to {args.output}") + + elif args.value == "grades": + manager.export_grades(args.output) + print(f"Grades exported to {args.output}") + + else: + print("Invalid export target. Use 'assignments' or 'grades'.") + if __name__ == '__main__': main() diff --git a/student_manager.py b/student_manager.py index 452ed31..c8b141a 100644 --- a/student_manager.py +++ b/student_manager.py @@ -3,13 +3,51 @@ """ from datetime import datetime -from utils import calculate_days_remaining, validate_grade, get_priority_level +from utils import calculate_days_remaining, validate_grade, get_priority_level, export_to_csv, save_to_json, load_from_json class StudentManager: def __init__(self): self.assignments = [] self.grades = [] + self.storage_file = "student_data.json" + self._load_data() + + def _load_data(self): + data = load_from_json(self.storage_file) + self.assignments = data.get("assignments", []) + self.grades = data.get("grades", []) + + from datetime import datetime + for a in self.assignments: + a["deadline"] = datetime.strptime(a["deadline"], "%Y-%m-%d") + a["created_at"] = datetime.strptime(a["created_at"], "%Y-%m-%d") + + for g in self.grades: + g["date"] = datetime.strptime(g["date"], "%Y-%m-%d") + + def _save_data(self): + save_to_json({ + "assignments": [ + { + "title": a["title"], + "deadline": a["deadline"].strftime("%Y-%m-%d"), + "subject": a["subject"], + "completed": a["completed"], + "created_at": a["created_at"].strftime("%Y-%m-%d") + } + for a in self.assignments + ], + "grades": [ + { + "subject": g["subject"], + "grade": g["grade"], + "date": g["date"].strftime("%Y-%m-%d") + } + for g in self.grades + ] + }, self.storage_file) + def add_assignment(self, title, deadline, subject=None): """Add a new assignment""" @@ -21,6 +59,7 @@ def add_assignment(self, title, deadline, subject=None): 'created_at': datetime.now() } self.assignments.append(assignment) + self._save_data() return assignment def list_assignments(self, show_completed=False): @@ -34,6 +73,7 @@ def mark_completed(self, title): for assignment in self.assignments: if assignment['title'] == title: assignment['completed'] = True + self._save_data() return True return False @@ -47,6 +87,7 @@ def add_grade(self, subject, grade): 'grade': grade, 'date': datetime.now() }) + self._save_data() def calculate_gpa(self): """Calculate GPA from grades""" @@ -84,3 +125,27 @@ def get_statistics(self): 'pending': total_assignments - completed, 'gpa': self.calculate_gpa() } + + def export_assignments(self, filename): + """Export assignments to CSV""" + cleaned = [] + for a in self.assignments: + cleaned.append({ + "title": a["title"], + "deadline": a["deadline"].strftime("%Y-%m-%d"), + "subject": a["subject"], + "completed": a["completed"], + "created_at": a["created_at"].strftime("%Y-%m-%d") + }) + export_to_csv(cleaned, filename) + + def export_grades(self, filename): + """Export grades to CSV""" + cleaned = [] + for g in self.grades: + cleaned.append({ + "subject": g["subject"], + "grade": g["grade"], + "date": g["date"].strftime("%Y-%m-%d") + }) + export_to_csv(cleaned, filename) diff --git a/utils.py b/utils.py index 936dbe0..dd5e527 100644 --- a/utils.py +++ b/utils.py @@ -4,6 +4,7 @@ from datetime import datetime import json +import csv def format_date(date_string): @@ -51,3 +52,16 @@ def get_priority_level(days_remaining): return "MEDIUM" else: return "LOW" + +def export_to_csv(data, filename, headers=None): + """Export list of dicts to CSV""" + if not data: + raise ValueError("No data to export") + + if headers is None: + headers = list(data[0].keys()) + + with open(filename, "w", newline="") as f: + writer = csv.DictWriter(f, fieldnames=headers) + writer.writeheader() + writer.writerows(data) \ No newline at end of file From 1b13176d09c4119564bad3f94d93a2510d3d8e5b Mon Sep 17 00:00:00 2001 From: TitanX311 Date: Sun, 23 Nov 2025 18:06:20 +0530 Subject: [PATCH 2/2] reverted #8 --- student_manager.py | 43 +------------------------------------------ 1 file changed, 1 insertion(+), 42 deletions(-) diff --git a/student_manager.py b/student_manager.py index c8b141a..a494f0b 100644 --- a/student_manager.py +++ b/student_manager.py @@ -3,51 +3,13 @@ """ from datetime import datetime -from utils import calculate_days_remaining, validate_grade, get_priority_level, export_to_csv, save_to_json, load_from_json +from utils import calculate_days_remaining, validate_grade, get_priority_level, export_to_csv class StudentManager: def __init__(self): self.assignments = [] self.grades = [] - self.storage_file = "student_data.json" - self._load_data() - - def _load_data(self): - data = load_from_json(self.storage_file) - self.assignments = data.get("assignments", []) - self.grades = data.get("grades", []) - - from datetime import datetime - for a in self.assignments: - a["deadline"] = datetime.strptime(a["deadline"], "%Y-%m-%d") - a["created_at"] = datetime.strptime(a["created_at"], "%Y-%m-%d") - - for g in self.grades: - g["date"] = datetime.strptime(g["date"], "%Y-%m-%d") - - def _save_data(self): - save_to_json({ - "assignments": [ - { - "title": a["title"], - "deadline": a["deadline"].strftime("%Y-%m-%d"), - "subject": a["subject"], - "completed": a["completed"], - "created_at": a["created_at"].strftime("%Y-%m-%d") - } - for a in self.assignments - ], - "grades": [ - { - "subject": g["subject"], - "grade": g["grade"], - "date": g["date"].strftime("%Y-%m-%d") - } - for g in self.grades - ] - }, self.storage_file) - def add_assignment(self, title, deadline, subject=None): """Add a new assignment""" @@ -59,7 +21,6 @@ def add_assignment(self, title, deadline, subject=None): 'created_at': datetime.now() } self.assignments.append(assignment) - self._save_data() return assignment def list_assignments(self, show_completed=False): @@ -73,7 +34,6 @@ def mark_completed(self, title): for assignment in self.assignments: if assignment['title'] == title: assignment['completed'] = True - self._save_data() return True return False @@ -87,7 +47,6 @@ def add_grade(self, subject, grade): 'grade': grade, 'date': datetime.now() }) - self._save_data() def calculate_gpa(self): """Calculate GPA from grades"""