예제 #1
0
def obtenir_reptes_i_les_seves_proves(usuari: Usuari) -> List[Repte]:
    conn = obtenir_connexio()

    cursor = conn.cursor()

    query = """
        SELECT (nom)
        FROM Repte
    """

    cursor.execute(query)

    resultat = cursor.fetchall()

    reptes = []

    commit(conn, cursor)

    for r in resultat:
        nom_repte = r[0]
        repte = Repte(nom_repte)
        obtenir_proves_de_repte(repte, usuari)
        reptes.append(repte)

    return reptes
예제 #2
0
def verificar_codi(prova: Prova, usuari: Usuari, codi: str) -> bool:
    conn = obtenir_connexio()

    cursor = conn.cursor()

    query = """
        SELECT *
        FROM Prova p
        WHERE p.repte=%s AND
            p.ordre = %s AND
            p.codi = %s
    """
    valors = (prova.repte.nom, prova.ordre, codi)
    cursor.execute(query, valors)

    resultat = cursor.fetchone()

    if resultat is None:
        return False
    ara = datetime.now()
    data_formatada = ara.strftime('%Y-%m-%d %H:%M:%S')
    sql = """
        INSERT INTO Prova_superada (data, repte, ordre_prova, nom_usuari)
        VALUES (%s, %s, %s, %s)
    """
    val = (data_formatada, prova.repte.nom, prova.ordre, usuari.nom)

    try:
        cursor.execute(sql, val)
        commit(conn, cursor)
        return True
    except mysql.connector.errors.IntegrityError:
        conn.rollback()
        tancar_connexio(conn, cursor)
        raise ProvaJaSuperada()
예제 #3
0
def desar_reptes_i_les_seves_proves(reptes: List[Repte]) -> None:
    conn = obtenir_connexio()

    cursor = conn.cursor()

    for repte in reptes:
        query = """
            INSERT IGNORE INTO Repte(nom)
            VALUES (%s)
        """
        valors = (repte.nom,)
        cursor.execute(query, valors)

        for prova in repte.proves:
            query = """
                INSERT INTO Prova(repte, ordre, tipus_usuari, enunciat, codi, puntuacio)
                VALUES (%s, %s, %s, %s, %s, %s)
                ON DUPLICATE KEY UPDATE
                    enunciat=%s, codi=%s, puntuacio=%s
            """
            valors = (repte.nom, prova.ordre, None if prova.tipus_usuari == 'NULL' else prova.tipus_usuari,
                      prova.enunciat, prova.codi, prova.puntuacio,
                      prova.enunciat, prova.codi, prova.puntuacio)

            cursor.execute(query, valors)

    commit(conn, cursor)
예제 #4
0
def obtenir() -> List:
    conn = obtenir_connexio()

    cursor = conn.cursor()

    query = """
        SELECT ps.nom_usuari, u.tipus, SUM(p.puntuacio), MAX(ps.data)
        FROM Prova_superada ps, Prova p, Usuari u
        WHERE ps.repte=p.repte AND
            ps.ordre_prova = p.ordre AND
            ps.nom_usuari = u.nom
        GROUP BY ps.nom_usuari
        ORDER BY SUM(p.puntuacio) DESC, MAX(ps.data)
        LIMIT 15
    """
    # valors = (usuari.nom, )
    cursor.execute(query)  # , valors)

    ranking = []
    resultat = cursor.fetchall()
    for r in resultat:
        ranking.append((r[0], r[1], r[2], r[3]))

    commit(conn, cursor)
    return ranking
예제 #5
0
def obtenir_proves() -> List:
    conn = obtenir_connexio()

    cursor = conn.cursor()

    query = """
        SELECT data, nom_usuari, contrasenya, tipus, ps.repte, ordre_prova, enunciat, codi, p.puntuacio
        FROM Prova_superada ps, Prova p, Usuari u
        WHERE ps.repte = p.repte AND
            ps.ordre_prova = p.ordre AND
            ps.nom_usuari = u.nom
        ORDER BY data DESC
        LIMIT 15
    """
    cursor.execute(query)

    resultat = cursor.fetchall()

    usuaris = []
    reptes = []
    proves = []
    proves_superades = []

    for r in resultat:
        data = r[0]
        nom_usuari = r[1]
        contrasenya = r[2]
        tipus = r[3]
        usuari = next((x for x in usuaris if x.nom == nom_usuari), None)
        if usuari is None:
            usuari = Usuari(nom_usuari, contrasenya, tipus)
            usuaris.append(usuari)

        nom_repte = r[4]
        repte = next((x for x in reptes if x.nom == nom_repte), None)
        if repte is None:
            repte = Repte(nom_repte)
            reptes.append(repte)

        ordre_prova = r[5]
        enunciat = r[6]
        codi = r[7]
        puntuacio = r[8]
        prova = next((x for x in proves
                      if x.repte.nom == nom_repte and x.ordre == ordre_prova),
                     None)
        if prova is None:
            prova = Prova(repte, ordre_prova, "", enunciat, codi, puntuacio)
            proves.append(prova)

        prova_superada = ProvaSuperada(data, prova, usuari)
        proves_superades.append(prova_superada)

    commit(conn, cursor)

    return proves_superades
예제 #6
0
def crear(usuari: Usuari) -> None:
    conn = obtenir_connexio()

    cursor = conn.cursor()

    query = """
        INSERT INTO Usuari(nom, contrasenya, tipus)
        VALUES (%s, AES_ENCRYPT(%s,UNHEX(%s)), %s)
    """
    valors = (usuari.nom, usuari.contrasenya, CLAU_PER_ENCRIPTAR_CONTRASENYES,
              usuari.tipus)

    cursor.execute(query, valors)

    commit(conn, cursor)
예제 #7
0
def autenticar(nom, contrasenya):
    conn = obtenir_connexio()

    cursor = conn.cursor()

    query = """
        SELECT tipus
        FROM Usuari
        WHERE nom=%s AND contrasenya=AES_ENCRYPT(%s, UNHEX(%s))
    """
    valors = (nom, contrasenya, CLAU_PER_ENCRIPTAR_CONTRASENYES)
    cursor.execute(query, valors)

    resultat = cursor.fetchone()

    commit(conn, cursor)
    if resultat is not None:
        return Usuari(nom, contrasenya, resultat[0])
    else:
        return None
예제 #8
0
def obtenir_els_tipus_usuari():
    conn = obtenir_connexio()

    cursor = conn.cursor()

    query = """
        SELECT tipus
        FROM Tipus_usuari
    """

    cursor.execute(query)

    resultat = cursor.fetchall()

    tipus = []

    for r in resultat:
        tipus.append(r[0])

    commit(conn, cursor)

    return tipus
예제 #9
0
def obtenir_punts(usuari: Usuari) -> None:
    conn = obtenir_connexio()
    cursor = conn.cursor()

    query = """
        SELECT SUM(puntuacio)
        FROM Prova_superada ps, Prova p
        WHERE ps.repte=p.repte AND
            ps.ordre_prova = p.ordre AND
            nom_usuari = %s;
    """
    valors = (usuari.nom, )
    cursor.execute(query, valors)

    puntuacio = 0
    resultat = cursor.fetchone()
    if resultat[0] is not None:
        puntuacio = resultat[0]

    commit(conn, cursor)

    usuari.actualitzar_punts(puntuacio)
예제 #10
0
def obtenir_proves_de_repte(repte: Repte, usuari: Usuari) -> None:
    conn = obtenir_connexio()

    cursor = conn.cursor()

    query = """
        SELECT ordre, tipus_usuari, enunciat, codi, puntuacio, ps.nom_usuari
        FROM Prova p
        LEFT JOIN Prova_superada ps ON
            p.repte = ps.repte AND
            p.ordre = ps.ordre_prova AND
            ps.nom_usuari = %s
        WHERE p.repte=%s
    """

    query += """
        AND p.tipus_usuari IN (%s, %s)
    """
    valors = (usuari.nom, repte.nom, usuari.tipus, constants.TOTHOM)

    query += """
        ORDER BY ordre
    """

    cursor.execute(query, valors)

    resultat = cursor.fetchall()

    proves = []

    for r in resultat:
        prova = Prova(repte, r[0], r[1], r[2], r[3], r[4], r[5] is not None)
        proves.append(prova)

    commit(conn, cursor)

    repte.afegeix_proves(proves)