ScoDoc/app/scodoc/sco_formsemestre_custommenu.py

193 lines
6.7 KiB
Python
Raw Normal View History

2020-09-26 16:19:37 +02:00
# -*- mode: python -*-
# -*- coding: utf-8 -*-
##############################################################################
#
# Gestion scolarite IUT
#
2023-01-02 13:16:27 +01:00
# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved.
2020-09-26 16:19:37 +02:00
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Emmanuel Viennet emmanuel.viennet@viennet.net
#
##############################################################################
"""Menu "custom" (défini par l'utilisateur) dans les semestres
"""
2021-08-01 10:16:16 +02:00
import flask
from flask import g, url_for, request
from flask_login import current_user
2020-09-26 16:19:37 +02:00
from app.models.config import ScoDocSiteConfig, PersonalizedLink
from app.models import FormSemestre
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.TrivialFormulator import TrivialFormulator
from app.scodoc import html_sco_header
from app.scodoc import htmlutils
from app.scodoc import sco_formsemestre
from app.scodoc import sco_edt_cal
2020-09-26 16:19:37 +02:00
2021-02-03 22:00:41 +01:00
_custommenuEditor = ndb.EditableTable(
2020-09-26 16:19:37 +02:00
"notes_formsemestre_custommenu",
"custommenu_id",
("custommenu_id", "formsemestre_id", "title", "url", "idx"),
sortkey="idx",
)
notes_formsemestre_custommenu_create = _custommenuEditor.create
notes_formsemestre_custommenu_list = _custommenuEditor.list
notes_formsemestre_custommenu_edit = _custommenuEditor.edit
def formsemestre_custommenu_get(formsemestre_id):
2020-09-26 16:19:37 +02:00
"returns dict [ { 'title' : xxx, 'url' : xxx } ]"
2021-06-15 13:59:56 +02:00
cnx = ndb.GetDBConnexion()
2020-09-26 16:19:37 +02:00
vals = notes_formsemestre_custommenu_list(cnx, {"formsemestre_id": formsemestre_id})
return vals
def build_context_dict(formsemestre_id: int) -> dict:
"""returns a dict with "current" ids, to pass to external links"""
params = {
"dept": g.scodoc_dept,
"formsemestre_id": formsemestre_id,
"user_name": current_user.user_name,
}
cas_id = getattr(current_user, "cas_id", None)
if cas_id:
params["cas_id"] = cas_id
etudid = getattr(g, "current_etudid", None)
if etudid is not None:
params["etudid"] = etudid
evaluation_id = getattr(g, "current_evaluation_id", None)
if evaluation_id is not None:
params["evaluation_id"] = evaluation_id
moduleimpl_id = getattr(g, "current_moduleimpl_id", None)
if moduleimpl_id is not None:
params["moduleimpl_id"] = moduleimpl_id
return params
def formsemestre_custommenu_html(formsemestre_id):
2020-09-26 16:19:37 +02:00
"HTML code for custom menu"
menu = []
# Calendrier électronique ?
2021-08-19 10:28:35 +02:00
sem = sco_formsemestre.get_formsemestre(formsemestre_id)
ics_url = sco_edt_cal.formsemestre_get_ics_url(sem)
2020-09-26 16:19:37 +02:00
if ics_url:
menu.append({"title": "Emploi du temps (ics)", "url": ics_url})
# Liens globaux (config. générale)
params = build_context_dict(formsemestre_id)
for link in ScoDocSiteConfig.get_perso_links():
if link.title:
menu.append({"title": link.title, "url": link.get_url(params=params)})
# Liens propres à ce semestre
menu += formsemestre_custommenu_get(formsemestre_id)
2020-09-26 16:19:37 +02:00
menu.append(
{
"title": "Modifier ce menu...",
2021-06-14 18:08:52 +02:00
"endpoint": "notes.formsemestre_custommenu_edit",
"args": {"formsemestre_id": formsemestre_id},
2020-09-26 16:19:37 +02:00
}
)
return htmlutils.make_menu("Liens", menu)
2020-09-26 16:19:37 +02:00
def formsemestre_custommenu_edit(formsemestre_id):
2020-09-26 16:19:37 +02:00
"""Dialog to edit the custom menu"""
formsemestre: FormSemestre = FormSemestre.query.get_or_404(formsemestre_id)
dest_url = url_for(
"notes.formsemestre_status",
scodoc_dept=g.scodoc_dept,
formsemestre_id=formsemestre_id,
2021-02-07 09:10:26 +01:00
)
2020-09-26 16:19:37 +02:00
H = [
2022-01-07 15:11:24 +01:00
html_sco_header.html_sem_header("Modification du menu du semestre "),
2020-09-26 16:19:37 +02:00
"""<p class="help">Ce menu, spécifique à chaque semestre, peut être utilisé pour placer des liens vers vos applications préférées.</p>
<p class="help">Procédez en plusieurs fois si vous voulez ajouter plusieurs items.</p>""",
]
descr = [
("formsemestre_id", {"input_type": "hidden"}),
(
"sep",
{
"input_type": "separator",
"template": "<tr><td><b>Titre</b></td><td><b>URL</b></td></tr>",
},
),
]
menu = formsemestre_custommenu_get(formsemestre_id)
2020-09-26 16:19:37 +02:00
menu.append({"custommenu_id": "new", "url": "", "title": ""})
initvalues = {}
for item in menu:
descr.append(
(
2021-08-15 22:08:38 +02:00
"title_" + str(item["custommenu_id"]),
2020-09-26 16:19:37 +02:00
{"size": 40, "template": '<tr><td class="tf-field">%(elem)s</td>'},
)
)
descr.append(
(
2021-08-15 22:08:38 +02:00
"url_" + str(item["custommenu_id"]),
2020-09-26 16:19:37 +02:00
{"size": 80, "template": '<td class="tf-field">%(elem)s</td></tr>'},
)
)
2021-08-15 22:08:38 +02:00
initvalues["title_" + str(item["custommenu_id"])] = item["title"]
initvalues["url_" + str(item["custommenu_id"])] = item["url"]
2020-09-26 16:19:37 +02:00
tf = TrivialFormulator(
request.base_url,
scu.get_request_args(),
2020-09-26 16:19:37 +02:00
descr,
initvalues=initvalues,
cancelbutton="Annuler",
submitlabel="Enregistrer",
name="tf",
)
if tf[0] == 0:
return "\n".join(H) + "\n" + tf[1] + html_sco_header.sco_footer()
2020-09-26 16:19:37 +02:00
elif tf[0] == -1:
2021-07-31 18:01:10 +02:00
return flask.redirect(dest_url)
2020-09-26 16:19:37 +02:00
else:
# form submission
2021-06-15 13:59:56 +02:00
cnx = ndb.GetDBConnexion()
2020-09-26 16:19:37 +02:00
# add new
if tf[2]["title_new"]:
notes_formsemestre_custommenu_create(
cnx,
{
"formsemestre_id": formsemestre_id,
"title": tf[2]["title_new"],
"url": tf[2]["url_new"],
},
)
# edit existings
s = "title_"
for x in tf[2].keys():
if x[: len(s)] == s and x != "title_new":
custommenu_id = x[len(s) :]
notes_formsemestre_custommenu_edit(
cnx,
{
"custommenu_id": custommenu_id,
"title": tf[2]["title_" + custommenu_id],
"url": tf[2]["url_" + custommenu_id],
},
)
2021-07-31 18:01:10 +02:00
return flask.redirect(dest_url)