Creare i gruppi studenti

Dopo aver inserito i nuovi studenti in piattaforma gestendo automaticamente le omonimie passiamo ora alla creazione dei gruppi classe. Per gli indirizzi email dei gruppi useremo questa sintassi:

  • alunni.classe.plesso@dominio

Ad esempio, l’indirizzo del gruppo della classe 3b del plesso “Giuseppe Mazzini” sarà alunni.3b.mazzini@dominio. Verranno creati contestualmente altri due gruppi:

  • irc.classe.plesso@dominio che conterrà tutti gli alunni che si avvalgono dell’insegnamento della Religione Cattolica (ad esempio irc.3b.mazzini@dominio);
  • aa.classe.plesso@dominio che conterrà tutti gli alunni che non si avvalgono dell’insegnamento della Religione Cattolica e partecipano alle lezioni di Attività Alternativa (ad esempio aa.3b.mazzini@dominio);

Queste ultime due tipologie di gruppo saranno utili in fase di creazione delle Google Classroom per invitare solo gli studenti di pertinenza dell’IRC o di Attività Alternativa.

Lo script che andremo a lanciare si chiama createStudentsGroup.py ed è ilseguente:

from services import gspreadSrv
from utilities import Group, User
import settings
from datetime import datetime
        
#Determina il gruppo principale dell'alunno            
def setMainGroup(record, school):
    mainGroup = Group(f'alunni.{record["Classe"]}.{school.lower()}@{settings.domain}')
    mainGroup.setProperties(f'Alunni {record["Classe"]} {school}',
                            f'Tutti gli alunni classe {record["Classe"]} plesso {school}'
                           )
    
    return mainGroup

#Determina il gruppo secondario dell'alunno (IRC o Attività alternativa)    
def setSecondaryGroup(record, school):
    if record['Religione Cattolica'] == "SI":
        secondaryGroup = Group(f'irc.{record["Classe"]}.{school.lower()}@{settings.domain}')
        secondaryGroup.setProperties(f'Alunni IRC {record["Classe"]} {school}',
                                     f'Alunni avvalentisi IRC classe {record["Classe"]} plesso {school}' 
                                    )   
    else:
        secondaryGroup = Group(f'aa.{record["Classe"]}.{school.lower()}@{settings.domain}')
        secondaryGroup.setProperties(f'Alunni Attività Alternativa {record["Classe"]} {school}',
                                     f'Alunni non avvalentisi IRC classe {record["Classe"]} plesso {school}' 
                                    )
                               
    return secondaryGroup

#Trova la colonna "Inserito" nel foglio Google da impostare su "SI"
def getColumn(groupemail, sheet):
    stop = groupemail.find(".")
    groupType = groupemail[:stop]
    
    if groupType == 'alunni':
        return sheet.row_values(1).index("Inserito Gruppo Classe") + 1
    else:
        return sheet.row_values(1).index("Inserito Gruppo IRC/AA") + 1
    
#Controlla se un record è già stato processato, ovvero se l'alunno è già stato inserito in entrambi i gruppi
def recordIsProcessed(record):
    if record['Inserito Gruppo Classe'] == 'SI' and record['Inserito Gruppo IRC/AA'] == 'SI':
        return True
    else:
        return False

#Crea la lista dei gruppi nei quali l'alunno deve essere inserito
def createStudentGroupsList(record):
        user = User("")
        user.getSchool(record['Cod Meccanografico'])
        studentGroups = []
        
        if record['Inserito Gruppo Classe'] == '':
            mainGroup = setMainGroup(record, user.school)
            studentGroups.append(mainGroup)
            
        if record['Inserito Gruppo IRC/AA'] == '':
            secondaryGroup = setSecondaryGroup(record, user.school)
            studentGroups.append(secondaryGroup) 
            
        return studentGroups

#Apro il foglio Google con i dati e ricavo tutti i record
ss = gspreadSrv.open('Elenco Studenti 2022/2023')
sh = ss.worksheet('Foglio1')
records = sh.get_all_records()

#Inizializzo una lista vuota per i gruppi dello studente
studentGroups = []

#Inizilizzo a 2 un contatore
count = 2

