Fix imports portails + petits bugs

This commit is contained in:
Emmanuel Viennet 2021-08-21 15:17:14 +02:00
parent e54e8147a8
commit c22f4571fa
16 changed files with 61 additions and 65 deletions

View File

@ -48,7 +48,7 @@ def sidebar_common():
"authuser": current_user.user_name,
}
H = [
f"""<a class="scodoc_title" href="about">ScoDoc 8</a>
f"""<a class="scodoc_title" href="about">ScoDoc 9</a>
<div id="authuser"><a id="authuserlink" href="{
url_for("users.user_info_page", scodoc_dept=g.scodoc_dept, user_name=current_user.user_name)
}">{current_user.user_name}</a>

View File

@ -53,6 +53,7 @@ import shutil
import glob
import flask
from flask import g
import app.scodoc.sco_utils as scu
from config import Config
@ -95,7 +96,7 @@ class BaseArchiver(object):
:return: path to directory of archives for this object (eg formsemestre_id or etudid).
If directory does not yet exist, create it.
"""
dept_dir = os.path.join(self.root, scu.get_dept_id())
dept_dir = os.path.join(self.root, g.scodoc_dept)
try:
scu.GSL.acquire()
if not os.path.isdir(dept_dir):
@ -113,7 +114,7 @@ class BaseArchiver(object):
"""
:return: list of archive oids
"""
base = os.path.join(self.root, scu.get_dept_id()) + os.path.sep
base = os.path.join(self.root, g.scodoc_dept) + os.path.sep
dirs = glob.glob(base + "*")
return [os.path.split(x)[1] for x in dirs]

View File

@ -58,6 +58,8 @@ import traceback
from reportlab.platypus.doctemplate import PageTemplate, BaseDocTemplate
from flask import g, url_for
from app.scodoc import VERSION
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
@ -139,7 +141,7 @@ def process_field(field, cdict, style, suppress_empty_pars=False, format="pdf"):
return text
# --- PDF format:
# handle logos:
image_dir = scu.SCODOC_LOGOS_DIR + "/logos_" + scu.get_dept_id() + "/"
image_dir = scu.SCODOC_LOGOS_DIR + "/logos_" + g.scodoc_dept + "/"
if not os.path.exists(image_dir):
image_dir = scu.SCODOC_LOGOS_DIR + "/" # use global logos
if not os.path.exists(image_dir):

View File

@ -85,7 +85,7 @@ et sur page "réglages bulletin" (avec formsemestre_id)
# def _sig_filename(side, formsemestre_id=None):
# if not side in ("left", "right"):
# raise ValueError("side must be left or right")
# dirs = [SCODOC_LOGOS_DIR, scu.get_dept_id()]
# dirs = [SCODOC_LOGOS_DIR, g.scodoc_dept]
# if formsemestre_id:
# dirs.append(formsemestre_id)
# dirs.append("bul_sig_{}".format(side))

View File

@ -911,7 +911,7 @@ def fill_etuds_info(etuds):
# open('/tmp/t','w').write( str(etuds) )
for etud in etuds:
etudid = etud["etudid"]
etud["dept"] = scu.get_dept_id()
etud["dept"] = g.scodoc_dept
adrs = adresse_list(cnx, {"etudid": etudid})
if not adrs:
# certains "vieux" etudiants n'ont pas d'adresse

View File

@ -195,7 +195,7 @@ def _build_results_list(dpv_by_sem, etuds_infos):
int(sem["annee_debut"]), sem["mois_debut_ord"]
)
r["sid"] = "{} {} {}".format(
sem["sem_id_txt"], scu.get_dept_id(), sem["modalite"]
sem["sem_id_txt"], g.scodoc_dept, sem["modalite"]
)
rows.append(r)

View File

@ -145,12 +145,13 @@ def list_inscrits_date(sem):
cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
sem["date_debut_iso"] = ndb.DateDMYtoISO(sem["date_debut"])
cursor.execute(
"""select I.etudid
from notes_formsemestre_inscription I, notes_formsemestre S
where I.formsemestre_id = S.formsemestre_id
and I.formsemestre_id != %(formsemestre_id)s
and S.date_debut <= %(date_debut_iso)s
and S.date_fin >= %(date_debut_iso)s""",
"""SELECT I.etudid
FROM notes_formsemestre_inscription I, notes_formsemestre S
WHERE I.formsemestre_id = S.id
AND S.id != %(formsemestre_id)s
AND S.date_debut <= %(date_debut_iso)s
AND S.date_fin >= %(date_debut_iso)s
""",
sem,
)
return [x[0] for x in cursor.fetchall()]

View File

@ -52,6 +52,8 @@ from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
from reportlab.lib import styles
from reportlab.lib.pagesizes import letter, A4, landscape
from flask import g
import app.scodoc.sco_utils as scu
from app.scodoc.sco_utils import (
CONFIG,
@ -203,7 +205,7 @@ class ScolarsPageTemplate(PageTemplate):
# XXX COPIED from sco_pvpdf, to be refactored (no time now)
# Search background in dept specific dir, then in global config dir
for image_dir in (
SCODOC_LOGOS_DIR + "/logos_" + scu.get_dept_id() + "/",
SCODOC_LOGOS_DIR + "/logos_" + g.scodoc_dept + "/",
SCODOC_LOGOS_DIR + "/", # global logos
):
for suffix in LOGOS_IMAGES_ALLOWED_TYPES:

View File

@ -1,7 +1,7 @@
# -*- mode: python -*-
# -*- coding: utf-8 -*-
"""Definition of ScoDoc 8 permissions
"""Definition of ScoDoc permissions
used by auth
"""

