ScoDoc/misc/change_etudid.py

77 lines
2.2 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Change un etudid
Suite a de fausses manips, il arrive que l'on est des "doublons":
le même étudiant est enregistré sous deux "etudid" différents !
Normalement, l'utilisation d'imports basés sur le code NIP (Apogée)
évite le problème (qui ne se pose qu'en cas d'inscriptions manuelles
mal gérées).
Ce script permet de changer un etudid, typiquement pour associer à un
etudiant le code d'un autre étudiant (son doublon).
Ne traite que les inscriptions, les notes, absences, annotations, mais
évidemment pas les tables uniques (identité, adresse, admission).
Attention: script a lancer en tant que "www-data", avec ScoDoc arrete
et postgresql lance
Emmanuel Viennet, 2007-2020
"""
from __future__ import print_function
import pdb
import sys
import psycopg2
if len(sys.argv) != 4:
print("Usage: %s database orig_etudid dest_etudid" % sys.argv[0])
print(" Fusionne l'étudiant orig dans l'étudiant dest.")
print(" L'identité, adresse et admission de dest restent inchangées.")
print(" Les inscriptions, notes, absences etc. d'orig sont associées à dest.")
print(" Après cette operation, orig_etudid peut être supprimé.")
print("Exemple: change_etudid.py SCOGEII E1234 E87654")
sys.exit(1)
dbname = sys.argv[1]
OLD_ID = sys.argv[2] # etudid qui est en double (que l'on supprime)
NEW_ID = sys.argv[3] # etudid destination (celui d'origine)
DBCNXSTRING = "dbname=%s" % dbname
cnx = psycopg2.connect(DBCNXSTRING)
cursor = cnx.cursor()
req = "update %s set etudid=%%(new_etudid)s where etudid=%%(old_etudid)s"
args = {"old_etudid": OLD_ID, "new_etudid": NEW_ID}
tables = (
"absences",
"absences_notifications",
"billet_absence",
"scolog",
"etud_annotations",
"notes_formsemestre_inscription",
"notes_moduleimpl_inscription",
"notes_notes",
"notes_notes_log",
"scolar_events",
"scolar_formsemestre_validation",
"scolar_autorisation_inscription",
"notes_appreciations",
"itemsuivi",
"group_membership",
# nouvelles absences
#'abs_absences',
#'abs_presences',
#'abs_justifs',
)
for table in tables:
cursor.execute(req % table, args)
print("table %s: %s" % (table, cursor.statusmessage))
cnx.commit()