- Restructure: move backend from new_project/ to backend/ - Add full React/TypeScript frontend (37 pages, 17 services, 16 type defs, 11 query hooks) - Add docs/ with SRS specs, user stories, and workflow documentation - Update .gitignore for new directory layout Workflows implemented: WF1 User Signup, WF2 Placement Test, WF3 Exam Configuration, WF4 General English Exam, WF5 Course Generation, WF6 Entity Student Onboarding, AI Course Generation, Adaptive Learning Engine UI, White-Label Branding, Score Release Made-with: Cursor
36 lines
1.2 KiB
Python
36 lines
1.2 KiB
Python
import logging
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
STYLE_RESOURCE_MAP = {
|
|
'visual': ['video', 'pdf', 'interactive'],
|
|
'auditory': ['video', 'interactive'],
|
|
'reading': ['pdf', 'document'],
|
|
'kinesthetic': ['interactive'],
|
|
}
|
|
|
|
|
|
class StyleMatcher:
|
|
"""Ranks learning resources based on student's learning style preference."""
|
|
|
|
@classmethod
|
|
def rank_resources(cls, learning_style, resources):
|
|
"""Sort resources so that types matching the student's style come first.
|
|
|
|
Args:
|
|
learning_style: str, one of visual/auditory/reading/kinesthetic
|
|
resources: recordset of encoach.resource
|
|
|
|
Returns:
|
|
sorted list of resource records
|
|
"""
|
|
preferred_types = STYLE_RESOURCE_MAP.get(learning_style, [])
|
|
return sorted(resources, key=lambda r: (r.type not in preferred_types, r.id))
|
|
|
|
@classmethod
|
|
def filter_by_style(cls, learning_style, resources):
|
|
"""Return only resources matching the learning style (with fallback to all)."""
|
|
preferred_types = STYLE_RESOURCE_MAP.get(learning_style, [])
|
|
matched = [r for r in resources if r.type in preferred_types]
|
|
return matched if matched else list(resources)
|