View File

@ -43,18 +43,18 @@ Les images sont servies par ScoDoc, via la méthode getphotofile?etudid=xxx
"""
import datetime
import glob
import io
import os
import time
import datetime
import random
import six.moves.urllib.request, six.moves.urllib.error, six.moves.urllib.parse
import requests
import time
import traceback
from PIL import Image as PILImage
import glob
from flask import request
from flask import request, g
from config import Config
@ -318,7 +318,7 @@ def get_new_filename(etudid):
"""Constructs a random filename to store a new image.
The path is constructed as: Fxx/etudid
"""
dept = scu.get_dept_id()
dept = g.scodoc_dept
return find_new_dir() + dept + "_" + str(etudid)
@ -351,17 +351,15 @@ def copy_portal_photo_to_fs(etud):
f = None
try:
log("copy_portal_photo_to_fs: getting %s" % url)
f = six.moves.urllib.request.urlopen(
url, timeout=portal_timeout
) # python >= 2.7
r = requests.get(url, timeout=portal_timeout)
except:
log("download failed: exception:\n%s" % traceback.format_exc())
log("called from:\n" + "".join(traceback.format_stack()))
return None, "%s: erreur chargement de %s" % (etud["nomprenom"], url)
if not f:
if r.status_code != 200:
log("download failed")
return None, "%s: erreur chargement de %s" % (etud["nomprenom"], url)
data = f.read()
data = r.content # image bytes
try:
status, diag = store_photo(etud, data)
except:

View File

@ -27,20 +27,19 @@
"""Liaison avec le portail ENT (qui donne accès aux infos Apogée)
"""
import os, time
import six.moves.urllib.request, six.moves.urllib.parse, six.moves.urllib.error
import datetime
import os
import time
import urllib
import xml
import xml.sax.saxutils
import xml.dom.minidom
import datetime
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc import sco_preferences
import six
from six.moves import range
SCO_CACHE_ETAPE_FILENAME = os.path.join(scu.SCO_TMP_DIR, "last_etapes.xml")
@ -52,17 +51,19 @@ def has_portal():
class PortalInterface(object):
def __init__(self):
self.warning = False
self.first_time = True
def get_portal_url(self):
"URL of portal"
portal_url = sco_preferences.get_preference("portal_url")
if not self.warning:
if portal_url and not portal_url.endswith("/"):
portal_url += "/"
if self.first_time:
if portal_url:
log("Portal URL=%s" % portal_url)
else:
log("Portal not configured")
self.warning = True
self.first_time = False
return portal_url
def get_etapes_url(self):
@ -157,14 +158,10 @@ def get_inscrits_etape(code_etape, anneeapogee=None, ntrials=2):
req = (
etud_url
+ "?"
+ six.moves.urllib.parse.urlencode(
(("etape", code_etape), ("annee", anneeapogee))
)
+ urllib.parse.urlencode((("etape", code_etape), ("annee", anneeapogee)))
)
else:
req = (
etud_url + "?" + six.moves.urllib.parse.urlencode((("etape", code_etape),))
)
req = etud_url + "?" + urllib.parse.urlencode((("etape", code_etape),))
actual_timeout = float(portal_timeout) / ntrials
if portal_timeout > 0:
actual_timeout = max(1, actual_timeout)
@ -209,7 +206,7 @@ def query_apogee_portal(**args):
# XXX TODO : va poser problème pour la page modif données étudiants : A VOIR
return []
portal_timeout = sco_preferences.get_preference("portal_timeout")
req = etud_url + "?" + six.moves.urllib.parse.urlencode(list(args.items()))
req = etud_url + "?" + urllib.parse.urlencode(list(args.items()))
doc = scu.query_portal(req, timeout=portal_timeout) # sco_utils
return xml_to_list_of_dicts(doc, req=req)
@ -242,7 +239,7 @@ def xml_to_list_of_dicts(doc, req=None):
)
infos = []
try:
if dom.childNodes[0].nodeName != u"etudiants":
if dom.childNodes[0].nodeName != "etudiants":
raise ValueError
etudiants = dom.getElementsByTagName("etudiant")
for etudiant in etudiants:
@ -252,9 +249,7 @@ def xml_to_list_of_dicts(doc, req=None):
if e.nodeType == e.ELEMENT_NODE:
childs = e.childNodes
if len(childs):
d[str(e.nodeName)] = childs[0].nodeValue.encode(
scu.SCO_ENCODING
)
d[str(e.nodeName)] = childs[0].nodeValue
infos.append(d)
except:
log("*** invalid XML response from Etudiant Web Service")
@ -320,7 +315,7 @@ def get_etud_apogee(code_nip):
if not etud_url:
return {}
portal_timeout = sco_preferences.get_preference("portal_timeout")
req = etud_url + "?" + six.moves.urllib.parse.urlencode((("nip", code_nip),))
req = etud_url + "?" + urllib.parse.urlencode((("nip", code_nip),))
doc = scu.query_portal(req, timeout=portal_timeout)
d = _normalize_apo_fields(xml_to_list_of_dicts(doc, req=req))
if not d:
@ -356,13 +351,13 @@ def _parse_etapes_from_xml(doc):
# parser XML
dom = xml.dom.minidom.parseString(doc)
infos = {}
if dom.childNodes[0].nodeName != u"etapes":
if dom.childNodes[0].nodeName != "etapes":
raise ValueError
if xml_etapes_by_dept:
# Ancien format XML avec des sections par departement:
for d in dom.childNodes[0].childNodes:
if d.nodeType == d.ELEMENT_NODE:
dept = d.nodeName.encode(scu.SCO_ENCODING)
dept = d.nodeName
_xml_list_codes(infos, dept, d.childNodes)
else:
# Toutes les étapes:
@ -411,8 +406,8 @@ def get_etapes_apogee():
def _xml_list_codes(target_dict, dept, nodes):
for e in nodes:
if e.nodeType == e.ELEMENT_NODE:
intitule = e.childNodes[0].nodeValue.encode(scu.SCO_ENCODING)
code = e.attributes["code"].value.encode(scu.SCO_ENCODING)
intitule = e.childNodes[0].nodeValue
code = e.attributes["code"].value
if dept in target_dict:
target_dict[dept][code] = intitule
else:
@ -558,9 +553,7 @@ def get_maquette_apogee(etape="", annee_scolaire=""):
req = (
maquette_url
+ "?"
+ six.moves.urllib.parse.urlencode(
(("etape", etape), ("annee", annee_scolaire))
)
+ urllib.parse.urlencode((("etape", etape), ("annee", annee_scolaire)))
)
doc = scu.query_portal(req, timeout=portal_timeout)
return doc

View File

@ -200,7 +200,7 @@ class CourrierIndividuelTemplate(PageTemplate):
self.logo_header = None
# Search logos in dept specific dir, then in global scu.CONFIG dir
for image_dir in (
scu.SCODOC_LOGOS_DIR + "/logos_" + scu.get_dept_id(),
scu.SCODOC_LOGOS_DIR + "/logos_" + g.scodoc_dept,
scu.SCODOC_LOGOS_DIR, # global logos
):
for suffix in scu.LOGOS_IMAGES_ALLOWED_TYPES:

View File

@ -958,7 +958,6 @@ def saisie_notes(evaluation_id, group_ids=[], REQUEST=None):
)
if form is None:
log(f"redirecting to {destination}")
stop
return flask.redirect(destination)
H.append(form)
#

View File

@ -114,10 +114,11 @@ def formsemestre_synchro_etuds(
if anneeapogee:
base_url += "&anneeapogee=%s" % anneeapogee
if anneeapogee == None: # année d'inscription par défaut
anneeapogee = str(
scu.annee_scolaire_debut(sem["annee_debut"], sem["mois_debut_ord"])
if anneeapogee is None: # année d'inscription par défaut
anneeapogee = scu.annee_scolaire_debut(
sem["annee_debut"], sem["mois_debut_ord"]
)
anneeapogee = str(anneeapogee)
if type(etuds) == type(""):
etuds = etuds.split(",") # vient du form de confirmation
@ -132,7 +133,7 @@ def formsemestre_synchro_etuds(
inscrits_without_key_all,
etudsapo_ident,
) = list_synch(sem, anneeapogee=anneeapogee)
breakpoint()
if export_cat_xls:
filename = export_cat_xls
xls = build_page(
@ -155,6 +156,7 @@ def formsemestre_synchro_etuds(
read_only=read_only,
)
else:
breakpoint()
etuds_set = set(etuds)
a_importer = a_importer.intersection(etuds_set)
a_desinscrire = inscrits_set - etuds_set
@ -499,7 +501,7 @@ def list_all(etudsapo_set):
# d'interrogation par etudiant.
cnx = ndb.GetDBConnexion()
cursor = cnx.cursor(cursor_factory=ndb.ScoDocCursor)
cursor.execute("select " + EKEY_SCO + ", etudid from identite")
cursor.execute("SELECT " + EKEY_SCO + ", id AS etudid FROM identite")
key2etudid = dict([(x[0], x[1]) for x in cursor.fetchall()])
all_set = set(key2etudid.keys())
@ -654,7 +656,7 @@ def do_import_etuds_from_portal(sem, a_importer, etudsapo_ident, REQUEST):
{"etudid": etudid},
)
cursor.execute(
"delete from identite where etudid=%(etudid)s", {"etudid": etudid}
"delete from identite where id=%(etudid)s", {"etudid": etudid}
)
cnx.commit()
log("do_import_etuds_from_portal: re-raising exception")

View File

@ -317,9 +317,6 @@ TYPES_ADMISSION = (TYPE_ADMISSION_DEFAULT, "APB", "APB-PC", "CEF", "Direct")
BULLETINS_VERSIONS = ("short", "selectedevals", "long")
# Support for ScoDoc7 compatibility
def get_dept_id():
"acronyme du dept courant"
return g.scodoc_dept # en scodoc 8.1 #sco8
def ScoURL():

View File

@ -53,6 +53,7 @@ def make_random_etape_etuds(etape, annee):
"""Liste d'etudiants d'une etape"""
random.seed(etape + annee)
nb = random.randint(0, 50)
print(f"generating {nb} students")
L = []
for i in range(nb):
if i % 2: