Aller au contenu. | Aller à la navigation

Outils personnels

Navigation
Vous êtes ici : Accueil / Aide pour les responsables / Plomino / Un cas d'utilisation à Saussure

Un cas d'utilisation à Saussure

Contexte

Les élèves sont parfois convoqués à des travaux d'utilité publique (TUP), lorsqu'ils ont trop d'absences injustifiées, de renvois, ...
Historiquement, ces convocations s'effectuent par inscription en salle des maîtres sur une feuille-papier pour la prochaine date disponible : la maître inscrit nom, prénom et groupe.

Avantages :

  • simple et rapide pour le maître (si il y a encore de la place !)

Désavantages :

  • il faut être présent en salle des maîtres
  • si la feuille est complète, on doit revenir faire une inscription plus tard quand la feuille suivante sera disponible
  • il faut gérer l'affichage/désaffichage des feuilles en salle des maîtres
  • pas de vision globale et consolidée possible, sauf à saisir toutes ces infos dans une base de donnée; risque alors de saisie incorrecte des noms ...

Projet

Passer à une inscription en ligne via le site du collège.

Pour le responsable de groupe (RG) :

  1. il se connecte, va sur la page TUP
  2. on lui montre la liste des dates disponibles avec le nombre d'élèves déjà inscrits par date
  3. les dates qui ont déjà un nombre d'élèves maximal ne sont plus disponible pour inscrire un nouvel élève
  4. le RG est reconnu comme RG d'un groupe donné (via son identification et l'annuaire LDAP); on lui présente la liste de tous se élèves (et seulement eux!)
  5. il choisit la date et l'élève à convoquer
  6. il remplit un petit formulaire avec la raison de la convocation
  7. l'information est enregistrée / un formulaire imprimable lui est présenté afin qu'il garde une trace écrite et puisse transmettre une convocation écrite à l'élève

 

Il est possible de faire en sorte que le RG puisse voir l'historique des convocations aux TUPs, classé par nom, par groupe, par date.

Pour le doyen responsable de la gestion des TUPs :

  • il peut à tout moment voir l'historique des convocations aux TUPs, classé par nom, par groupe, par date
  • il peut exporter ces données dans un outil de tableur pour les traiter si nécessaire

Réalisation

Avec Plomino : http://www.collegedesaussure.ch/espace-administratif/travaux-dutilite-publique-tup/tups (demander un compte d'accès)

How-to

La base de données :

  • avoir installé le produit Plomino dans son plone
  • ajouter une "plomino database", la nommer et cliquer " Ne pas afficher la liste des utilisateurs " dans le cas où un ldap est branché (trop long pour les lister si cela n'est pas coché)
  • par défaut, toujours partout laisser tous les paramétrages par défaut, sauf indication contraire
  • cliquer sur Mode debug si nécessaire ...
  • cliquer sur "ACL" et changer dans Generic users access rights : authenticated vers PlominoAuthor
  • cliquer sur "Partage" et donner "voir" aux profs

Premier formulaire et vue : les élèves

Attention : ne pas renommer à tout va les id des objets -> on perd des liens entre form et vue ...

  • ajouter un "plomino formulaire" appelé "Nouvel élève" + id "newstudent"; sauver
  • dans ce formulaire, ajouter 2 champs texte : nomprenom, groupe et un champs nombre : nbtup
  • cliquer sur "Modifier" pour éditer le formulaire; dans "Mise en page", saisir "Groupe : " puis insérer le champ ad-hoc via le bouton ad-hoc (avant dernier en bas à droite) et le rendre obligatoire, puis idem pour "Nom de l'élève" et "Nombre de tups" (attention : le saut de ligne n'est pas facile à gérer, passer en mode html si cela peut aider parfois ...), puis enregistrer
  • on peut tester en ajouter un élève ... puis en le supprimant
  • se remettre à la racine du formulaire et, sur la gauche, cliquer sur "générer une vue", modifier son titre en "Voir tous les élèves" et son id en "alleleve", puis via "Contenus", renommer les 4 objets présents en les francisant ...

Ajout d'une action pour permettre de supprimer tous les enregistrements affichés dans une vue

  • se mettre dans "contenus" de la vue allstudents et ajouter une action "Supprimer toutes les lignes" et id : "deletealllines", choisir "Python script" et insérer le code suivant :
    dbThis = context.getParentDatabase()
    vBlank = dbThis.getView('allstudents')
    docs   = vBlank.getAllDocuments()
    for doc in docs:
        dbThis.deleteDocument(doc)
    [Attention à l'indentatio qui doit être précise (4 espaces ...)]

Charger tous les élèves du collège (pas trouvé la façon d'appeler dynamiquement depuis le ldap...)

  • extraire de smog les données NomPrenom+LibelleGroupe dans un fichier csv
  • ajouter une 3e colonne avec partout la valeur 0
  • nommer la 1re ligne : nomprenom, groupe, nbtup
  • à la racine de la base plomino, cliquer sur "Replication", choisir le formulaire nouveleleve et charger le csv
    Attention : énormes problèmes de format ... si pas le bon, l'import fonctionne mais la vue n'affiche que des lignes "blanches" !
    Si soucis : créer un fichier nouveau dans un tableur, ajouter 3 en-têtes groupe, nomprenom et nbtup et mettre 2-3 essais -> tester l'import-> en principe ok; ensuite, copier-coller dans ce fichier les données exportées de smog ... ; ne pas oublier aussi d'être cohérent avec le séparateur de champ (à priori ;)
  • améliorer la vue : dans la vue alleleve, cliquer sur "modifier" puis cocher "dynamic table", puis aller dans "sorting", choisir nomprenom dans  "colonne à trier" et cocher "categorisation"

Deuxième formulaire et vue: les dates

  • ajouter un "plomino formulaire" appelé "Nouvelle date" + id "newdate"; sauver
  • dans ce formulaire, ajouter 1 champ date : date + 1 champ nomtre : nbtup
  • cliquer sur "Modifier" pour éditer le formulaire; dans "Mise en page", saisir "Date : " puis insérer le champ ad-hoc via le bouton ad-hoc (avant dernier en bas à droite) et le rendre obligatoire, puis idem pour "Nombre d'élèves actuellement convoqué à cette date" (attention : le saut de ligne n'est pas facile à gérer, passer en mode html si cela peut aider parfois ...), puis enregistrer
  • on peut tester en ajouter une date élève ... puis en la supprimant
  • se remettre à la racine du formulaire et, sur la gauche, cliquer sur "générer une vue", modifier son titre en "Voir toutes les dates" et son id en "alldates", puis via "Contenus", renommer les objets présents en les francisant ..
  • ajouter une action pour permettre de supprimer tous les enregistrements affichés dans une vue (cf vue allstudents) et charger les dates depuis un csv (cf élèves)

3e formulaire et vue: saisir un TUP

  • ajouter un "plomino formulaire" appelé "Saisir un TUP" + id "newtup"; sauver
  • ajouter un champ texte "Nom du RG" + id "member" et coller le code ci-dessous dans "Formule"  (on va chercher dans le ldap le nom de la personne connectée)  et cliquer sur "obligatoire" :
    # Import a standard function, and get the HTML request and response objects.

    from Products.PythonScripts.standard import html_quote
    request = container.REQUEST
    response =  request.response

    # on va chercher les éléments concernant l'utilisateur connecté
    membership = context.portal_membership
    user = membership.getMemberInfo()
    fullname = user["fullname"]
    #print request
    #print user
    return fullname
  • ajouter un champ texte "Groupe" + id "group" et coller le code ci-dessous dans "Formule"  (on va chercher dans le ldap le groupe du RG connecté et on indique qu'il n'est pas RG le cas échéant)  et cliquer sur "obligatoire" :
    # Import a standard function, and get the HTML request and response objects.

    from Products.PythonScripts.standard import html_quote
    request = container.REQUEST
    response =  request.response

    # on va chercher les éléments concernant l'utilisateur connecté
    membership = context.portal_membership
    user = membership.getMemberInfo()
    fullname = user["fullname"]
    #print request
    #print user
    #print fullname

    member = membership.getAuthenticatedMember()

    if not member.hasProperty('memberOf'):
        return 'vous n\'êtes pas RG'
    gr_info = member.getProperty("memberOf")

    #return gr_info

    classes = []
    cours = []
    disciplines = []
    if not gr_info:
        return 'vous n\'êtes pas RG'
        groupes = []
    for gr in gr_info:
        groupes = gr.split(',')
        if groupes[1] == 'ou=CLASSES' and groupes[0].split('=')[1] not in classes:
            classes.append(groupes[0].split('=')[1])

    cours.sort()
    classes.sort()
    disciplines.sort()

    return str(classes[0])
    # return str('303')
  • ajouter un champ selectionlist  "Choisir un élève" + id "studentchoice" et sauver, puis cliquer sur modifier puis onglet settings et coller le code ci-dessous (on va lister les élèves de la RG concernée avec entre() le nombre de convocations TUP qu'ils ont jusque-là)  et cliquer sur "obligatoire" :
    # Import a standard function, and get the HTML request and response objects.
     
    from Products.PythonScripts.standard import html_quote
    request = container.REQUEST
    response =  request.response

    # on va chercher les éléments concernant l'utilisateur connecté
    membership = context.portal_membership
    user = membership.getMemberInfo()
    fullname = user["fullname"]
    #print request
    #print user
    #print fullname

    member = membership.getAuthenticatedMember()

    if not member.hasProperty('memberOf'):
        return ''
    gr_info = member.getProperty("memberOf")

    #return gr_info

    classes = []
    cours = []
    disciplines = []
    if not gr_info:
        l=['pas de convocation possible']
        return l

    groupes = []
    for gr in gr_info:
        groupes = gr.split(',')
        if groupes[1] == 'ou=CLASSES' and groupes[0].split('=')[1] not in classes:
            classes.append(groupes[0].split('=')[1])
    cours.sort()
    classes.sort()
    disciplines.sort()
  • # on va chercher dans la vue des élèves
    db = plominoDocument.getParentDatabase()
    view = db.getView('allnouveleleve')
    l=[]
    t=[]
    for doc in view.getAllDocuments():
        nompr = doc.getItem('nomprenom')
        nbrtup = doc.getItem('nbtup')
        nompr_nbrtup=[str(nompr)+' ('+str(nbrtup)+')']

        gr = [doc.getItem('groupe')]
        if gr[0] == str(classes[0]):
            l = l+nompr_nbrtup
    return l
  • ajouter un champ selectionlist  "Date" + id "tupdate" et sauver, puis cliquer sur modifier puis onglet settings et coller le code ci-dessous (on va lister les dates possibles avec entre() le nombre actuel d'élèves convoqués / si ce nombre est >20, la date n'est pas montrée)  et cliquer sur "obligatoire" :
    # on va chercher dans la vue des dates
    db = plominoDocument.getParentDatabase()
    view = db.getView('alldates')
    l=[]

    # si nbel déjà inscrits est trop grand, on ne prend pas la date
    auj =  DateTime()
    for doc in view.getAllDocuments():
        date = doc.getItem('date')
        dateaff = str(doc.getItem('date'))[0:10]
        nbel = doc.getItem('nbeleves')
        if nbel<3 and auj<date:
            date_nb=[dateaff+' ('+str(nbel)+')']
            l = l+date_nb

    if l=="":
        l = l+"Il n'y a plus de date disponible, veuillez contacter M. Sarkissian"
       
    return l
  • ajouter un champ texte  "Motif" + id "motif" et sauver, puis cliquer sur modifier puis onglet settings et choisir Longtext et taille=5 ; cliquer sur "obligatoire" :
  • ajouter un champ texte  "Imprimer" + id "imprimer" et coller le code suivant dans "Formule" en choisissant Computed for display dans "Mode" :
    html="""<a href="%s?openwithform=tupsaisi" target="_new">CLIQUER ICI</a>""" %
    context.doc_url()
    return html
  • modifier le formulaire soit à la main, soit en copier le code html suivant :
    <table border="0" class="invisible">
    <tbody>
    <tr>
    <td>
    <p class=" "><strong>Nom du responsable de groupe</strong> : <span class="plominoFieldClass">member</span></p>
    </td>
    </tr>
    <tr>
    <td>
    <p class=" "><strong>Groupe :</strong> <span class="plominoFieldClass">group</span></p>
    </td>
    </tr>
    <tr>
    <td>
    <p class=" "><strong><strong>Nom de l'élève à convoquer :</strong><span> </span><span class="plominoFieldClass">studentchoice</span><strong><br /></strong></strong>(entre parenthèse : le nombre de TUP de l'élève avant cette convocation)</p>
    </td>
    </tr>
    <tr>
    <td>
    <p class=" "><strong>Prochaines dates possibles pour le TUP</strong> : <span class="plominoFieldClass">tupdate</span><span></span><strong><br /></strong>(entre parenthèse : le nombre d'élèves inscrits à cette date avant cette convocation)<br />si ce nombre est supérieur à 20, cette date n'est plus proposée dans la liste)</p>
    </td>
    </tr>
    <tr>
    <td>
    <p class=" "><strong>Motif :</strong> <span class="plominoFieldClass">motif</span></p>
    </td>
    </tr>
    </tbody>
    </table>

4e formulaire : TUP saisi (un formulaire spécifique pour affichage/impression une fois le TUP convoqué)

  • créer un form "TUP saisi"+id "tupsaisi" qui contient les champs member, groupe, studentchoice, dates et motif (idem à Saisir un TUP)
  • lui ajouter un champ print_js/print_js en choisissant dans Type : *Rich text" et dans Mode : "Computed for display"
  • modifier le form en ajoutant le html suivant :
    <p>Rappel : l'élève convoqué doit se présenter au secrétariat à 15h.</p>
    <table class="vertical listing">
    <tbody>
    <tr><th>TUP saisi par</th>
    <td>
    <p><span class="plominoFieldClass">member</span></p>
    </td>
    </tr>
    <tr><th>Groupe</th>
    <td><span class="plominoFieldClass">groupe</span></td>
    </tr>
    <tr><th>Nom de l'élève convoqué<strong><strong></strong></strong></th>
    <td>
    <p><span class="plominoFieldClass">studentchoice</span> <br />(entre parenthèse : le nombre de TUP de l'élève avant cette convocation)</p>
    </td>
    </tr>
    <tr><th>
    <p>Date</p>
    </th>
    <td><span class="plominoFieldClass">tupdate</span><br />(entre parenthèse : le nombre d'élèves inscrits à cette date avant cette convocation)</td>
    </tr>
    <tr><th>Motif</th>
    <td>
    <p><span class="plominoFieldClass">motif</span></p>
    </td>
    </tr>
    </tbody>
    </table>
    <p><span class="plominoFieldClass">print_js</span></p>

Actions à réaliser après avoir utilisé le form Saisir un TUP

  • modifier le formulaire Saisir un TUP, onglet Events, champ Sauvegarde du document ainsi (cela met à jour les compteurs associés à un élève convoqué [entre() son nombre de TUPs ] et à une date choisie [entre() le total d'élèves déjà convoqués à cette date] puis on redirige vers le form TUP saisi pour meilleure vue et impression :
    # ATTENTION : EN L'ETAT OK SEULEMENT SI NBR DE TUP EST EGAL À 0,1,2 ...,9 -> SI DEUX CHIFFRES COMPARAISON FOIRERA

    # chercher la valeur du nom d'élève choisi dans le champ du formulaire qui vient d'être cliqué
    nom = plominoDocument.getItem('studentchoice')
    date = plominoDocument.getItem('tupdate')



    # comme on a ajouté à la fin de tous les noms le nombre de tup déjà faits, on doit enlever cette info (4 derniers caractères)
    nomok = nom[0:-4]
    dateok = str(date)[0:-4]

    # on met dans la variable le choix mais sans l'affichage du nombre entre parenthèses !
    #plominoDocument.setItem('studentchoice',nomok)
    #plominoDocument.setItem('tupdate',dateok)


    # on va chercher la base, puis les vues qui nous intéressent
    db = plominoDocument.getParentDatabase()
    view_el = db.getView('allnouveleleve')
    view_dates = db.getView('alldates')
       

    # on va chercher la base, puis les vues qui nous intéressent
    db = plominoDocument.getParentDatabase()
    view_el = db.getView('allnouveleleve')
    view_dates = db.getView('alldates')

    # on parcourt tous les documents de la vue des élèves, on extrait les bons champs
    # si le nom choisi dans le formulaire est celui du doc, on ajoute 1 à son nombre de tups
    for doc in view_el.getAllDocuments():
        nominit = doc.getItem('nomprenom')
        nbretup = doc.getItem('nbtup')
        if nomok==nominit:
            nbretup=nbretup+1
            doc.setItem('nbtup', nbretup)
            doc.refresh()

    # on parcourt tous les documents de la vue des dates, on extrait les bons champs
    # si la date choisie dans le formulaire est celle du doc, on ajoute 1 à son nombre d'élèves
    for doc1 in view_dates.getAllDocuments():
        dateinit = str(doc1.getItem('date'))[0:10]
        nbrel = doc1.getItem('nbeleves')
        if dateok==dateinit:
            nbrel=nbrel+1
            doc1.setItem('nbeleves', nbrel)
            doc1.refresh()

    # redirection apres save vers le formulaire tupsaisi pour une mise en page spécifique pour impression
    plominoDocument.setItem('Form', 'tupsaisi')
    plominoDocument.save()

Dernière vue pour résumer

  • créer une vue "Voir tous les TUPs convoqués par groupes "+ id: alltupsaisi et y insérer les colonnes suivantes : groupe, member, studentchoice, dates et motif en récupérant les données dans les form ad-hoc ; paramétrer sur "dynamic table" + cliquer sur settings : categorisation
  • ajouter deux actions d'export XLS et CSV :

Finaliser

  • cacher les formulaires qui ne doivent pas être visible pour le RG mais rester à disposition de l'admin/du doyen responsable : modifier -> cocher "cacher dans le menu"
  • placer les actions là où on le souhaite dans les formulaires : modifier -> cocher "Position de la barre d'action" en bas