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
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()
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)
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
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
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)
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
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
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)
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)