#Scorro tutti i record
for record in records:
    
    #Controllo se il record è processato, se non lo è creo la lista gruppi dell'alunno
    if recordIsProcessed(record) == False:
        studentGroups = createStudentGroupsList(record)
        
        #Scorro la lista gruppi dell'alunno
        for group in studentGroups:
            #Inizializzo un oggetto group e controllo se il gruppo esiste. Se il gruppo non esiste, lo creo al momento.
            if group.exists() == False:
                
                #Creo il nuovo gruppo nel caso non esista
                group.create()
                print(f"[{datetime.now()}] Creato gruppo {group.email}")
                
                #Applico le impostazioni corrette al gruppo appena creato
                group.patch(settings.groupSettings)
                print(f"[{datetime.now()}] Applicate impostazioni al gruppo {group.email}")
                
            #Inserisco l'alunno nel gruppo
            group.addMember(record['Email'])
            
            #Imposto la colonna "Inserito..." su "SI"
            sh.update_cell(count, getColumn(group.email, sh), "SI")
            print(f"[{datetime.now()}] {record['Email']} aggiunto al  gruppo {group.email}")
            
    #Incremento il contatore        
    count += 1

Lo script scorre gli stessi dati del file “Elenco Studenti 2022/2023” usato precedentemente e in automatico effettua queste operazioni:

  • Verifica l’esistenza dei due gruppi dei quali l’alunno deve far parte (alunni e IRC/aa)
  • Se i gruppi non esistono vengono creati in tempo reale
  • Se i gruppi vengono creati contestualmente vengono applicate le corrette impostazioni agli stessi
  • Lo studente viene infine inserito nel gruppo

Prima di lanciare lo script è necessario aggiungere due colonne al file: “Inserito Gruppo Classe” e “Inserito Gruppo IRC/AA”, che verranno aggiornate in tempo reale durante l’esecuzioni per darci conferma che l’utente è stato inserito nei gruppi corretti. Queste colonne servono inoltre per far ripartire lo script dalla riga del file dove l’esecuzione si era fermata in caso di arresto accidentale.

Vi è un secondo script che tornerà utile invece all’inizio del prossimo anno scolastico: deleteGroups.py

import settings
from utilities import Group
import re

stop = "Operazione annullata"
domain = settings.domain

def selectGroup():
    selection = input("Quale tipo di gruppi vuoi cancellare? (digita il numero corrispondente e premere Invio)\n   1) Studenti 2) Docenti 3) Annulla\n")
    if selection == "1":
        groupType = "Studenti"
        groupPattern = r"(aa|alunni|irc)"
        confirm(groupType, groupPattern)
    elif selection == "2":
        groupType = "Docenti"
        groupPattern = r"docenti"
        confirm(groupType, groupPattern)
    else:
        print(stop)
    
def match(groupPattern, groupKey):
    pattern = groupPattern + r"\.\d\w\.\w*@" + domain
    if re.match(pattern, groupKey):
        return True
    else:
        return False
    
def confirm(groupType, groupPattern):       
    confirm = input(f"Confermi che vuoi cancellare tutti i gruppi {groupType}?\n  SI/NO\n")
    if confirm.lower() == "si" or confirm.lower() == "s":
        groupsList = Group.listAllGroups()
        for group in groupsList:
            groupKey = group['email']
            if match(groupPattern, groupKey):
                groupToDelete = Group(groupKey)
                groupToDelete.delete()
                print(f'Gruppo {groupToDelete.email} correttamente cancellato')    
    else:
        print(stop)   


try:
    selectGroup()
except Exception as error:
    print(str(error))  

Questo file elimina tutti i gruppi il cui indirizzo email risponde alla sintassi impostata, cioè

  • alunni.classe.plesso
  • irc.classe.plesso
  • aa.classe.plesso

In realtà serve anche a cancellare i gruppi docenti, di cui non abbiamo ancora parlato. Grazie ad una espressione regolare l’esecuzione capta solo i gruppi il cui indirizzo email corrisponde al pattern preimpostato, lasciando perdere qualsiasi altro gruppo presente in piattaforma: un eventuale gruppo alunni.chitarra.plesso contenente tutti gli alunni della scuola che suonano la chitarra non verrebbe eliminato. Così facendo non dovremo preoccuparci di rinominare gruppi o gestire alias ad inizio anno scolastico perché faremo semplicemente “tabula rasa” dei gruppi presenti per poi ricrearli mediante il primo script presentato in questa pagina.

Tutte queste operazioni sono illustrate in questo tutorial video: