File size: 5,104 Bytes
6bc3db2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
114
115
116
117
118
119
120
import json
from datetime import datetime

class UserState:
    def __init__(self, topic=None, claimed_level=None):
        self.topic = topic
        self.claimed_level = claimed_level  # e.g., 'novice', 'intermediate', 'advanced'
        self.actual_level = None  # Set after assessment
        self.progress = {
            'modules_completed': {},  # {chapter_name: {module_name: status}}
            'chapters_completed': {},  # {chapter_name: completion_status}
            'bloom_assessments': {},   # {chapter_name: assessment_results}
            'overall_progress': {
                'total_modules': 0,
                'completed_modules': 0,
                'total_chapters': 0,
                'completed_chapters': 0,
                'average_bloom_score': 0
            },
            'session_data': {
                'start_time': datetime.now().isoformat(),
                'last_activity': datetime.now().isoformat()
            }
        }

    def set_actual_level(self, level):
        self.actual_level = level

    @property
    def display_level(self):
        """Returns the actual level if set, otherwise the claimed level"""
        return self.actual_level or self.claimed_level

    def update_module_progress(self, chapter_name, module_name, status="completed"):
        """Update the completion status of a module"""
        if chapter_name not in self.progress['modules_completed']:
            self.progress['modules_completed'][chapter_name] = {}
        
        self.progress['modules_completed'][chapter_name][module_name] = {
            'status': status,
            'completed_at': datetime.now().isoformat()
        }
        self.progress['session_data']['last_activity'] = datetime.now().isoformat()

    def update_chapter_progress(self, chapter_name, status="completed"):
        """Update the completion status of a chapter"""
        self.progress['chapters_completed'][chapter_name] = {
            'status': status,
            'completed_at': datetime.now().isoformat()
        }
        self.progress['session_data']['last_activity'] = datetime.now().isoformat()

    def update_bloom_assessment(self, chapter_name, assessment_results):
        """Store Bloom's assessment results for a chapter"""
        # Store the assessment results directly without wrapping in 'results'
        self.progress['bloom_assessments'][chapter_name] = assessment_results
        self.progress['bloom_assessments'][chapter_name]['completed_at'] = datetime.now().isoformat()
        self.progress['session_data']['last_activity'] = datetime.now().isoformat()

    def calculate_overall_progress(self, curriculum):
        """Calculate overall progress based on curriculum"""
        total_modules = sum(len(chapter.modules) for chapter in curriculum.chapters)
        completed_modules = sum(
            len([m for m in modules.values() if m.get('status') == 'completed'])
            for modules in self.progress['modules_completed'].values()
        )
        
        total_chapters = len(curriculum.chapters)
        completed_chapters = len([
            c for c in self.progress['chapters_completed'].values() 
            if c.get('status') == 'completed'
        ])
        
        # Calculate average Bloom's score
        bloom_scores = [
            assessment.get('average_score', 0)
            for assessment in self.progress['bloom_assessments'].values()
        ]
        average_bloom_score = sum(bloom_scores) / len(bloom_scores) if bloom_scores else 0
        
        self.progress['overall_progress'] = {
            'total_modules': total_modules,
            'completed_modules': completed_modules,
            'total_chapters': total_chapters,
            'completed_chapters': completed_chapters,
            'average_bloom_score': average_bloom_score,
            'completion_percentage': (completed_modules / total_modules * 100) if total_modules > 0 else 0
        }

    def get_progress_summary(self, curriculum=None):
        """Get a formatted progress summary"""
        if curriculum:
            self.calculate_overall_progress(curriculum)
        
        overall = self.progress['overall_progress']
        
        summary = f"""

PROGRESS SUMMARY

===============

Topic: {self.topic}

Level: {self.actual_level or self.claimed_level}



Overall Progress:

- Modules: {overall['completed_modules']}/{overall['total_modules']} ({overall['completion_percentage']:.1f}%)

- Chapters: {overall['completed_chapters']}/{overall['total_chapters']}

- Average Bloom's Score: {overall['average_bloom_score']:.1f}/10



Chapter Progress:

"""
        
        for chapter_name, chapter_data in self.progress['chapters_completed'].items():
            status = chapter_data.get('status', 'not_started')
            summary += f"- {chapter_name}: {status}\n"
        
        return summary


    def __repr__(self):
        return f"UserState(topic={self.topic}, claimed_level={self.claimed_level}, actual_level={self.actual_level})"