forked from ScoDoc/ScoDoc
Fixes #70
This commit is contained in:
parent
4a5d4adee1
commit
9e65fa7654
@ -251,8 +251,8 @@ class exUserFolder(Folder,BasicUserFolder,BasicGroupFolderMixin,
|
|||||||
('Manager',)),
|
('Manager',)),
|
||||||
|
|
||||||
('View', ('manage_changePassword',
|
('View', ('manage_changePassword',
|
||||||
'manage_forgotPassword', 'docLogin','docLoginRedirect',
|
'manage_forgotPassword','docLoginRedirect',
|
||||||
'docLogout', 'logout', 'DialogHeader',
|
'logout', 'DialogHeader',
|
||||||
'DialogFooter', 'manage_signupUser',
|
'DialogFooter', 'manage_signupUser',
|
||||||
'MessageDialog', 'redirectToLogin','manage_changeProps'),
|
'MessageDialog', 'redirectToLogin','manage_changeProps'),
|
||||||
('Anonymous', 'Authenticated', 'Manager')),
|
('Anonymous', 'Authenticated', 'Manager')),
|
||||||
@ -269,7 +269,7 @@ class exUserFolder(Folder,BasicUserFolder,BasicGroupFolderMixin,
|
|||||||
('Access contents information', ('hasProperty', 'propertyIds',
|
('Access contents information', ('hasProperty', 'propertyIds',
|
||||||
'propertyValues','propertyItems',
|
'propertyValues','propertyItems',
|
||||||
'getProperty', 'getPropertyType',
|
'getProperty', 'getPropertyType',
|
||||||
'propertyMap', 'docLogin','docLoginRedirect',
|
'propertyMap', 'docLoginRedirect',
|
||||||
'DialogHeader', 'DialogFooter',
|
'DialogHeader', 'DialogFooter',
|
||||||
'MessageDialog', 'redirectToLogin',),
|
'MessageDialog', 'redirectToLogin',),
|
||||||
('Anonymous', 'Authenticated', 'Manager')),
|
('Anonymous', 'Authenticated', 'Manager')),
|
||||||
|
64
config/fix_bug70_db.py
Normal file
64
config/fix_bug70_db.py
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# -*- mode: python -*-
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""Fix bug #70
|
||||||
|
|
||||||
|
Utiliser comme:
|
||||||
|
scotests/scointeractive.sh DEPT config/fix_bug70_db.py
|
||||||
|
|
||||||
|
"""
|
||||||
|
context = context.Notes # pylint: disable=undefined-variable
|
||||||
|
REQUEST = REQUEST # pylint: disable=undefined-variable
|
||||||
|
import scotests.sco_fake_gen as sco_fake_gen # pylint: disable=import-error
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import sco_utils
|
||||||
|
import notesdb
|
||||||
|
import sco_formsemestre
|
||||||
|
import sco_formsemestre_edit
|
||||||
|
import sco_moduleimpl
|
||||||
|
|
||||||
|
G = sco_fake_gen.ScoFake(context.Notes)
|
||||||
|
|
||||||
|
|
||||||
|
def fix_formsemestre_formation_bug70(formsemestre_id):
|
||||||
|
"""Le bug #70 a pu entrainer des incohérences
|
||||||
|
lors du clonage avorté de semestres.
|
||||||
|
Cette fonction réassocie le semestre à la formation
|
||||||
|
à laquelle appartiennent ses modulesimpls.
|
||||||
|
2021-04-23
|
||||||
|
"""
|
||||||
|
sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
|
||||||
|
cursor = notesdb.SimpleQuery(
|
||||||
|
context,
|
||||||
|
"""SELECT m.formation_id
|
||||||
|
FROM notes_modules m, notes_moduleimpl mi
|
||||||
|
WHERE mi.module_id = m.module_id
|
||||||
|
AND mi.formsemestre_id = %(formsemestre_id)s
|
||||||
|
""",
|
||||||
|
{"formsemestre_id": formsemestre_id},
|
||||||
|
)
|
||||||
|
modimpls_formations = set([x[0] for x in cursor])
|
||||||
|
if len(modimpls_formations) > 1:
|
||||||
|
# this is should not occur
|
||||||
|
G.log(
|
||||||
|
"Warning: fix_formsemestre_formation_bug70: modules from several formations in sem %s"
|
||||||
|
% formsemestre_id
|
||||||
|
)
|
||||||
|
elif len(modimpls_formations) == 1:
|
||||||
|
modimpls_formation_id = modimpls_formations.pop()
|
||||||
|
if modimpls_formation_id != sem["formation_id"]:
|
||||||
|
# Bug #70: fix
|
||||||
|
G.log("fix_formsemestre_formation_bug70: fixing %s" % formsemestre_id)
|
||||||
|
sem["formation_id"] = modimpls_formation_id
|
||||||
|
context.do_formsemestre_edit(sem, html_quote=False)
|
||||||
|
|
||||||
|
|
||||||
|
formsemestre_ids = [
|
||||||
|
x[0]
|
||||||
|
for x in notesdb.SimpleQuery(
|
||||||
|
context, "SELECT formsemestre_id FROM notes_formsemestre", {}
|
||||||
|
)
|
||||||
|
]
|
||||||
|
for formsemestre_id in formsemestre_ids:
|
||||||
|
fix_formsemestre_formation_bug70(formsemestre_id)
|
28
config/postupgrade.py
Executable file → Normal file
28
config/postupgrade.py
Executable file → Normal file
@ -11,21 +11,22 @@ _before_ upgrading the database.
|
|||||||
E. Viennet, June 2008
|
E. Viennet, June 2008
|
||||||
Mar 2017: suppress upgrade of very old Apache configs
|
Mar 2017: suppress upgrade of very old Apache configs
|
||||||
Aug 2020: move photos to .../var/scodoc/
|
Aug 2020: move photos to .../var/scodoc/
|
||||||
|
Apr 2021: bug #70
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import glob
|
import glob
|
||||||
import shutil
|
import shutil
|
||||||
from scodocutils import log, SCODOC_DIR, SCODOC_VAR_DIR, SCODOC_LOGOS_DIR
|
from scodocutils import log, SCODOC_DIR, SCODOC_VAR_DIR, SCODOC_LOGOS_DIR, SCO_TMPDIR
|
||||||
|
|
||||||
if os.getuid() != 0:
|
if os.getuid() != 0:
|
||||||
log('postupgrade.py: must be run as root')
|
log("postupgrade.py: must be run as root")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
# ---
|
# ---
|
||||||
# Migrate photos (2020-08-16, svn 1908)
|
# Migrate photos (2020-08-16, svn 1908)
|
||||||
old_photo_dir = os.path.join(SCODOC_DIR, "static", "photos")
|
old_photo_dir = os.path.join(SCODOC_DIR, "static", "photos")
|
||||||
photo_dirs = glob.glob( old_photo_dir + "/F*")
|
photo_dirs = glob.glob(old_photo_dir + "/F*")
|
||||||
if photo_dirs:
|
if photo_dirs:
|
||||||
log("Moving photos to new <var> directory...")
|
log("Moving photos to new <var> directory...")
|
||||||
shutil.move(old_photo_dir, SCODOC_VAR_DIR)
|
shutil.move(old_photo_dir, SCODOC_VAR_DIR)
|
||||||
@ -33,7 +34,7 @@ if photo_dirs:
|
|||||||
# Migrate depts (2020-08-17, svn 1909)
|
# Migrate depts (2020-08-17, svn 1909)
|
||||||
|
|
||||||
old_depts_dir = os.path.join(SCODOC_DIR, "config", "depts")
|
old_depts_dir = os.path.join(SCODOC_DIR, "config", "depts")
|
||||||
cfg_files = glob.glob( old_depts_dir + "/*.cfg")
|
cfg_files = glob.glob(old_depts_dir + "/*.cfg")
|
||||||
depts_dir = os.path.join(SCODOC_VAR_DIR, "config/depts/")
|
depts_dir = os.path.join(SCODOC_VAR_DIR, "config/depts/")
|
||||||
for cfg in cfg_files:
|
for cfg in cfg_files:
|
||||||
log("Moving %s to new <var> directory..." % cfg)
|
log("Moving %s to new <var> directory..." % cfg)
|
||||||
@ -41,7 +42,7 @@ for cfg in cfg_files:
|
|||||||
|
|
||||||
# Move logos
|
# Move logos
|
||||||
if not os.path.exists(SCODOC_LOGOS_DIR):
|
if not os.path.exists(SCODOC_LOGOS_DIR):
|
||||||
old_logos = os.path.join(SCODOC_DIR,"logos")
|
old_logos = os.path.join(SCODOC_DIR, "logos")
|
||||||
if os.path.exists(old_logos):
|
if os.path.exists(old_logos):
|
||||||
log("Moving logos to new <var> directory...")
|
log("Moving logos to new <var> directory...")
|
||||||
dest = os.path.normpath(os.path.join(SCODOC_LOGOS_DIR, ".."))
|
dest = os.path.normpath(os.path.join(SCODOC_LOGOS_DIR, ".."))
|
||||||
@ -50,10 +51,23 @@ if not os.path.exists(SCODOC_LOGOS_DIR):
|
|||||||
log("Warning: logos directory is missing (%s)" % SCODOC_LOGOS_DIR)
|
log("Warning: logos directory is missing (%s)" % SCODOC_LOGOS_DIR)
|
||||||
|
|
||||||
# Move dept-specific logos
|
# Move dept-specific logos
|
||||||
for d in glob.glob( SCODOC_DIR + "/logos_*" ):
|
for d in glob.glob(SCODOC_DIR + "/logos_*"):
|
||||||
log("Moving %s to %s" % (d, SCODOC_LOGOS_DIR))
|
log("Moving %s to %s" % (d, SCODOC_LOGOS_DIR))
|
||||||
shutil.move(d, SCODOC_LOGOS_DIR)
|
shutil.move(d, SCODOC_LOGOS_DIR)
|
||||||
|
|
||||||
|
# Fix bug #70
|
||||||
|
depts = [
|
||||||
|
os.path.splitext(os.path.basename(f))[0] for f in glob.glob(depts_dir + "/*.cfg")
|
||||||
|
]
|
||||||
|
for dept in depts:
|
||||||
|
fixed_filename = SCO_TMPDIR + "/.%s_bug70_fixed" % dept
|
||||||
|
if not os.path.exists(fixed_filename):
|
||||||
|
log("fixing #70 on %s" % dept)
|
||||||
|
os.system("../scotests/scointeractive.sh -x %s config/fix_bug70_db.py" % dept)
|
||||||
|
# n'essaie qu'une foixs, même en cas d'échec
|
||||||
|
f = open(fixed_filename, "a")
|
||||||
|
f.close()
|
||||||
|
|
||||||
# Continue here...
|
# Continue here...
|
||||||
|
|
||||||
# ---
|
# ---
|
||||||
|
1
config/scodocutils.py
Normal file → Executable file
1
config/scodocutils.py
Normal file → Executable file
@ -30,6 +30,7 @@ SCODOC_VAR_DIR = os.environ.get("SCODOC_VAR_DIR", "")
|
|||||||
if not SCODOC_VAR_DIR:
|
if not SCODOC_VAR_DIR:
|
||||||
log("Error: environment variable SCODOC_VAR_DIR is not defined")
|
log("Error: environment variable SCODOC_VAR_DIR is not defined")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
SCO_TMPDIR = os.path.join(SCODOC_VAR_DIR, "tmp")
|
||||||
SCODOC_LOGOS_DIR = os.environ.get("SCODOC_LOGOS_DIR", "")
|
SCODOC_LOGOS_DIR = os.environ.get("SCODOC_LOGOS_DIR", "")
|
||||||
|
|
||||||
|
|
||||||
|
10
debug.py
10
debug.py
@ -57,18 +57,20 @@ import sco_bulletins_xml
|
|||||||
# Prend le premier departement comme context
|
# Prend le premier departement comme context
|
||||||
|
|
||||||
|
|
||||||
def go(app, n=0):
|
def go(app, n=0, verbose=True):
|
||||||
context = app.ScoDoc.objectValues("Folder")[n].Scolarite
|
context = app.ScoDoc.objectValues("Folder")[n].Scolarite
|
||||||
print("context in dept ", context.DeptId())
|
if verbose:
|
||||||
|
print("context in dept ", context.DeptId())
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
def go_dept(app, dept):
|
def go_dept(app, dept, verbose=True):
|
||||||
objs = app.ScoDoc.objectValues("Folder")
|
objs = app.ScoDoc.objectValues("Folder")
|
||||||
for o in objs:
|
for o in objs:
|
||||||
context = o.Scolarite
|
context = o.Scolarite
|
||||||
if context.DeptId() == dept:
|
if context.DeptId() == dept:
|
||||||
print("context in dept ", context.DeptId())
|
if verbose:
|
||||||
|
print("context in dept ", context.DeptId())
|
||||||
return context
|
return context
|
||||||
raise ValueError("dep %s not found" % dept)
|
raise ValueError("dep %s not found" % dept)
|
||||||
|
|
||||||
|
@ -1132,6 +1132,9 @@ class NotesTable:
|
|||||||
|
|
||||||
def sem_has_decisions(self):
|
def sem_has_decisions(self):
|
||||||
"""True si au moins une decision de jury dans ce semestre"""
|
"""True si au moins une decision de jury dans ce semestre"""
|
||||||
|
if [x for x in self.decisions_jury_ues.values() if x]:
|
||||||
|
return True
|
||||||
|
|
||||||
return len([x for x in self.decisions_jury_ues.values() if x]) > 0
|
return len([x for x in self.decisions_jury_ues.values() if x]) > 0
|
||||||
|
|
||||||
def etud_has_decision(self, etudid):
|
def etud_has_decision(self, etudid):
|
||||||
|
@ -9,9 +9,10 @@
|
|||||||
# le département via l'interface web (Zope)
|
# le département via l'interface web (Zope)
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
echo "Usage: $0 [-r] dept [script...]"
|
echo "Usage: $0 [-h] [-r] [-x] dept [script...]"
|
||||||
echo "Lance un environnement interactif python/ScoDoc"
|
echo "Lance un environnement interactif python/ScoDoc"
|
||||||
echo " -r: supprime et recrée le département (attention: efface la base !)"
|
echo " -r: supprime et recrée le département (attention: efface la base !)"
|
||||||
|
echo " -x: exit après exécution des scripts, donc mode non interactif"
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -20,24 +21,38 @@ cd /opt/scodoc/Products/ScoDoc || exit 2
|
|||||||
source config/config.sh
|
source config/config.sh
|
||||||
source config/utils.sh
|
source config/utils.sh
|
||||||
|
|
||||||
if [ $# -lt 1 ]
|
RECREATE_DEPT=0
|
||||||
then
|
PYTHON_INTERACTIVE="-i"
|
||||||
usage
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$1" = "-r" ]
|
while [ -n "$1" ]; do
|
||||||
then
|
PARAM="$1"
|
||||||
|
[ "${PARAM::1}" != "-" ] && break
|
||||||
|
case $PARAM in
|
||||||
|
-h | --help)
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-r)
|
||||||
|
RECREATE_DEPT=1
|
||||||
|
;;
|
||||||
|
-x)
|
||||||
|
PYTHON_INTERACTIVE=""
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "ERROR: unknown parameter \"$PARAM\""
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
shift
|
shift
|
||||||
recreate_dept=1
|
done
|
||||||
else
|
|
||||||
recreate_dept=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
DEPT="$1"
|
DEPT="$1"
|
||||||
shift
|
shift
|
||||||
|
|
||||||
if [ "$recreate_dept" = 1 ]
|
if [ "$RECREATE_DEPT" = 1 ]
|
||||||
then
|
then
|
||||||
cfg_pathname="${SCODOC_VAR_DIR}/config/depts/$DEPT".cfg
|
cfg_pathname="${SCODOC_VAR_DIR}/config/depts/$DEPT".cfg
|
||||||
if [ -e "$cfg_pathname" ]
|
if [ -e "$cfg_pathname" ]
|
||||||
@ -48,13 +63,17 @@ then
|
|||||||
# systemctl start scodoc
|
# systemctl start scodoc
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cmd="from __future__ import print_function;from Zope2 import configure;configure('/opt/scodoc/etc/zope.conf');import Zope2; app=Zope2.app();from debug import *;context = go_dept(app, '""$DEPT""');"
|
cmd="from __future__ import print_function;from Zope2 import configure;configure('/opt/scodoc/etc/zope.conf');import Zope2; app=Zope2.app();from debug import *;context = go_dept(app, '""$DEPT""', verbose=False);"
|
||||||
|
|
||||||
for f in "$@"
|
for f in "$@"
|
||||||
do
|
do
|
||||||
cmd="${cmd}exec(open(\"${f}\").read());"
|
cmd="${cmd}exec(open(\"${f}\").read());"
|
||||||
done
|
done
|
||||||
|
|
||||||
/opt/zope213/bin/python -i -c "$cmd"
|
if [ -z "$PYTHON_INTERACTIVE" ]
|
||||||
|
then
|
||||||
|
/opt/zope213/bin/python -c "$cmd"
|
||||||
|
else
|
||||||
|
/opt/zope213/bin/python "$PYTHON_INTERACTIVE" -c "$cmd"
|
||||||
|
fi
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ Utiliser comme:
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
# La variable context est définie par le script de lancement
|
# La variable context est définie par le script de lancement
|
||||||
# l'affecte ainsi pour évietr les warnins pylint:
|
# l'affecte ainsi pour éviter les warnings pylint:
|
||||||
context = context # pylint: disable=undefined-variable
|
context = context # pylint: disable=undefined-variable
|
||||||
import scotests.sco_fake_gen as sco_fake_gen # pylint: disable=import-error
|
import scotests.sco_fake_gen as sco_fake_gen # pylint: disable=import-error
|
||||||
import sco_utils
|
import sco_utils
|
||||||
|
Loading…
Reference in New Issue
Block a user