forked from ScoDoc/ScoDoc
Update opolka/ScoDoc from ScoDoc/ScoDoc #2
@ -249,9 +249,10 @@ class ScolarNews(db.Model):
|
||||
news_list = cls.last_news(n=n)
|
||||
if not news_list:
|
||||
return ""
|
||||
dept_news_url = url_for("scolar.dept_news", scodoc_dept=g.scodoc_dept)
|
||||
H = [
|
||||
f"""<div class="scobox news"><div class="scobox-title"><a href="{
|
||||
url_for("scolar.dept_news", scodoc_dept=g.scodoc_dept)
|
||||
dept_news_url
|
||||
}">Dernières opérations</a>
|
||||
</div><ul class="newslist">"""
|
||||
]
|
||||
@ -261,17 +262,22 @@ class ScolarNews(db.Model):
|
||||
f"""<li class="newslist"><span class="newsdate">{news.formatted_date()}</span><span
|
||||
class="newstext">{news}</span></li>"""
|
||||
)
|
||||
H.append(
|
||||
f"""<li class="newslist">
|
||||
<span class="newstext"><a href="{dept_news_url}" class="stdlink">...</a>
|
||||
</span>
|
||||
</li>"""
|
||||
)
|
||||
|
||||
H.append("</ul>")
|
||||
H.append("</ul></div>")
|
||||
|
||||
# Informations générales
|
||||
H.append(
|
||||
f"""<div>
|
||||
Pour en savoir plus sur ScoDoc voir le site
|
||||
<a class="stdlink" href="{scu.SCO_ANNONCES_WEBSITE}">scodoc.org</a>.
|
||||
Pour en savoir plus sur ScoDoc voir
|
||||
<a class="stdlink" href="{scu.SCO_ANNONCES_WEBSITE}">scodoc.org</a>
|
||||
</div>
|
||||
"""
|
||||
)
|
||||
|
||||
H.append("</div>")
|
||||
return "\n".join(H)
|
||||
|
@ -247,7 +247,7 @@ class FormSemestre(models.ScoDocModel):
|
||||
|
||||
def to_dict_api(self):
|
||||
"""
|
||||
Un dict avec les informations sur le semestre destiné à l'api
|
||||
Un dict avec les informations sur le semestre destinées à l'api
|
||||
"""
|
||||
d = dict(self.__dict__)
|
||||
d.pop("_sa_instance_state", None)
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Gestion scolarite IUT
|
||||
# ScoDoc
|
||||
#
|
||||
# Copyright (c) 1999 - 2024 Emmanuel Viennet. All rights reserved.
|
||||
#
|
||||
@ -28,93 +28,119 @@
|
||||
"""Page accueil département (liste des semestres, etc)
|
||||
"""
|
||||
|
||||
from flask import g
|
||||
from flask import url_for
|
||||
from sqlalchemy import desc
|
||||
from flask import g, url_for, render_template
|
||||
from flask_login import current_user
|
||||
from flask_sqlalchemy.query import Query
|
||||
|
||||
import app
|
||||
from app import log
|
||||
from app.models import ScolarNews
|
||||
from app.models import FormSemestre, ScolarNews
|
||||
import app.scodoc.sco_utils as scu
|
||||
from app.scodoc.gen_tables import GenTable
|
||||
from app.scodoc.sco_permissions import Permission
|
||||
from app.scodoc import html_sco_header
|
||||
import app.scodoc.notesdb as ndb
|
||||
from app.scodoc import sco_formsemestre
|
||||
from app.scodoc import sco_formsemestre_inscriptions
|
||||
from app.scodoc import sco_modalites
|
||||
from app.scodoc import sco_preferences
|
||||
from app.scodoc import sco_users
|
||||
from app.views import ScoData
|
||||
|
||||
|
||||
def index_html(showcodes=0, showsemtable=0):
|
||||
"Page accueil département (liste des semestres)"
|
||||
showcodes = int(showcodes)
|
||||
showsemtable = int(showsemtable)
|
||||
H = []
|
||||
|
||||
# News:
|
||||
H.append(ScolarNews.scolar_news_summary_html())
|
||||
# Liste tous les formsemestres du dept, le plus récent d'abord
|
||||
current_formsemestres = (
|
||||
FormSemestre.query.filter_by(dept_id=g.scodoc_dept_id, etat=True)
|
||||
.filter(FormSemestre.modalite != "EXT")
|
||||
.order_by(desc(FormSemestre.date_debut))
|
||||
)
|
||||
locked_formsemestres = (
|
||||
FormSemestre.query.filter_by(dept_id=g.scodoc_dept_id, etat=False)
|
||||
.filter(FormSemestre.modalite != "EXT")
|
||||
.order_by(desc(FormSemestre.date_debut))
|
||||
)
|
||||
formsemestres = (
|
||||
FormSemestre.query.filter_by(dept_id=g.scodoc_dept_id)
|
||||
.filter(FormSemestre.modalite != "EXT")
|
||||
.order_by(desc(FormSemestre.date_debut))
|
||||
)
|
||||
if showsemtable: # table de tous les formsemestres
|
||||
html_table_formsemestres = _sem_table_gt(
|
||||
formsemestres, showcodes=showcodes
|
||||
).html()
|
||||
else:
|
||||
html_table_formsemestres = None
|
||||
|
||||
# Avertissement de mise à jour:
|
||||
H.append("""<div id="update_warning" class="scobox update_warning"></div>""")
|
||||
return render_template(
|
||||
"scolar/index.j2",
|
||||
current_user=current_user,
|
||||
dept_name=sco_preferences.get_preference("DeptName"),
|
||||
formsemestres=formsemestres,
|
||||
html_current_formsemestres=_show_current_formsemestres(
|
||||
current_formsemestres, showcodes
|
||||
),
|
||||
html_table_formsemestres=html_table_formsemestres,
|
||||
locked_formsemestres=locked_formsemestres,
|
||||
nb_locked=locked_formsemestres.count(),
|
||||
nb_user_accounts=sco_users.get_users_count(dept=g.scodoc_dept),
|
||||
page_title=f"ScoDoc {g.scodoc_dept}",
|
||||
Permission=Permission,
|
||||
scolar_news_summary=ScolarNews.scolar_news_summary_html(),
|
||||
showsemtable=showsemtable,
|
||||
sco=ScoData(),
|
||||
)
|
||||
|
||||
# Liste de toutes les sessions:
|
||||
sems = sco_formsemestre.do_formsemestre_list()
|
||||
cursems = [] # semestres "courants"
|
||||
othersems = [] # autres (verrouillés)
|
||||
|
||||
def _convert_formsemestres_to_dicts(
|
||||
formsemestres: Query, showcodes: bool
|
||||
) -> list[dict]:
|
||||
""" """
|
||||
# icon image:
|
||||
groupicon = scu.icontag("groupicon_img", title="Inscrits", border="0")
|
||||
emptygroupicon = scu.icontag(
|
||||
"emptygroupicon_img", title="Pas d'inscrits", border="0"
|
||||
)
|
||||
lockicon = scu.icontag("lock32_img", title="verrouillé", border="0")
|
||||
# Sélection sur l'etat du semestre
|
||||
for sem in sems:
|
||||
if sem["etat"] and sem["modalite"] != "EXT":
|
||||
sem["lockimg"] = ""
|
||||
cursems.append(sem)
|
||||
else:
|
||||
sem["lockimg"] = lockicon
|
||||
othersems.append(sem)
|
||||
# Responsable de formation:
|
||||
sco_formsemestre.sem_set_responsable_name(sem)
|
||||
# génère liste de dict
|
||||
sems = []
|
||||
for formsemestre in formsemestres:
|
||||
nb_inscrits = len(formsemestre.inscriptions)
|
||||
sem = {
|
||||
"anneescolaire": formsemestre.annee_scolaire(),
|
||||
"bul_hide_xml": formsemestre.bul_hide_xml,
|
||||
"dateord": formsemestre.date_debut,
|
||||
"elt_annee_apo": formsemestre.elt_annee_apo,
|
||||
"elt_sem_apo": formsemestre.elt_sem_apo,
|
||||
"etapes_apo_str": formsemestre.etapes_apo_str(),
|
||||
"formsemestre_id": formsemestre.id,
|
||||
"groupicon": groupicon if nb_inscrits > 0 else emptygroupicon,
|
||||
"lockimg": lockicon,
|
||||
"modalite": formsemestre.modalite,
|
||||
"mois_debut": formsemestre.mois_debut(),
|
||||
"mois_fin": formsemestre.mois_fin(),
|
||||
"nb_inscrits": nb_inscrits,
|
||||
"responsable_name": formsemestre.responsables_str(),
|
||||
"semestre_id": formsemestre.semestre_id,
|
||||
"session_id": formsemestre.session_id(),
|
||||
"titre_num": formsemestre.titre_num(),
|
||||
"tmpcode": (
|
||||
f"<td><tt>{sem['formsemestre_id']}</tt></td>" if showcodes else ""
|
||||
),
|
||||
}
|
||||
sems.append(sem)
|
||||
return sems
|
||||
|
||||
if showcodes:
|
||||
sem["tmpcode"] = f"<td><tt>{sem['formsemestre_id']}</tt></td>"
|
||||
else:
|
||||
sem["tmpcode"] = ""
|
||||
# Nombre d'inscrits:
|
||||
args = {"formsemestre_id": sem["formsemestre_id"]}
|
||||
ins = sco_formsemestre_inscriptions.do_formsemestre_inscription_list(args=args)
|
||||
nb = len(ins) # nb etudiants
|
||||
sem["nb_inscrits"] = nb
|
||||
if nb > 0:
|
||||
sem["groupicon"] = groupicon
|
||||
else:
|
||||
sem["groupicon"] = emptygroupicon
|
||||
|
||||
# S'il n'y a pas d'utilisateurs dans la base, affiche message
|
||||
if not sco_users.get_users_count(dept=g.scodoc_dept):
|
||||
H.append(
|
||||
"""<h2>Aucun utilisateur défini !</h2><p>Pour définir des utilisateurs
|
||||
<a href="Users">passez par la page Utilisateurs</a>.
|
||||
<br>
|
||||
Définissez au moins un utilisateur avec le rôle AdminXXX
|
||||
(le responsable du département XXX).
|
||||
</p>
|
||||
"""
|
||||
)
|
||||
def _show_current_formsemestres(formsemestres: Query, showcodes: bool) -> str:
|
||||
"""html div avec les formsemestres courants de la page d'accueil"""
|
||||
|
||||
H.append("""<div class="scobox">""")
|
||||
# Liste des formsemestres "courants"
|
||||
if cursems:
|
||||
H.append(
|
||||
f"""
|
||||
<div class="scobox-title">Sessions en cours</div>
|
||||
{ _sem_table(cursems) }
|
||||
"""
|
||||
)
|
||||
H = []
|
||||
if formsemestres.count():
|
||||
H.append("""<div class="scobox-title">Sessions en cours</div>""")
|
||||
H.append(_sem_table(_convert_formsemestres_to_dicts(formsemestres, showcodes)))
|
||||
else:
|
||||
# aucun semestre courant: affiche aide
|
||||
H.append(
|
||||
@ -127,125 +153,16 @@ def index_html(showcodes=0, showsemtable=0):
|
||||
"<em>Mettre en place un nouveau semestre de formation...</em>"
|
||||
</p>"""
|
||||
)
|
||||
|
||||
if showsemtable:
|
||||
H.append(
|
||||
f"""
|
||||
<div class="scobox-title">Semestres de {sco_preferences.get_preference("DeptName")}</div>
|
||||
"""
|
||||
)
|
||||
H.append(_sem_table_gt(sems, showcodes=showcodes).html())
|
||||
H.append("</table>")
|
||||
else:
|
||||
H.append(
|
||||
f"""
|
||||
<p><a class="stdlink" href="{url_for('scolar.index_html',
|
||||
scodoc_dept=g.scodoc_dept, showsemtable=1)
|
||||
}">Voir table des semestres (dont {len(othersems)}
|
||||
verrouillé{'s' if len(othersems) else ''})</a>
|
||||
</p>"""
|
||||
)
|
||||
|
||||
H.append(
|
||||
f"""
|
||||
<form action="{url_for('notes.view_formsemestre_by_etape', scodoc_dept=g.scodoc_dept)}">
|
||||
Chercher étape courante:
|
||||
<input name="etape_apo" type="text" size="8" spellcheck="false"></input>
|
||||
</form>
|
||||
</div>
|
||||
"""
|
||||
)
|
||||
#
|
||||
H.append(
|
||||
"""
|
||||
<div class="scobox">
|
||||
<div class="scobox-title">Gestion des étudiants</div>
|
||||
<ul>
|
||||
"""
|
||||
)
|
||||
if current_user.has_permission(Permission.EtudInscrit):
|
||||
H.append(
|
||||
f"""
|
||||
<li><a class="stdlink" href="{
|
||||
url_for("scolar.etudident_create_form", scodoc_dept=g.scodoc_dept)
|
||||
}">créer <em>un</em> nouvel étudiant</a>
|
||||
</li>
|
||||
<li><a class="stdlink" href="{
|
||||
url_for("scolar.form_students_import_excel", scodoc_dept=g.scodoc_dept)
|
||||
}">importer de nouveaux étudiants</a>
|
||||
(<em>ne pas utiliser</em> sauf cas particulier : utilisez plutôt le lien dans
|
||||
le tableau de bord semestre si vous souhaitez inscrire les
|
||||
étudiants importés à un semestre)
|
||||
</li>
|
||||
"""
|
||||
)
|
||||
H.append(
|
||||
f"""
|
||||
<li><a class="stdlink" href="{
|
||||
url_for("scolar.export_etudiants_courants", scodoc_dept=g.scodoc_dept)
|
||||
}">exporter tableau des étudiants des semestres en cours</a>
|
||||
</li>
|
||||
"""
|
||||
)
|
||||
if current_user.has_permission(
|
||||
Permission.EtudInscrit
|
||||
) and sco_preferences.get_preference("portal_url"):
|
||||
H.append(
|
||||
f"""
|
||||
<li><a class="stdlink" href="{
|
||||
url_for("scolar.formsemestre_import_etud_admission",
|
||||
scodoc_dept=g.scodoc_dept, tous_courants=1)
|
||||
}">resynchroniser les données étudiants des semestres en cours depuis le portail</a>
|
||||
</li>
|
||||
"""
|
||||
)
|
||||
H.append("</ul></div>")
|
||||
#
|
||||
if current_user.has_permission(Permission.EditApogee):
|
||||
H.append(
|
||||
f"""
|
||||
<div class="scobox">
|
||||
<div class="scobox-title">Exports Apogée</div>
|
||||
<ul>
|
||||
<li><a class="stdlink" href="{
|
||||
url_for('notes.semset_page', scodoc_dept=g.scodoc_dept)
|
||||
}">Années scolaires / exports Apogée</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
"""
|
||||
)
|
||||
#
|
||||
H.append(
|
||||
"""
|
||||
<div class="scobox">
|
||||
<div class="scobox-title">Assistance</div>
|
||||
<ul>
|
||||
<li><a class="stdlink" href="https://scodoc.org/Contact" target="_blank"
|
||||
rel="noopener noreferrer">Contact (Discord)</a>
|
||||
</li>
|
||||
<li><a class="stdlink" href="sco_dump_and_send_db">Envoyer données</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
"""
|
||||
)
|
||||
#
|
||||
return (
|
||||
html_sco_header.sco_header(
|
||||
page_title=f"ScoDoc {g.scodoc_dept}", javascripts=["js/scolar_index.js"]
|
||||
)
|
||||
+ "\n".join(H)
|
||||
+ html_sco_header.sco_footer()
|
||||
)
|
||||
return "\n".join(H)
|
||||
|
||||
|
||||
def _sem_table(sems):
|
||||
def _sem_table(sems: list[dict]) -> str:
|
||||
"""Affiche liste des semestres, utilisée pour semestres en cours"""
|
||||
tmpl = """<tr class="%(trclass)s">%(tmpcode)s
|
||||
<td class="semicon">%(lockimg)s <a href="%(notes_url)s/formsemestre_status?formsemestre_id=%(formsemestre_id)s#groupes">%(groupicon)s</a></td>
|
||||
tmpl = f"""<tr class="%(trclass)s">%(tmpcode)s
|
||||
<td class="semicon">%(lockimg)s <a href="{
|
||||
url_for("notes.formsemestre_status", scodoc_dept=g.scodoc_dept)}?formsemestre_id=%(formsemestre_id)s#groupes">%(groupicon)s</a></td>
|
||||
<td class="datesem">%(mois_debut)s <a title="%(session_id)s">-</a> %(mois_fin)s</td>
|
||||
<td><a class="stdlink" href="%(notes_url)s/formsemestre_status?formsemestre_id=%(formsemestre_id)s">%(titre_num)s</a>
|
||||
<td class="titresem"><a class="stdlink" href="{url_for("notes.formsemestre_status", scodoc_dept=g.scodoc_dept)}?formsemestre_id=%(formsemestre_id)s">%(titre_num)s</a>
|
||||
<span class="respsem">(%(responsable_name)s)</span>
|
||||
</td>
|
||||
</tr>
|
||||
@ -267,19 +184,26 @@ def _sem_table(sems):
|
||||
cur_idx = sem["semestre_id"]
|
||||
else:
|
||||
sem["trclass"] = ""
|
||||
sem["notes_url"] = scu.NotesURL()
|
||||
H.append(tmpl % sem)
|
||||
H.append("</table>")
|
||||
return "\n".join(H)
|
||||
|
||||
|
||||
def _sem_table_gt(sems, showcodes=False):
|
||||
"""Nouvelle version de la table des semestres
|
||||
def _sem_table_gt(formsemestres: Query, showcodes=False) -> GenTable:
|
||||
"""Table des semestres
|
||||
Utilise une datatables.
|
||||
"""
|
||||
_style_sems(sems)
|
||||
sems = _style_sems(_convert_formsemestres_to_dicts(formsemestres, showcodes))
|
||||
sems.sort(
|
||||
key=lambda s: (
|
||||
-s["anneescolaire"],
|
||||
s["semestre_id"] if s["semestre_id"] > 0 else -s["semestre_id"] * 1000,
|
||||
s["modalite"],
|
||||
)
|
||||
)
|
||||
columns_ids = (
|
||||
"lockimg",
|
||||
"published",
|
||||
"semestre_id_n",
|
||||
"modalite",
|
||||
#'mois_debut',
|
||||
@ -327,22 +251,35 @@ def _sem_table_gt(sems, showcodes=False):
|
||||
return tab
|
||||
|
||||
|
||||
def _style_sems(sems):
|
||||
def _style_sems(sems: list[dict]) -> list[dict]:
|
||||
"""ajoute quelques attributs de présentation pour la table"""
|
||||
for sem in sems:
|
||||
sem["notes_url"] = scu.NotesURL()
|
||||
sem["_groupicon_target"] = (
|
||||
"%(notes_url)s/formsemestre_status?formsemestre_id=%(formsemestre_id)s"
|
||||
% sem
|
||||
status_url = url_for(
|
||||
"notes.formsemestre_status",
|
||||
scodoc_dept=g.scodoc_dept,
|
||||
formsemestre_id=sem["formsemestre_id"],
|
||||
)
|
||||
sem["_groupicon_target"] = status_url
|
||||
sem["_formsemestre_id_class"] = "blacktt"
|
||||
sem["dash_mois_fin"] = '<a title="%(session_id)s"></a> %(anneescolaire)s' % sem
|
||||
sem["_dash_mois_fin_class"] = "datesem"
|
||||
sem["titre_resp"] = (
|
||||
"""<a class="stdlink" href="%(notes_url)s/formsemestre_status?formsemestre_id=%(formsemestre_id)s">%(titre_num)s</a>
|
||||
<span class="respsem">(%(responsable_name)s)</span>"""
|
||||
% sem
|
||||
f"""<a class="stdlink" href="{status_url}">{sem['titre_num']}</a> <span class="respsem">({sem['responsable_name']})</span>"""
|
||||
)
|
||||
sem["published"] = (
|
||||
scu.icontag(
|
||||
"hide_img",
|
||||
border="0",
|
||||
title="Bulletins NON publiés sur la passerelle étudiants",
|
||||
)
|
||||
if sem["bul_hide_xml"]
|
||||
else scu.icontag(
|
||||
"eye_img",
|
||||
border="0",
|
||||
title="Bulletins publiés sur la passerelle étudiants",
|
||||
)
|
||||
)
|
||||
|
||||
sem["_css_row_class"] = "css_S%d css_M%s" % (
|
||||
sem["semestre_id"],
|
||||
sem["modalite"],
|
||||
@ -363,6 +300,7 @@ def _style_sems(sems):
|
||||
sem["_elt_sem_apo_td_attrs"] = (
|
||||
f""" data-oid="{sem['formsemestre_id']}" data-value="{sem['elt_sem_apo']}" """
|
||||
)
|
||||
return sems
|
||||
|
||||
|
||||
def delete_dept(dept_id: int) -> str:
|
||||
|
@ -494,7 +494,7 @@ def table_formsemestres(
|
||||
):
|
||||
"""Une table presentant des semestres"""
|
||||
for sem in sems:
|
||||
sem_set_responsable_name(sem)
|
||||
sem_set_responsable_name(sem) # TODO utiliser formsemestre.responsables_str()
|
||||
sem["_titre_num_target"] = url_for(
|
||||
"notes.formsemestre_status",
|
||||
scodoc_dept=g.scodoc_dept,
|
||||
|
@ -50,8 +50,8 @@ def list_formsemestres_modalites(sems):
|
||||
return modalites
|
||||
|
||||
|
||||
def group_sems_by_modalite(sems):
|
||||
"""Given the list of fromsemestre, group them by modalite,
|
||||
def group_sems_by_modalite(sems: list[dict]):
|
||||
"""Given the list of formsemestre, group them by modalite,
|
||||
sorted in each one by semestre id and date
|
||||
"""
|
||||
sems_by_mod = collections.defaultdict(list)
|
||||
|
@ -40,6 +40,10 @@ h3 {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
details > summary:first-of-type {
|
||||
display: list-item!important;
|
||||
}
|
||||
|
||||
div.container {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
@ -592,10 +596,6 @@ table.listesems tr.firstsem td {
|
||||
padding-top: 0.8em;
|
||||
}
|
||||
|
||||
td.datesem {
|
||||
font-size: 80%;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
h2.listesems {
|
||||
padding-top: 10px;
|
||||
@ -683,27 +683,33 @@ table.semlist tbody tr td.modalite {
|
||||
}
|
||||
|
||||
div#gtrcontent table.semlist tbody tr.css_S-1 td {
|
||||
background-color: rgb(251, 250, 216);
|
||||
background-color: rgb(211, 213, 255);
|
||||
}
|
||||
|
||||
div#gtrcontent table.semlist tbody tr.css_S1 td {
|
||||
background-color: rgb(92%, 95%, 94%);
|
||||
background-color:#e9efef;
|
||||
}
|
||||
|
||||
div#gtrcontent table.semlist tbody tr.css_S2 td {
|
||||
background-color: rgb(214, 223, 236);
|
||||
background-color: #d4ebd7;
|
||||
}
|
||||
|
||||
div#gtrcontent table.semlist tbody tr.css_S3 td {
|
||||
background-color: rgb(167, 216, 201);
|
||||
background-color: #bedebe;
|
||||
}
|
||||
|
||||
div#gtrcontent table.semlist tbody tr.css_S4 td {
|
||||
background-color: rgb(131, 225, 140);
|
||||
background-color: #afd7ad;
|
||||
}
|
||||
div#gtrcontent table.semlist tbody tr.css_S5 td {
|
||||
background-color: #a0cd9a;
|
||||
}
|
||||
div#gtrcontent table.semlist tbody tr.css_S6 td {
|
||||
background-color: #7dcf78;
|
||||
}
|
||||
|
||||
div#gtrcontent table.semlist tbody tr.css_MEXT td {
|
||||
color: #0b6e08;
|
||||
color: #fefcdf;
|
||||
}
|
||||
|
||||
/* ----- Liste des news ----- */
|
||||
@ -2019,7 +2025,8 @@ ul.ue_inscr_list li.etud {
|
||||
|
||||
.sem-groups-partition .stdlink, .sem-groups-partition .stdlink:visited {
|
||||
color: black;
|
||||
text-decoration-style: dashed;
|
||||
text-decoration-style: dotted;
|
||||
text-underline-offset: 3px;
|
||||
}
|
||||
.sem-groups-list .stdlink, .sem-groups-list .stdlink:visited {
|
||||
color:rgb(0, 0, 192);
|
||||
|
127
app/templates/scolar/index.j2
Normal file
127
app/templates/scolar/index.j2
Normal file
@ -0,0 +1,127 @@
|
||||
{# page accueil département #}
|
||||
|
||||
{% extends "sco_page.j2" %}
|
||||
|
||||
{% block app_content %}
|
||||
<style>
|
||||
td.datesem {
|
||||
font-size: 80%;
|
||||
white-space: nowrap;
|
||||
padding-left: 8px;
|
||||
}
|
||||
td.titresem {
|
||||
padding-left: 6px;
|
||||
}
|
||||
</style>
|
||||
|
||||
{# News #}
|
||||
{{scolar_news_summary|safe}}
|
||||
|
||||
{# Avertissement de mise à jour: #}
|
||||
<div id="update_warning" class="scobox update_warning"></div>
|
||||
|
||||
{% if nb_user_accounts == 0 %}
|
||||
<h2>Aucun utilisateur défini !</h2>
|
||||
<p>Pour définir des utilisateurs <a href="{{
|
||||
url_for('users.index_html', scodoc_dept=g.scodoc_dept)
|
||||
}}">passez par la page Utilisateurs</a>.<br>
|
||||
Définissez au moins un utilisateur avec le rôle <tt>AdminXXX</tt>
|
||||
(le responsable du département <tt>XXX</tt>).
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
{# Les semestres courants (cad non verrouillés) #}
|
||||
<div class="scobox">
|
||||
{{html_current_formsemestres|safe}}
|
||||
</div>
|
||||
|
||||
{# Table de tous les semestres #}
|
||||
|
||||
{% if html_table_formsemestres %}
|
||||
<details open>
|
||||
<summary>
|
||||
Semestres de {{dept_name}}
|
||||
</summary>
|
||||
{{ html_table_formsemestres|safe }}
|
||||
</details>
|
||||
{% else %}
|
||||
<p><a class="stdlink" href="{{
|
||||
url_for('scolar.index_html', scodoc_dept=g.scodoc_dept, showsemtable=1)
|
||||
}}">Voir table des {{formsemestres.count()}} semestres
|
||||
{% if nb_locked %}
|
||||
(dont {{nb_locked}} verrouillé{{'s' if nb_locked > 1 else ''}})
|
||||
{%endif%}
|
||||
</a>
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
{# Recherche d'un semestre par code Apogée #}
|
||||
<form action="{url_for('notes.view_formsemestre_by_etape', scodoc_dept=g.scodoc_dept)}">
|
||||
Chercher étape courante:
|
||||
<input name="etape_apo" type="text" size="8" spellcheck="false"></input>
|
||||
</form>
|
||||
|
||||
{# Gestion des étudiants #}
|
||||
<div class="scobox">
|
||||
<div class="scobox-title">Gestion des étudiants</div>
|
||||
<ul>
|
||||
{% if current_user.has_permission(Permission.EtudInscrit) %}
|
||||
<li><a class="stdlink" href="{{
|
||||
url_for('scolar.etudident_create_form', scodoc_dept=g.scodoc_dept)
|
||||
}}">créer <em>un</em> nouvel étudiant</a>
|
||||
</li>
|
||||
<li><a class="stdlink" href="{{
|
||||
url_for('scolar.form_students_import_excel', scodoc_dept=g.scodoc_dept)
|
||||
}}">importer de nouveaux étudiants</a>
|
||||
(<em>ne pas utiliser</em> sauf cas particulier : utilisez plutôt le lien dans
|
||||
le tableau de bord semestre si vous souhaitez inscrire les
|
||||
étudiants importés à un semestre)
|
||||
</li>
|
||||
{% endif %}
|
||||
<li><a class="stdlink" href="{{
|
||||
url_for('scolar.export_etudiants_courants', scodoc_dept=g.scodoc_dept)
|
||||
}}">exporter tableau des étudiants des semestres en cours</a>
|
||||
</li>
|
||||
{% if current_user.has_permission(Permission.EtudInscrit) and sco.prefs["portal_url"] %}
|
||||
<li><a class="stdlink" href="{{
|
||||
url_for('scolar.formsemestre_import_etud_admission', scodoc_dept=g.scodoc_dept, tous_courants=1)
|
||||
}}">resynchroniser les données étudiants des semestres en cours depuis le portail</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{# Apogée #}
|
||||
{% if current_user.has_permission(Permission.EditApogee) %}
|
||||
<div class="scobox">
|
||||
<div class="scobox-title">Exports Apogée</div>
|
||||
<ul>
|
||||
<li><a class="stdlink" href="{{
|
||||
url_for('notes.semset_page', scodoc_dept=g.scodoc_dept)
|
||||
}}">Années scolaires / exports Apogée</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{# Assistance #}
|
||||
<div class="scobox">
|
||||
<div class="scobox-title">Assistance</div>
|
||||
<ul>
|
||||
<li>
|
||||
<a class="stdlink" href="https://scodoc.org/Contact" target="_blank"
|
||||
rel="noopener noreferrer">Contact (Discord)</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="stdlink" href="sco_dump_and_send_db">Envoyer données</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{% endblock app_content %}
|
||||
|
||||
{% block scripts %}
|
||||
{{ super() }}
|
||||
<script src="{{scu.STATIC_DIR}}/js/scolar_index.js"></script>
|
||||
{% endblock scripts %}
|
Loading…
Reference in New Issue
Block a user