Merge branch 'master' of https://scodoc.org/git/viennet/ScoDoc into refactor_nt

This commit is contained in:
Emmanuel Viennet 2022-01-05 16:52:53 +01:00
commit 235556f825
8 changed files with 69 additions and 36 deletions

View File

@ -54,6 +54,7 @@ class CreateDeptForm(FlaskForm):
validators.DataRequired("acronyme du département requis"), validators.DataRequired("acronyme du département requis"),
], ],
) )
# description = StringField(label="Description")
visible = BooleanField( visible = BooleanField(
"Visible sur page d'accueil", "Visible sur page d'accueil",
default=True, default=True,

View File

@ -12,8 +12,10 @@ class Departement(db.Model):
"""Un département ScoDoc""" """Un département ScoDoc"""
id = db.Column(db.Integer, primary_key=True) id = db.Column(db.Integer, primary_key=True)
acronym = db.Column(db.String(SHORT_STR_LEN), nullable=False, index=True) acronym = db.Column(
description = db.Column(db.Text()) db.String(SHORT_STR_LEN), nullable=False, index=True
) # ne change jamais, voir la pref. DeptName
description = db.Column(db.Text()) # pas utilisé par ScoDoc : voir DeptFullName
date_creation = db.Column(db.DateTime(timezone=True), server_default=db.func.now()) date_creation = db.Column(db.DateTime(timezone=True), server_default=db.func.now())
visible = db.Column( visible = db.Column(
db.Boolean(), nullable=False, default=True, server_default="true" db.Boolean(), nullable=False, default=True, server_default="true"

View File

@ -49,16 +49,12 @@ from app.scodoc import sco_etud
from app.scodoc import sco_excel from app.scodoc import sco_excel
from app.scodoc import sco_formsemestre from app.scodoc import sco_formsemestre
from app.scodoc import sco_formsemestre_inscriptions from app.scodoc import sco_formsemestre_inscriptions
from app.scodoc import sco_formsemestre_status
from app.scodoc import sco_parcours_dut from app.scodoc import sco_parcours_dut
from app.scodoc import sco_pdf
from app.scodoc import sco_preferences from app.scodoc import sco_preferences
import sco_version import sco_version
from app.scodoc.gen_tables import GenTable from app.scodoc.gen_tables import GenTable
from app import log from app import log
from app.scodoc.sco_codes_parcours import code_semestre_validant from app.scodoc.sco_codes_parcours import code_semestre_validant
from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc.sco_pdf import SU
MAX_ETUD_IN_DESCR = 20 MAX_ETUD_IN_DESCR = 20
@ -121,9 +117,9 @@ def _categories_and_results(etuds, category, result):
categories[etud[category]] = True categories[etud[category]] = True
results[etud[result]] = True results[etud[result]] = True
categories = list(categories.keys()) categories = list(categories.keys())
categories.sort() categories.sort(key=scu.heterogeneous_sorting_key)
results = list(results.keys()) results = list(results.keys())
results.sort() results.sort(key=scu.heterogeneous_sorting_key)
return categories, results return categories, results
@ -166,7 +162,7 @@ def _results_by_category(
l["sumpercent"] = "%2.1f%%" % ((100.0 * l["sum"]) / tot) l["sumpercent"] = "%2.1f%%" % ((100.0 * l["sum"]) / tot)
# #
codes = list(results.keys()) codes = list(results.keys())
codes.sort() codes.sort(key=scu.heterogeneous_sorting_key)
bottom_titles = [] bottom_titles = []
if C: # ligne du bas avec totaux: if C: # ligne du bas avec totaux:
@ -314,7 +310,7 @@ def formsemestre_report_counts(
"type_admission", "type_admission",
"boursier_prec", "boursier_prec",
] ]
keys.sort() keys.sort(key=scu.heterogeneous_sorting_key)
F = [ F = [
"""<form name="f" method="get" action="%s"><p> """<form name="f" method="get" action="%s"><p>
Colonnes: <select name="result" onchange="document.f.submit()">""" Colonnes: <select name="result" onchange="document.f.submit()">"""
@ -497,7 +493,7 @@ def table_suivi_cohorte(
P.append(p) P.append(p)
# 4-- regroupe par indice de semestre S_i # 4-- regroupe par indice de semestre S_i
indices_sems = list(set([s["semestre_id"] for s in sems])) indices_sems = list({s["semestre_id"] for s in sems})
indices_sems.sort() indices_sems.sort()
for p in P: for p in P:
p.nb_etuds = 0 # nombre total d'etudiants dans la periode p.nb_etuds = 0 # nombre total d'etudiants dans la periode
@ -788,9 +784,9 @@ def _gen_form_selectetuds(
): ):
"""HTML form pour choix criteres selection etudiants""" """HTML form pour choix criteres selection etudiants"""
bacs = list(bacs) bacs = list(bacs)
bacs.sort() bacs.sort(key=scu.heterogeneous_sorting_key)
bacspecialites = list(bacspecialites) bacspecialites = list(bacspecialites)
bacspecialites.sort() bacspecialites.sort(key=scu.heterogeneous_sorting_key)
# on peut avoir un mix de chaines vides et d'entiers: # on peut avoir un mix de chaines vides et d'entiers:
annee_bacs = [int(x) if x else 0 for x in annee_bacs] annee_bacs = [int(x) if x else 0 for x in annee_bacs]
annee_bacs.sort() annee_bacs.sort()

View File

@ -898,6 +898,11 @@ def sort_dates(L, reverse=False):
raise raise
def heterogeneous_sorting_key(x):
"key to sort non homogeneous sequences"
return (float(x), "") if isinstance(x, (bool, float, int)) else (-1e34, str(x))
def query_portal(req, msg="Portail Apogee", timeout=3): def query_portal(req, msg="Portail Apogee", timeout=3):
"""Retreives external data using HTTP request """Retreives external data using HTTP request
(used to connect to Apogee portal, or ScoDoc server) (used to connect to Apogee portal, or ScoDoc server)

View File

@ -17,7 +17,9 @@
<li> <li>
<a class="stdlink {{'link_accessible' if current_user.has_permission(Permission.ScoView, dept=dept.acronym) else 'link_unauthorized'}}" <a class="stdlink {{'link_accessible' if current_user.has_permission(Permission.ScoView, dept=dept.acronym) else 'link_unauthorized'}}"
href="{{url_for('scolar.index_html', scodoc_dept=dept.acronym)}}">Département href="{{url_for('scolar.index_html', scodoc_dept=dept.acronym)}}">Département
{{dept.preferences.filter_by(name="DeptName").first().value}}</a> {{dept.preferences.filter_by(name="DeptName").first().value}}
{{ dept.preferences.filter_by( name="DeptFullName" ).first().value or "" }}
</a>
{% if current_user.is_administrator() %} {% if current_user.is_administrator() %}
<span class="dept_visibility"> <span class="dept_visibility">
{% if dept.visible %}visible{% else %}caché aux utilisateurs{% endif %} {% if dept.visible %}visible{% else %}caché aux utilisateurs{% endif %}

View File

@ -107,7 +107,11 @@ def create_dept():
if request.method == "POST" and form.cancel.data: # cancel button if request.method == "POST" and form.cancel.data: # cancel button
return redirect(url_for("scodoc.index")) return redirect(url_for("scodoc.index"))
if form.validate_on_submit(): if form.validate_on_submit():
departements.create_dept(form.acronym.data, visible=form.visible.data) departements.create_dept(
form.acronym.data,
visible=form.visible.data,
# description=form.description.data,
)
flash(f"Département {form.acronym.data} créé.") flash(f"Département {form.acronym.data} créé.")
return redirect(url_for("scodoc.index")) return redirect(url_for("scodoc.index"))
return render_template( return render_template(

View File

@ -388,6 +388,9 @@ def create_user_form(user_name=None, edit=0, all_roles=1):
"explanation": """département de rattachement de l'utilisateur""", "explanation": """département de rattachement de l'utilisateur""",
"labels": selectable_dept_acronyms, "labels": selectable_dept_acronyms,
"allowed_values": selectable_dept_acronyms, "allowed_values": selectable_dept_acronyms,
"default": g.scodoc_dept
if g.scodoc_dept in selectable_dept_acronyms
else "",
}, },
) )
) )

View File

@ -24,53 +24,74 @@ usage() {
exit 1 exit 1
} }
# analyse de la ligne de commande
# calcule:
# SRC = fichier source de la restauration
# DB_DEST = base de données destination
# KEEP_ENV = vide si restauration à l'identique (i.e. production)
if (($# < 1 || $# > 2)) if (($# < 1 || $# > 2))
then then
usage usage
elif [ $# -eq 2 -a $1 != '--keep-env' -a $2 != '--keep-env' ] ; then elif [ $# -eq 2 ] && [ "$1" != "--keep-env" ] && [ "$2" != "--keep-env" ]
then
usage usage
elif [ $# -eq 1 ] ; then elif [ $# -eq 1 ]
then
echo "restauration des données et de la configuration originale (production)" echo "restauration des données et de la configuration originale (production)"
SRC=$1 SRC="$1"
DB_DEST="SCODOC" DB_DEST="SCODOC"
else else
echo "restauration des données dans la configuration actuelle" echo "restauration des données dans la configuration actuelle"
DB_CURRENT=$(su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask scodoc-database -n)") DB_CURRENT=$(su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask scodoc-database -n)")
DB_DEST="$DB_CURRENT" DB_DEST="$DB_CURRENT"
KEEP=1 KEEP_ENV="Y"
if [ $1 = '--keep-env' ]; then if [ "$1" = "--keep-env" ]
SRC=$2 then
SRC="$2"
else else
SRC=$1 SRC="$1"
fi fi
fi fi
DB_DUMP="${SCODOC_VAR_DIR}"/SCODOC.dump DB_DUMP="${SCODOC_VAR_DIR}"/SCODOC.dump
# Safety check # Safety check
echo "Ce script va remplacer les donnees de votre installation ScoDoc par celles" echo "Ce script va remplacer les données de votre installation ScoDoc par celles"
echo "enregistrées dans le fichier fourni." echo "enregistrées dans le fichier fourni."
echo "Ce fichier doit avoir ete cree par le script save_scodoc9_data.sh." echo "Ce fichier doit avoir été créé par le script save_scodoc9_data.sh."
echo echo
echo "Attention: TOUTES LES DONNEES DE CE SCODOC SERONT REMPLACEES !" echo "Attention: TOUTES LES DONNEES DE CE SCODOC SERONT REMPLACEES !"
echo "Notamment, tous les utilisateurs et departements existants seront effaces !" echo "Notamment, tous les utilisateurs et départements existants seront effacés !"
echo echo
echo "La base SQL $DB_CURRENT sera effacée et remplacée !!!" echo "La base SQL $DB_CURRENT sera effacée et remplacée !!!"
echo echo
echo -n "Voulez vous poursuivre cette operation ? (y/n) [n]" # Préparation si une copie 'antique' doit être effacée, demander confirmation, puis effacer
read -r ans SCODOC_VAR_OLD=${SCODOC_VAR_DIR}.old
if [ ! "$(norm_ans "$ans")" = 'Y' ] if [ -e "$SCODOC_VAR_DIR" ] && [ -e "$SCODOC_VAR_OLD" ]
then then
echo "Annulation" echo "Une ancienne sauvegarde (\"$SCODOC_VAR_OLD\" en date du $(stat -c %w "$SCODOC_VAR_OLD") ) va être effacée."
echo
fi
if [ -n "$KEEP_ENV" ]
then
echo -n "Restauration des données sans changement de configuration: Assurez-vous d'avoir arrêté le serveur scodoc."
echo
fi
echo -n "Voulez-vous poursuivre la restauration ? (y/n) [n]"
read -r ans
if [ ! "$(norm_ans "$ans")" = "Y" ]
then
echo "Annulation de la restauration par l\'utilisateur"
exit 1 exit 1
fi fi
rm -rf "$SCODOC_VAR_OLD" || die "Erreur suppression $SCODOC_VAR_OLD"
# -- Stop ScoDoc # -- Stop ScoDoc
if [ $KEEP -ne 1 ]; then if [ -z "$KEEP_ENV" ]
then
echo "Arrêt de scodoc9..." echo "Arrêt de scodoc9..."
systemctl stop scodoc9 systemctl stop scodoc9
else
echo -n "Assurez-vous d'avoir arrété le serveur scodoc (validez pour continuer)"
read ans
fi fi
# Clear caches # Clear caches
@ -86,7 +107,7 @@ fi
# -- Ouverture archive # -- Ouverture archive
echo "Ouverture archive $SRC..." echo "Ouverture archive $SRC..."
(cd $(dirname "$SCODOC_VAR_DIR"); tar xfz "$SRC") || die "Error opening archive" (cd "$(dirname "$SCODOC_VAR_DIR")"; tar xfz "$SRC") || die "Error opening archive"
# -- Ckeck/fix owner # -- Ckeck/fix owner
echo "Vérification du propriétaire..." echo "Vérification du propriétaire..."
@ -103,7 +124,7 @@ su -c "createdb $DB_DEST" "$SCODOC_USER" || die "Erreur création db"
if [ ! -z $KEEP_ENV ] ; then if [ ! -z $KEEP_ENV ] ; then
echo "conservation de la configuration actuelle" echo "conservation de la configuration actuelle"
cp "$SCODOC_VAR_DIR".old/.env "$SCODOC_VAR_DIR"/.env cp -p "$SCODOC_VAR_OLD"/.env "$SCODOC_VAR_DIR"/.env
echo "récupération des données..." echo "récupération des données..."
su -c "pg_restore -f - $DB_DUMP | psql -q $DB_DEST" "$SCODOC_USER" >/dev/null || die "Erreur chargement/renommage de la base SQL" su -c "pg_restore -f - $DB_DUMP | psql -q $DB_DEST" "$SCODOC_USER" >/dev/null || die "Erreur chargement/renommage de la base SQL"
su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask db upgrade)" "$SCODOC_USER" su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask db upgrade)" "$SCODOC_USER"
@ -119,5 +140,4 @@ else
systemctl start scodoc9 systemctl start scodoc9
fi fi
echo "Terminé." echo "Terminé."