File size: 4,952 Bytes
8fb9fd2
58fd546
 
8fb9fd2
 
 
 
 
 
 
c370011
 
 
 
 
 
 
8fb9fd2
c370011
 
 
 
 
 
 
 
 
 
 
 
 
8fb9fd2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c370011
8fb9fd2
 
 
 
 
 
c370011
 
 
8fb9fd2
 
c370011
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8fb9fd2
 
 
 
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
from supabase import create_client
from dotenv import load_dotenv
load_dotenv()
import os

SUPABASE_URL = os.getenv("SUPABASE_URL")
SUPABASE_KEY = os.getenv("SUPABASE_KEY")

supabase = create_client(SUPABASE_URL, SUPABASE_KEY)

def get_all_logs():
    try:
        response = supabase.table("student_skills").select("user_id, skill").execute()
        return [(item["user_id"], item["skill"]) for item in response.data]
    except Exception as e:
        print(f"Supabase Fetch Error: {e}")
        return []

def add_skill(user_id, skill):
    # check if skill already exists for this user
    existing = supabase.table("student_skills")\
        .select("*")\
        .eq("user_id", user_id)\
        .eq("skill", skill)\
        .execute()
    
    if not existing.data:
        supabase.table("student_skills")\
            .insert({"user_id": user_id, "skill": skill})\
            .execute()
        print(f"Skill '{skill}' added for user {user_id}")

def init_db():
    supabase = create_client(SUPABASE_URL, SUPABASE_KEY)


def create_user(email, password, username):
    try:
        res = supabase.auth.sign_up({
            "email": email,
            "password": password,
            "options": {
                "data": {
                    "username": username
                }
            }
        })
        return "Registration successful! Connect with your email."
    except Exception as e:
        return f"Error: {str(e)}"
    
def login(email, password):
    try:
        res = supabase.auth.sign_in_with_password({
            "email": email,
            "password": password
        })
        if res.user is not None:
            return res.user.id  # return the supabase UUID
        return None
    except Exception as e:
        print(f"Error during login: {e}")
        return None
    
# ---------------- HIERARCHY & CLUSTERS (Condensed from Notebook) ----------------
HIERARCHY = {
    "Arithmetic Operations": {1: ["whole numbers", "ordering", "number line"], 2: ["integers"], 3: ["decimals"], 4: ["order of operations"]},
    "Fractions Decimals Percents": {1: ["equivalent fractions", "conversion"], 2: ["fraction", "decimal"], 3: ["mixed fractions"], 4: ["percent", "ratio", "rate"]},
    "Algebra Basics": {1: ["expression", "terms"], 2: ["like terms", "distributive"], 3: ["simplifying"], 4: ["polynomial"]},
    "Equations and Inequalities": {1: ["one step", "two step"], 2: ["solving"], 3: ["multi", "more than two"], 4: ["inequality"]},
    "Linear Functions": {1: ["pattern", "table"], 2: ["slope"], 3: ["graph"], 4: ["write linear equation", "from situation"]},
    "Systems of Equations": {3: ["graphing"], 4: ["substitution", "system"]},
    "Geometry": {1: ["angles", "triangle", "polygon"], 2: ["perimeter", "area"], 3: ["volume"], 4: ["surface area", "3d"]},
    "Statistics": {1: ["mean", "median", "mode"], 2: ["range"], 3: ["plot", "histogram"], 4: ["scatter", "sampling"]},
    "Probability": {1: ["single"], 2: ["venn"], 3: ["two"], 4: ["combinatorics", "counting"]},
    "Advanced Algebra": {2: ["factoring"], 3: ["quadratic"], 4: ["quadratic formula"]}
}

CLUSTERS = {
    "Arithmetic Operations": ["addition", "subtraction", "multiplication", "division", "order of operations", "computation", "estimation"],
    "Fractions Decimals Percents": ["fraction", "decimal", "percent", "ratio", "rate"],
    "Number Theory": ["prime", "factor", "multiple", "divisibility", "gcf", "lcm", "odd", "even"],
    "Algebra Basics": ["expression", "like terms", "distributive", "polynomial", "simplifying"],
    "Equations and Inequalities": ["equation", "inequality", "solving", "variable"],
    "Linear Functions": ["linear", "slope", "y-intercept", "graph", "table"],
    "Systems of Equations": ["system"],
    "Geometry": ["angle", "triangle", "polygon", "circle", "perimeter", "area", "volume", "surface area", "prism", "cone", "sphere"],
    "Statistics": ["mean", "median", "mode", "range", "plot", "histogram", "scatter"],
    "Probability": ["probability", "venn", "combinatorics", "counting"],
    "Transformations": ["rotation", "reflection", "translation", "symmetry"],
    "Coordinate Geometry": ["coordinate", "distance", "midpoint"],
    "Advanced Algebra": ["quadratic", "factoring", "trinomials"]
}

def assign_cluster(skill):
    skill_lower = skill.lower()
    for cluster, keywords in CLUSTERS.items():
        if any(keyword in skill_lower for keyword in keywords):
            return cluster
    return "Other"

def assign_hierarchy(skill):
    skill_lower = skill.lower()
    for domain, levels in HIERARCHY.items():
        for level, keywords in levels.items():
            if any(keyword in skill_lower for keyword in keywords):
                return domain, level
    return "Other", -1
#create_user("raphael.monteloup@gmail.com", "pass12345", "raph")
#create_user("raphael.leonardi@universite-paris-saclay.fr", "pass23456", "raphael")

#login_result = login("raph", "pass12345")