Commit 94cb70e7 authored by Florent Chehab's avatar Florent Chehab
Browse files

Final touch ; génération not tested

parent 556bdc2f
......@@ -104,7 +104,7 @@
" warnings.warn(\"Génération aléatoires des données manquantes.\")\n",
" generate_data_file(semester)\n",
" else:\n",
" raise ValueError(\"Données manquantes. Et le fichier de configuration ne permet pas de générer des données.\")\n",
" raise ValueError(\"Données manquantes. Le fichier de configuration ne permet pas de générer des données.\")\n",
" ALL_SEMESTERS[semester] = datetime.strptime(ALL_SEMESTERS[semester], '%d/%m/%Y') \n",
" \n",
"\n",
......@@ -139,8 +139,9 @@
" self.nb_uvs_with_com = len(self.uvs_with_com)\n",
" self.taux_seen = 100 * self.nb_uvs_with_evals / self.nb_uvs\n",
" self.taux_comment = 100 * self.nb_uvs_with_com / self.nb_uvs\n",
" \n",
"# import and basic cleaning of data\n",
" \n",
" \n",
"# import\n",
"EVALS = {}\n",
"\n",
"for semester in ALL_SEMESTERS.keys():\n",
......@@ -192,7 +193,7 @@
"metadata": {},
"outputs": [],
"source": [
"str_tmp = \"Les données pour chaque semestre ont été extraites aux dates : \\n\\n \"\n",
"str_tmp = \"Les données pour chaque semestre ont été extraites aux dates suivantes : \\n\\n \"\n",
"t = [[\"Semestre\", \"Date d'extraction\"]]\n",
"for sem in EVALS.keys():\n",
" t.append([sem, EVALS[sem].extraction_date.strftime('%d/%m/%Y')]) \n",
......@@ -207,6 +208,7 @@
"\n",
"Pour chaque semestre, nous avons les informations des évaluations telles que visibles par les étudiants sur l'ENT aux dates d'extraction précisées ci-dessus.\n",
"\n",
"<br>\n",
"Nous connaissons pour sûr :\n",
"- Le code de l'UV ;\n",
"- L'intitulé de l'UV ;\n",
......@@ -241,7 +243,7 @@
"source": [
"### Remarque\n",
"\n",
"Lorsque les statistiques des évaluations d'UVs (le nombre de `++`, de `+`, etc.) seront analysées de manière quantitative la table de conversion _symétrique_ suivante sera employée :"
"Lorsque les statistiques des évaluations d'UVs (le nombre de `++`, de `+`, etc.) seront analysées de manière quantitative la table de conversion _symétrique_ suivante est employée :"
]
},
{
......@@ -265,6 +267,8 @@
"metadata": {},
"outputs": [],
"source": [
"# some functions and constants\n",
"\n",
"def get_nb_evals(stats):\n",
" return sum([stats['1'][s] for s in POSSIBLE_ANSWERS])\n",
"\n",
......@@ -298,7 +302,9 @@
"source": [
"## Informations générales\n",
"\n",
"Lorsque'une analyse comparative est réalisée, elle est faite par rapport aux données des précédents semestres.\n",
"_NB : Lorsque'une analyse comparative est réalisée, elle est faite par rapport aux données des précédents semestres._\n",
"\n",
"<br>\n",
"\n",
"### Taux de réponse"
]
......@@ -313,9 +319,9 @@
"source": [
"t = [[\"Semestre\",\n",
" \"Nombre d'UVs\", \n",
" \"Taux de réponse moyen des étudiants\" , \n",
" \"Nombre d'UV qui ont été vu\", \n",
" \"avec un commentaire\"]]\n",
" \"Participation moyenne des étudiants\" , \n",
" \"UVs où le ou la responsable a indiqué avoir visualisé les évaluations\", \n",
" \"UVs où le ou la responsable a saisi un rapport\"]]\n",
"\n",
"for sem in ALL_SEMESTERS_SORTED:\n",
" d = EVALS[sem]\n",
......@@ -338,9 +344,9 @@
"for sem in ALL_SEMESTERS_SORTED:\n",
" d = EVALS[sem]\n",
" traces += [go.Bar(\n",
" x=[\"Taux de réponse moyen des étudiants\", \n",
" \"Taux d'UVs où les resps. ont 'vu' les éval.\", \n",
" \"Taux d'UVs où le resp. a laissé un commentaire\"\n",
" x=[\"Participation moyenne des étudiants\", \n",
" \"UVs où le/la resps a <i>vu</i> les éval.\", \n",
" \"UVs où le/la resp. a posté un commentaire\"\n",
" ],\n",
" y=[\n",
" d.taux_eval,\n",
......@@ -352,10 +358,10 @@
"\n",
"layout = go.Layout(\n",
" barmode='group',\n",
" title = \"Taux de réponses aux évaluations\",\n",
" title = \"Analyse temporelle de l'engagment dans les évaluations d'UVs\",\n",
" yaxis=dict(\n",
" range=SCALE_PERCENTAGE,\n",
" title='Pourcentage',\n",
" title='Taux',\n",
" ),\n",
")\n",
"\n",
......@@ -381,10 +387,10 @@
" )]\n",
"\n",
"layout = go.Layout(\n",
" title = \"Taux de réponse moyen des étudiants aux évaluations\",\n",
" title = \"Participation moyenne des étudiants au cours des semestres\",\n",
" yaxis=dict(\n",
" range=SCALE_PERCENTAGE,\n",
" title='Taux de réponse',\n",
" title='Taux',\n",
" ),\n",
")\n",
"\n",
......@@ -406,17 +412,18 @@
"metadata": {},
"outputs": [],
"source": [
"uvs_with_evals = EVALS_MAIN_SEM.uvs_with_evals\n",
"X = EVALS_MAIN_SEM.uvs_with_evals['date_review_teacher'].sort_values()\n",
"Y = [round(100*float(i+1)/EVALS_MAIN_SEM.nb_uvs,2) for i in range(len(X.index))]\n",
"graph_data = [\n",
" go.Scatter(\n",
" x=uvs_with_evals['date_review_teacher'].sort_values(),\n",
" y=[round(100*float(i+1)/EVALS_MAIN_SEM.nb_uvs,2) for i,e in enumerate(uvs_with_evals.index)],\n",
" text=uvs_with_evals.sort_values(by=['date_review_teacher']).index,\n",
" x=X,\n",
" y=Y,\n",
" text=X.index,\n",
" marker=dict(color=ORANGE)\n",
" )\n",
"]\n",
"layout = go.Layout(\n",
" title = \"Délai de réponse des responsables d'UVs lors du semestre \"+MAIN_SEMESTER,\n",
" title = \"Délai de <i>réponse</i> des responsables d'UVs lors du semestre \"+MAIN_SEMESTER,\n",
" yaxis=dict(\n",
" range=SCALE_PERCENTAGE,\n",
" title='Taux de réponse',\n",
......@@ -460,11 +467,12 @@
"for sem in ALL_SEMESTERS_SORTED:\n",
" sem_end_date = ALL_SEMESTERS[sem].toordinal()\n",
" d = EVALS[sem]\n",
" \n",
" X = d.uvs_with_evals['date_review_teacher'].sort_values().apply(datetime.toordinal)\n",
" Y = [round(100*float(i+1)/d.nb_uvs,2) for i in range(len(X.index))]\n",
" traces.append(\n",
" go.Scatter(\n",
" x=d.uvs_with_evals['date_review_teacher'].sort_values().apply(datetime.toordinal)-sem_end_date ,\n",
" y=[round(100*float(i+1)/d.nb_uvs,2) for i,e in enumerate(d.uvs_with_evals.index)],\n",
" x=X-sem_end_date ,\n",
" y=Y,\n",
" text=d.uvs_with_evals.sort_values(by=['date_review_teacher']).index,\n",
" name=sem\n",
" ) \n",
......@@ -472,13 +480,13 @@
" \n",
"\n",
"layout = go.Layout(\n",
" title = \"Délai de réponse\",\n",
" title = \"Délai de <i>réponse</i> des responsables d'UVs\",\n",
" yaxis=dict(\n",
" range=SCALE_PERCENTAGE,\n",
" title=\"Taux des resps. d'UVs qui ont 'vu' les évaluations\",\n",
" title=\"Taux des UVs qui dont les évals. ont été <i>vues</i> par les resp\",\n",
" ),\n",
" xaxis=dict(\n",
" title=\"Nombre de jours après la fin des finaux.\"\n",
" title=\"Nombre de jours après la fin des finaux\"\n",
" )\n",
")\n",
"\n",
......@@ -495,7 +503,7 @@
"\n",
"1. Clarté des objectifs et du programme de l'UV\n",
"2. Y a-t-il adéquation entre le programme annoncé et le programme réalisé ?\n",
"3. Ma maîtrise des antécédents et pré-requis nécessaires\n",
"3. Maîtrise des antécédents et pré-requis nécessaires\n",
"4. Qualité pédagogique de l'équipe enseignante\n",
"5. Articulation et cohérence des activités\n",
"6. Qualité des supports pédagogiques\n",
......@@ -538,7 +546,7 @@
" title=\"Pourcentage moyen de chaque type d'avis pour chaque question en \"+MAIN_SEMESTER,\n",
" yaxis=dict(\n",
" range=SCALE_PERCENTAGE,\n",
" title=\"Pourcentage (cumulé)\",\n",
" title=\"Pourcentage\",\n",
" ),\n",
")\n",
"\n",
......@@ -611,7 +619,8 @@
"<div class=\"alert alert-success\">\n",
" <strong>\n",
" Pour les graphiques ci-dessous,\n",
" en cliquant sur les points, la visualisation en détail d'une UV ce mettra automatiquement à jour\n",
" en cliquant sur les points, la visualisation en détail d'une UV \n",
" (disponible en bas de page) se mettra automatiquement à jour\n",
" avec les données correspondantes.\n",
" </strong>\n",
"</div>\n",
......@@ -657,14 +666,15 @@
")\n",
"\n",
"layout = go.Layout(\n",
" title = \"Visualisation du pourcentage d'avis négatifs <b>--</b> et (<b>-</b> ou <b>--</b>) pour la question 10\",\n",
" title = \"\"\"Visualisation du pourcentage d'avis négatifs\n",
"<b>--</b> et (<b>-</b> ou <b>--</b>) <br> \n",
"concernant l'appréciation globale de l'UV en {}\"\"\".format(MAIN_SEMESTER),\n",
" yaxis=dict(\n",
" range=SCALE_PERCENTAGE,\n",
" title=\"Pourcentage\",\n",
" ),\n",
" xaxis=dict(\n",
" title=\"UVs triées selon le pourcentage d'avis <b>--</b> à la question 10\",\n",
" )\n",
" title=\"UVs triées selon le pourcentage d'avis <b>--</b> à la question 10\"),\n",
")\n",
"\n",
"iplot(go.Figure(data=traces, layout=layout), show_link=False)\n",
......@@ -689,6 +699,16 @@
"HTML(link_graph('graph-mm'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sur le graphique ci-dessous, les croix :\n",
"- `rouges` indiquent que le ou la responsable de l'UV ne semble pas avoir pris connaissance des évaluations ;\n",
"- `orange` indiquent que le ou la responsable de l'UV _a pris connaissance_ des évaluations sans saisir de rapport ;\n",
"- `vertes` indiquent que le ou la responsable de l'UV _a pris connaissance_ des évaluations et a saisi de rapport."
]
},
{
"cell_type": "code",
"execution_count": null,
......@@ -712,11 +732,13 @@
"]\n",
"\n",
"layout = go.Layout(\n",
" title=\"Visualisation de l'appréciation globale de chaque UV (question 10) sous forme de note moyenne\",\n",
" title = \"\"\"Visualisation de l'appréciation globale de chaque UV<br>\n",
"sous forme de note moyenne lors du semestre {}\"\"\".format(MAIN_SEMESTER),\n",
" yaxis=dict(\n",
" range=SCALE_MARK,\n",
" title=\"Pourcentage\",\n",
" ),\n",
" xaxis=dict(title=\"UVs triées selon la note moyenne à la question 10.\"),\n",
")\n",
"\n",
"iplot(go.Figure(data=graph_data, layout=layout), show_link=False)\n",
......@@ -769,11 +791,13 @@
")\n",
" \n",
"layout = go.Layout(\n",
" title=\"Visualisation de l'appréciation globale de chaque UV (question 10) sous forme de note moyenne\",\n",
" title=\"\"\"Visualisation de l'appréciation globale de chaque UV<br>\n",
"sous forme de note moyenne et au cours des différents semestres\"\"\",\n",
" yaxis=dict(\n",
" range=SCALE_MARK,\n",
" title=\"Pourcentage\",\n",
" ),\n",
" xaxis=dict(title=\"UVs triées selon la note moyenne à la question 10 en {}\".format(MAIN_SEMESTER)),\n",
")\n",
"\n",
"iplot(go.Figure(data=traces, layout=layout), show_link=False)\n",
......
......@@ -44,7 +44,6 @@
border: 1px;
border-radius: 0;
height: 34px;
-webkit-appearance: none;
}
</style>
......@@ -103,13 +102,11 @@
<div class="styled-select">
<form action="">
Choix de l'UV :
<select id='UV-select' onchange="update_display(this.value);">
</select>
<input id="UV-input-text" type="text">
<input id="UV-input-btn" type="button" disabled value="Visualiser" onclick="update_select($('#UV-input-text').val())">
</form>
Choix de l'UV :
<select id='UV-select' onchange="update_display(this.value);">
</select>
<input id="UV-input-text" type="text">
<input id="UV-input-btn" type="button" class="btn" disabled value="Visualiser" onclick="update_select($('#UV-input-text').val())">
</div>
<br>
......@@ -312,8 +309,19 @@
}, 200);
// js for handling input uv name
var update_select = function (uv){
$("#UV-select").val(uv).change();
var is_uv = function(uv){
for (ind in all_uvs) {
if (all_uvs[ind] == uv) {
return true;
}
}
return false;
}
var update_select = function (uv) {
if (is_uv(uv)){
$("#UV-select").val(uv).change();
}
}
$('#UV-input-text').keyup(function (event) {
......@@ -322,7 +330,7 @@
event.preventDefault();
update_select(val);
} else {
var check_input = function(value) {
var check_input = function (value) {
var valid = false;
for (ind in all_uvs) {
var uv = all_uvs[ind];
......@@ -333,16 +341,10 @@
}
return false;
}
while(!check_input(val)) {
while (!check_input(val)) {
val = val.substring(0, val.length - 1);
}
var state = true;
for (ind in all_uvs){
if (all_uvs[ind] == val){
state = false;
}
}
$('#UV-input-btn').prop('disabled', state);
$('#UV-input-btn').prop('disabled', !is_uv(val));
}
$('#UV-input-text').val(val);
});
......
......@@ -39,6 +39,9 @@ def generate_data_file(semester):
random_day = date.fromordinal(random.randint(start_date, end_date))
return random_day.strftime('%d/%m/%Y')
def random_string(l=40):
return ''.join(random.choices(string.ascii_uppercase, k=l))
NB_UVS = 200
for uv in range(1, NB_UVS):
uv_code = 'UV' + str(uv)
......@@ -46,20 +49,27 @@ def generate_data_file(semester):
nb_etu_abs = random.randint(1, 9)
nb_etu_passed = random.randint(1, nb_etu_registered - nb_etu_abs)
nb_evals = random.randint(1, nb_etu_registered - nb_etu_abs)
date_review = random.choice([None, random_date()])
comment = None
if date_review:
comment = random.randint(0, 500)
date_review_teacher = random.choice([None, random_date()])
date_review_conseil = random.choice([None, random_date()])
teacher_comment = None
conseil_comment = None
if date_review_teacher:
teacher_comment = random_string(random.randint(0, 500))
if date_review_conseil:
conseil_comment = random_string(random.randint(0, 500))
output['data'][uv_code] = {
'name': ''.join(random.choices(string.ascii_uppercase, k=40)),
'name': random_string(),
'nb_etu_registered': nb_etu_registered,
'nb_etu_abs': nb_etu_abs,
'nb_etu_passed': nb_etu_passed,
'nb_evals': nb_evals,
'teacher_name': random_string(10),
'stats': random_eval(nb_evals),
'date_review': date_review,
'comment': comment
'date_review_teacher': date_review_teacher,
'teacher_comment': teacher_comment,
'date_review_conseil': date_review_conseil,
'conseil_comment': conseil_comment
}
fp = os.path.realpath(__file__) + '/../../data/' + semester + '.json'
......
......@@ -20,11 +20,13 @@
<script>
// Button to go to the uv detail section
if (document.getElementById('uv-details-name') === null) {
$('body').prepend("<a href='#'' class='got-to-uv'><center>Voir en détail l'UV<br><span id='uv-details-name' style='font-weight:bold;'></span></center></a>");
}
$('a.got-to-uv').fadeIn('slow');
$('a.got-to-uv').click(function () {
document.getElementById('UV-select').scrollIntoView();
$(document).ready(function () {
if (document.getElementById('uv-details-name') === null) {
$('body').prepend("<a class='got-to-uv'><center>Voir en détail l'UV<br><span id='uv-details-name' style='font-weight:bold;'></span></center></a>");
}
$('a.got-to-uv').fadeIn('slow');
$('a.got-to-uv').click(function () {
document.getElementById('UV-select').scrollIntoView();
});
});
</script>
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment