reorganized logging.

This commit is contained in:
Emmanuel Viennet 2021-08-29 19:57:32 +02:00
parent 3948dc2140
commit aee02d911e
86 changed files with 204 additions and 187 deletions

View File

@ -2,10 +2,13 @@
# pylint: disable=invalid-name
import os
import socket
import sys
import time
import traceback
import logging
from logging.handlers import SMTPHandler, TimedRotatingFileHandler
from logging.handlers import SMTPHandler, WatchedFileHandler
from flask import request
from flask import Flask
@ -51,9 +54,6 @@ def create_app(config_class=DevConfig):
app.logger.setLevel(logging.DEBUG)
app.config.from_object(config_class)
app.logger.info(
f"create_app({config_class.__name__}, {config_class.SQLALCHEMY_DATABASE_URI})"
)
db.init_app(app)
migrate.init_app(app, db)
login.init_app(app)
@ -88,7 +88,11 @@ def create_app(config_class=DevConfig):
absences_bp, url_prefix="/ScoDoc/<scodoc_dept>/Scolarite/Absences"
)
# Config logs pour PRODUCTION
if not app.debug and not app.testing:
# On supprime le logguer par défaut qui va vers stderr et pollue le slogs systemes
# nb: pas trouvé plus élégant
app.logger.handlers.pop()
if app.config["MAIL_SERVER"]:
auth = None
if app.config["MAIL_USERNAME"] or app.config["MAIL_PASSWORD"]:
@ -96,24 +100,25 @@ def create_app(config_class=DevConfig):
secure = None
if app.config["MAIL_USE_TLS"]:
secure = ()
host_name = socket.gethostname()
mail_handler = SMTPHandler(
mailhost=(app.config["MAIL_SERVER"], app.config["MAIL_PORT"]),
fromaddr="no-reply@" + app.config["MAIL_SERVER"],
toaddrs=[app.config["ADMINS"]],
subject="ScoDoc Failure",
toaddrs=["exception@scodoc.org"],
subject="ScoDoc Exception from " + host_name,
credentials=auth,
secure=secure,
)
mail_handler.setLevel(logging.ERROR)
app.logger.addHandler(mail_handler)
# Config logs pour DEV et PRODUCTION
if not app.testing:
# Configuration des logs (actifs aussi en mode development)
if not os.path.exists("logs"):
os.mkdir("logs")
file_handler = TimedRotatingFileHandler(
"/opt/scodoc-data/log/scodoc.log",
when="W6", # Sunday
backupCount=53, # 1 an de logs
# usually /opt/scodoc-data/log/scodoc.log:
# rotated by logrotate
file_handler = WatchedFileHandler(
app.config["SCODOC_LOG_FILE"], encoding="utf-8"
)
file_handler.setFormatter(
logging.Formatter(
@ -123,9 +128,25 @@ def create_app(config_class=DevConfig):
file_handler.setLevel(logging.INFO)
app.logger.addHandler(file_handler)
app.logger.setLevel(logging.INFO)
# app.logger.setLevel(logging.INFO)
app.logger.info(f"{sco_version.SCONAME} {sco_version.SCOVERSION} startup")
app.logger.info(
f"create_app({config_class.__name__}, {config_class.SQLALCHEMY_DATABASE_URI})"
)
# ---- INITIALISATION SPECIFIQUES A SCODOC
from app.scodoc import sco_bulletins_generator
from app.scodoc.sco_bulletins_example import BulletinGeneratorExample
from app.scodoc.sco_bulletins_legacy import BulletinGeneratorLegacy
from app.scodoc.sco_bulletins_standard import BulletinGeneratorStandard
from app.scodoc.sco_bulletins_ucac import BulletinGeneratorUCAC
sco_bulletins_generator.register_bulletin_class(BulletinGeneratorExample)
sco_bulletins_generator.register_bulletin_class(BulletinGeneratorLegacy)
sco_bulletins_generator.register_bulletin_class(BulletinGeneratorStandard)
sco_bulletins_generator.register_bulletin_class(BulletinGeneratorUCAC)
app.logger.info(
f"registered bulletin classes {[ k for k in sco_bulletins_generator.BULLETIN_CLASSES ]}"
)
return app
@ -230,6 +251,41 @@ def clear_scodoc_cache():
sco_preferences.clear_base_preferences()
# --------- Logging
def log(msg: str):
"""log a message.
If Flask app, use configured logger, else stderr."""
try:
dept = getattr(g, "scodoc_dept", "")
msg = f" ({dept}) {msg}"
except RuntimeError:
# Flask Working outside of application context.
pass
if current_app:
current_app.logger.info(msg)
else:
sys.stdout.flush()
sys.stderr.write(
"[%s] scodoc: %s\n" % (time.strftime("%a %b %d %H:%M:%S %Y"), msg)
)
sys.stderr.flush()
# Debug: log call stack
def log_call_stack():
log("Call stack:\n" + "\n".join(x.strip() for x in traceback.format_stack()[:-1]))
# Alarms by email:
def send_scodoc_alarm(subject, txt):
from app.scodoc import sco_preferences
from app import email
sender = sco_preferences.get_preference("email_from_addr")
email.send_email(subject, sender, ["exception@scodoc.org"], txt)
from app.models import Departement
from app.scodoc import notesdb as ndb, sco_preferences
from app.scodoc import sco_cache

View File

@ -487,7 +487,7 @@ class TF(object):
lem.append("<table>")
for i in range(len(labels)):
if input_type == "checkbox":
# from app.scodoc.notes_log import log # debug only
# from app.scodoc.sco_utils import log # debug only
# log('checkbox: values[%s] = "%s"' % (field,repr(values[field]) ))
# log("descr['allowed_values'][%s] = '%s'" % (i, repr(descr['allowed_values'][i])))
if (

View File

@ -59,7 +59,7 @@ from app.scodoc import sco_excel
from app.scodoc import sco_pdf
from app.scodoc import sco_xml
from app.scodoc.sco_pdf import SU
from app.scodoc.notes_log import log
from app import log
def mark_paras(L, tags):

View File

@ -35,7 +35,7 @@ from flask import request
from flask_login import current_user
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc import html_sidebar
import sco_version

View File

@ -1,77 +0,0 @@
# -*- mode: python -*-
# -*- coding: utf-8 -*-
import os
import time
import traceback
from flask import g, current_app
from app import email
"""Simple & stupid file logguer, used only to debug
(logging to SQL is done in scolog)
"""
LOG_FILENAME = "notes.log" # empty to disable logging
DEFAULT_LOG_DIR = (
"/opt/scodoc-data/log" # clients should call set_log_directory to change this
)
ALARM_DESTINATION = "emmanuel@scodoc.org"
class _logguer(object):
def __init__(self):
self.file = None
self.directory = None
self.set_log_directory(DEFAULT_LOG_DIR)
def set_log_directory(self, directory):
if self.directory != directory and self.file:
# changing directory when a log is already open: close it
self.file.close()
self.file = None
self.directory = directory
def _open(self):
if LOG_FILENAME:
path = os.path.join(self.directory, LOG_FILENAME)
self.file = open(path, "a")
self("new _logguer (%s)" % path)
else:
self.file = None # logging disabled
def __call__(self, msg):
if not self.file:
self._open()
if self.file:
try:
dept = getattr(g, "scodoc_dept", "")
except RuntimeError:
# Flask Working outside of application context.
dept = ""
if dept:
dept = " (%s)" % dept
msg = dept + " " + msg
self.file.write("[%s]%s\n" % (time.strftime("%a %b %d %H:%M:%S %Y"), msg))
if current_app:
current_app.logger.info(msg)
self.file.flush()
log = _logguer()
# Alarms by email:
def sendAlarm(subject, txt):
from app.scodoc import sco_preferences
sender = sco_preferences.get_preference("email_from_addr")
email.send_email(subject, sender, [ALARM_DESTINATION], txt)
# Debug: log call stack
def logCallStack():
log("Call stack:\n" + "\n".join(x.strip() for x in traceback.format_stack()[:-1]))

View File

@ -37,7 +37,7 @@ from flask import g, url_for
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_formulas import NoteVector
from app.scodoc.sco_exceptions import (
AccessDenied,

View File

@ -11,7 +11,7 @@ from flask import g, current_app
import app
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_exceptions import ScoException, ScoValueError, NoteProcessError
import datetime

View File

@ -39,7 +39,7 @@ from app.scodoc import pe_tools
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc.gen_tables import GenTable, SeqGenTable
from app.scodoc import sco_preferences
from app.scodoc import sco_etud

View File

@ -36,7 +36,7 @@ Created on Fri Sep 9 09:15:05 2016
@author: barasc
"""
from app.scodoc.notes_log import log
from app import log
from app.scodoc import sco_codes_parcours
from app.scodoc import sco_cache
from app.scodoc import sco_tag_module

View File

@ -43,7 +43,7 @@ import re
import unicodedata
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
import six
PE_DEBUG = 0

View File

@ -36,7 +36,7 @@ import time
import types
from app.scodoc import notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc.scolog import logdb
from app.scodoc.sco_exceptions import ScoValueError, ScoInvalidDateError
from app.scodoc import sco_abs_notification

View File

@ -38,7 +38,7 @@ from flask_mail import Message
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc.scolog import logdb
from app.scodoc import sco_etud
from app.scodoc import sco_formsemestre

View File

@ -46,7 +46,7 @@ from app.scodoc import sco_groups
from app.scodoc import sco_moduleimpl
from app.scodoc import sco_photos
from app.scodoc import sco_preferences
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_exceptions import ScoValueError

View File

@ -44,7 +44,7 @@ Pour chaque étudiant commun:
"""
from app.scodoc.notes_log import log
from app import log
from app.scodoc import sco_apogee_csv
from app.scodoc.gen_tables import GenTable
from app.scodoc.sco_exceptions import ScoValueError

View File

@ -96,7 +96,7 @@ from chardet import detect as chardet_detect
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_exceptions import ScoValueError, FormatError
from app.scodoc.gen_tables import GenTable
from app.scodoc.sco_vdi import ApoEtapeVDI

View File

@ -59,7 +59,7 @@ from flask import g
import app.scodoc.sco_utils as scu
from config import Config
from app.scodoc.notes_log import log
from app import log
from app.scodoc.TrivialFormulator import TrivialFormulator
from app.scodoc.sco_exceptions import (
AccessDenied,
@ -77,9 +77,17 @@ from app.scodoc import sco_pvpdf
class BaseArchiver(object):
def __init__(self, archive_type=""):
self.archive_type = archive_type
self.initialized = False
self.root = None
def initialize(self):
if self.initialized:
return
dirs = [Config.SCODOC_VAR_DIR, "archives"]
if archive_type:
dirs.append(archive_type)
if self.archive_type:
dirs.append(self.archive_type)
self.root = os.path.join(*dirs)
log("initialized archiver, path=" + self.root)
path = dirs[0]
@ -92,12 +100,14 @@ class BaseArchiver(object):
os.mkdir(path)
finally:
scu.GSL.release()
self.initialized = True
def get_obj_dir(self, oid):
"""
:return: path to directory of archives for this object (eg formsemestre_id or etudid).
If directory does not yet exist, create it.
"""
self.initialize()
dept_dir = os.path.join(self.root, g.scodoc_dept)
try:
scu.GSL.acquire()
@ -116,6 +126,7 @@ class BaseArchiver(object):
"""
:return: list of archive oids
"""
self.initialize()
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]
@ -124,6 +135,7 @@ class BaseArchiver(object):
"""Returns
:return: list of archive identifiers for this object (paths to non empty dirs)
"""
self.initialize()
base = self.get_obj_dir(oid) + os.path.sep
dirs = glob.glob(
base
@ -136,6 +148,7 @@ class BaseArchiver(object):
def delete_archive(self, archive_id):
"""Delete (forever) this archive"""
self.initialize()
try:
scu.GSL.acquire()
shutil.rmtree(archive_id, ignore_errors=True)
@ -149,6 +162,7 @@ class BaseArchiver(object):
def list_archive(self, archive_id: str) -> str:
"""Return list of filenames (without path) in archive"""
self.initialize()
try:
scu.GSL.acquire()
files = os.listdir(archive_id)
@ -169,6 +183,7 @@ class BaseArchiver(object):
def get_id_from_name(self, oid, archive_name):
"""returns archive id (check that name is valid)"""
self.initialize()
if not self.is_valid_archive_name(archive_name):
raise ValueError("invalid archive name")
archive_id = os.path.join(self.get_obj_dir(oid), archive_name)
@ -182,6 +197,7 @@ class BaseArchiver(object):
def get_archive_description(self, archive_id):
"""Return description of archive"""
self.initialize()
return open(os.path.join(archive_id, "_description.txt")).read()
def create_obj_archive(self, oid: int, description: str):
@ -205,6 +221,7 @@ class BaseArchiver(object):
Filename may be modified (sanitized): return used filename
The file is created or replaced.
"""
self.initialize()
filename = scu.sanitize_filename(filename)
log("storing %s (%d bytes) in %s" % (filename, len(data), archive_id))
try:
@ -219,6 +236,7 @@ class BaseArchiver(object):
def get(self, archive_id: str, filename: str):
"""Retreive data"""
self.initialize()
if not scu.is_valid_filename(filename):
log('Archiver.get: invalid filename "%s"' % filename)
raise ValueError("invalid filename")
@ -401,7 +419,7 @@ def formsemestre_archive(REQUEST, formsemestre_id, group_ids=[]):
les documents résultant de ce semestre: PV de jury, lettres individuelles,
tableaux récapitulatifs.</p><p class="help">Les documents archivés sont
enregistrés et non modifiables, on peut les retrouver ultérieurement.
</p><p class="help">On peut archiver plusieurs versions des documents
</p><p class="help">On peut archiver plusieurs versions des documents
(avant et après le jury par exemple).
</p>
""",

View File

@ -46,7 +46,7 @@ from flask_mail import Message
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_permissions import Permission
from app.scodoc.sco_exceptions import AccessDenied
from app.scodoc import html_sco_header

View File

@ -67,4 +67,4 @@ class BulletinGeneratorExample(sco_bulletins_standard.BulletinGeneratorStandard)
# Déclarer votre classe à ScoDoc:
sco_bulletins_generator.register_bulletin_class(BulletinGeneratorExample)
# sco_bulletins_generator.register_bulletin_class(BulletinGeneratorExample)

View File

@ -54,7 +54,7 @@ from reportlab.platypus import Table, TableStyle, Image, KeepInFrame
from app.scodoc import sco_utils as scu
from app.scodoc.sco_exceptions import NoteProcessError
from app.scodoc.notes_log import log
from app import log
from app.scodoc import sco_formsemestre
from app.scodoc import sco_pdf
from app.scodoc.sco_pdf import PDFLOCK
@ -65,7 +65,6 @@ BULLETIN_CLASSES = collections.OrderedDict()
def register_bulletin_class(klass):
log("registering bulletin class '%s'" % klass.__name__)
BULLETIN_CLASSES[klass.__name__] = klass

View File

@ -378,7 +378,7 @@ class BulletinGeneratorLegacy(sco_bulletins_generator.BulletinGenerator):
return []
sco_bulletins_generator.register_bulletin_class(BulletinGeneratorLegacy)
# sco_bulletins_generator.register_bulletin_class(BulletinGeneratorLegacy)
class BulTableStyle(object):

View File

@ -61,7 +61,7 @@ from reportlab.platypus.doctemplate import PageTemplate, BaseDocTemplate
from flask import g, url_for
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc import sco_cache
from app.scodoc import sco_formsemestre
from app.scodoc import sco_pdf

View File

@ -673,4 +673,4 @@ class BulletinGeneratorStandard(sco_bulletins_generator.BulletinGenerator):
return nbeval
sco_bulletins_generator.register_bulletin_class(BulletinGeneratorStandard)
# sco_bulletins_generator.register_bulletin_class(BulletinGeneratorStandard)

View File

@ -300,8 +300,4 @@ class BulletinGeneratorUCAC(sco_bulletins_standard.BulletinGeneratorStandard):
return colkeys, P, pdf_style, colWidths
sco_bulletins_generator.register_bulletin_class(BulletinGeneratorUCAC)
def bulletin_table_ucac(I, version=None):
""""""
# sco_bulletins_generator.register_bulletin_class(BulletinGeneratorUCAC)

View File

@ -46,7 +46,7 @@ from xml.etree.ElementTree import Element
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc import sco_abs
from app.scodoc import sco_codes_parcours
from app.scodoc import sco_cache

View File

@ -61,7 +61,7 @@ from flask import g
from app.scodoc import notesdb as ndb
from app.scodoc import sco_utils as scu
from app.scodoc.notes_log import log
from app import log
CACHE = None # set in app.__init__.py

View File

@ -41,7 +41,7 @@ from app.scodoc.sco_utils import (
EVALUATION_SESSION2,
)
from app.scodoc.sco_exceptions import ScoException
from app.scodoc.notes_log import log
from app import log
from app.scodoc import sco_abs
from app.scodoc import sco_edit_module
from app.scodoc import sco_evaluations

View File

@ -6,7 +6,7 @@
import os
import sys
from app.scodoc.notes_log import log
from app import log
from app.scodoc import sco_config
# scodoc_local defines a CONFIG object

View File

@ -33,7 +33,7 @@ from flask import url_for, g
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_exceptions import AccessDenied
from app.scodoc.scolog import logdb
from app.scodoc.gen_tables import GenTable

View File

@ -54,7 +54,7 @@ import requests
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc import html_sco_header
from app.scodoc import sco_preferences
from app.scodoc import sco_users

View File

@ -33,7 +33,7 @@ from flask import g, url_for
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc.TrivialFormulator import TrivialFormulator, tf_error_message
from app.scodoc.sco_exceptions import ScoValueError, ScoLockedFormError

View File

@ -33,7 +33,7 @@ from flask import g, url_for
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc.TrivialFormulator import TrivialFormulator, tf_error_message
from app.scodoc.sco_exceptions import ScoValueError, ScoLockedFormError
from app.scodoc import html_sco_header

View File

@ -33,7 +33,7 @@ from flask import url_for, g
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc.TrivialFormulator import TrivialFormulator
from app.scodoc.sco_permissions import Permission
from app.scodoc.sco_exceptions import ScoValueError, ScoLockedFormError, ScoGenError

View File

@ -34,7 +34,7 @@ from flask_login import current_user
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc.TrivialFormulator import TrivialFormulator, TF
from app.scodoc.gen_tables import GenTable
from app.scodoc.sco_permissions import Permission

View File

@ -39,7 +39,7 @@ import icalendar
import pprint
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc import html_sco_header
from app.scodoc import sco_formsemestre
from app.scodoc import sco_groups

View File

@ -35,7 +35,7 @@ import flask
from flask import url_for, g
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc import html_sco_header
from app.scodoc import notes_table
from app.scodoc import sco_apogee_csv

View File

@ -95,7 +95,7 @@ import json
from flask import url_for, g
from app.scodoc.sco_portal_apogee import get_inscrits_etape
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_utils import annee_scolaire_debut
from app.scodoc.gen_tables import GenTable

View File

@ -45,7 +45,7 @@ from app.scodoc.sco_utils import SCO_ENCODING
import app.scodoc.notesdb as ndb
from app.scodoc.sco_exceptions import ScoGenError, ScoValueError
from app.scodoc.notes_log import log
from app import log
from app.scodoc.TrivialFormulator import TrivialFormulator
from app.scodoc import safehtml
from app.scodoc import sco_preferences

View File

@ -39,7 +39,6 @@ from flask import g
from flask_login import current_user
from flask import request
from app.scodoc.notes_log import log, logCallStack
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.sco_exceptions import AccessDenied, ScoValueError

View File

@ -44,7 +44,7 @@ from openpyxl.comments import Comment
import app.scodoc.sco_utils as scu
from app.scodoc import notesdb
from app.scodoc import sco_preferences
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_exceptions import ScoValueError

View File

@ -31,7 +31,7 @@ from flask import url_for, g
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc import html_sco_header
from app.scodoc import sco_bac
from app.scodoc import sco_codes_parcours

View File

@ -36,7 +36,7 @@ from flask import g, url_for
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc import sco_codes_parcours
from app.scodoc import sco_edit_matiere
from app.scodoc import sco_edit_module

View File

@ -40,7 +40,7 @@ from app.scodoc import sco_formations
from app.scodoc import sco_preferences
from app.scodoc import sco_users
from app.scodoc.gen_tables import GenTable
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_codes_parcours import NO_SEMESTRE_ID
from app.scodoc.sco_vdi import ApoEtapeVDI
import app.scodoc.notesdb as ndb

View File

@ -36,7 +36,7 @@ import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
from app.scodoc import sco_cache
from app.scodoc import sco_groups
from app.scodoc.notes_log import log
from app import log
from app.scodoc.TrivialFormulator import TrivialFormulator, TF
from app.scodoc.sco_exceptions import AccessDenied, ScoValueError
from app.scodoc.sco_permissions import Permission
@ -78,7 +78,7 @@ def formsemestre_createwithmodules(REQUEST=None):
"""<h2>Mise en place d'un semestre de formation</h2>""",
]
r = do_formsemestre_createwithmodules(REQUEST=REQUEST)
if isinstance(r, six.string_types):
if isinstance(r, str):
H.append(r)
else:
return r # response redirect
@ -106,7 +106,7 @@ def formsemestre_editwithmodules(REQUEST, formsemestre_id):
)
else:
r = do_formsemestre_createwithmodules(REQUEST=REQUEST, edit=1)
if isinstance(r, six.string_types):
if isinstance(r, str):
H.append(r)
else:
return r # response redirect

View File

@ -39,7 +39,7 @@ from flask_login import current_user
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.sco_utils import log
from app import log
from app.scodoc.TrivialFormulator import TrivialFormulator, tf_error_message
from app.scodoc import html_sco_header
from app.scodoc import sco_cache

View File

@ -33,7 +33,7 @@ import flask
from flask import url_for, g
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc.scolog import logdb
from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc.sco_permissions import Permission

View File

@ -34,7 +34,7 @@ from flask import request
from flask import url_for
from flask_login import current_user
from app.scodoc.notes_log import log
from app import log
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.sco_permissions import Permission

View File

@ -34,7 +34,7 @@ from flask import url_for, g
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc.scolog import logdb
from app.scodoc.TrivialFormulator import TrivialFormulator, tf_error_message
from app.scodoc.sco_exceptions import ScoValueError

View File

@ -47,7 +47,7 @@ from flask import url_for
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc.scolog import logdb
from app.scodoc import html_sco_header
from app.scodoc import sco_codes_parcours

View File

@ -39,7 +39,7 @@ from flask import g, url_for
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_excel import COLORS
from app.scodoc.sco_formsemestre_inscriptions import (
do_formsemestre_inscription_with_modules,

View File

@ -36,7 +36,7 @@ from email.header import Header
from app import db, Departement
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_exceptions import AccessDenied, ScoValueError, ScoException
from app.scodoc import sco_excel
from app.scodoc import sco_preferences

View File

@ -35,7 +35,7 @@ from flask import url_for, g
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc.gen_tables import GenTable
from app.scodoc import html_sco_header
from app.scodoc import sco_codes_parcours

View File

@ -35,7 +35,7 @@ from flask import url_for, g
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc.TrivialFormulator import TrivialFormulator
from app.scodoc import htmlutils
from app.scodoc import html_sco_header

View File

@ -35,7 +35,7 @@ Elle n'est pas utilisée pour les parcours, ni pour rien d'autre
"""
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
def list_formsemestres_modalites(sems):

View File

@ -34,7 +34,7 @@ import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.sco_permissions import Permission
from app.scodoc.sco_exceptions import ScoValueError, AccessDenied
from app.scodoc.notes_log import log
from app import log
from app.scodoc import scolog
from app.scodoc import sco_formsemestre
from app.scodoc import sco_cache

View File

@ -34,7 +34,7 @@ from flask import url_for, g
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc.scolog import logdb
from app.scodoc import html_sco_header
from app.scodoc import htmlutils

View File

@ -38,7 +38,7 @@ from flask_login import current_user
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc import sco_formsemestre
from app.scodoc import sco_moduleimpl
from app.scodoc import sco_preferences

View File

@ -34,7 +34,7 @@ from flask import url_for, g
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc import html_sco_header
from app.scodoc import htmlutils
from app.scodoc import sco_archives_etud

View File

@ -30,7 +30,7 @@
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc.scolog import logdb
from app.scodoc import sco_cache
from app.scodoc import sco_formsemestre

View File

@ -64,7 +64,7 @@ from app.scodoc.sco_utils import (
SCODOC_LOGOS_DIR,
LOGOS_IMAGES_ALLOWED_TYPES,
)
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_exceptions import ScoGenError
import sco_version

View File

@ -61,7 +61,7 @@ from config import Config
from app.scodoc import sco_etud
from app.scodoc import sco_portal_apogee
from app.scodoc import sco_preferences
from app.scodoc.notes_log import log
from app import log
from app.scodoc.scolog import logdb
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu

View File

@ -39,7 +39,7 @@ import flask
from app.scodoc.sco_exceptions import ScoValueError
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc import html_sco_header
from app.scodoc import sco_edit_module
from app.scodoc import sco_evaluations

View File

@ -36,7 +36,7 @@ import xml.sax.saxutils
import xml.dom.minidom
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc import sco_preferences
import six

View File

@ -115,7 +115,7 @@ from flask import g
from app.models import Departement
from app.scodoc import sco_cache
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_exceptions import ScoValueError, ScoException
from app.scodoc.TrivialFormulator import TrivialFormulator
import app.scodoc.notesdb as ndb

View File

@ -56,7 +56,7 @@ from flask import url_for, g
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc import html_sco_header
from app.scodoc import sco_codes_parcours
from app.scodoc import sco_cache

View File

@ -32,7 +32,7 @@ import datetime
from xml.etree import ElementTree
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc import html_sco_header
from app.scodoc import sco_bac
from app.scodoc import sco_bulletins_json

View File

@ -56,7 +56,7 @@ from app.scodoc import sco_pdf
from app.scodoc import sco_preferences
import sco_version
from app.scodoc.gen_tables import GenTable
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_codes_parcours import code_semestre_validant
from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc.sco_pdf import SU

View File

@ -40,7 +40,7 @@ from flask_login import current_user
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_exceptions import (
AccessDenied,
InvalidNoteValue,

View File

@ -50,7 +50,7 @@ from app.scodoc import sco_formsemestre_status
from app.scodoc import sco_portal_apogee
from app.scodoc import sco_preferences
from app.scodoc.gen_tables import GenTable
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_etape_bilan import EtapeBilan
from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc.sco_vdi import ApoEtapeVDI

View File

@ -46,7 +46,7 @@ from app.scodoc import sco_news
from app.scodoc import sco_excel
from app.scodoc import sco_portal_apogee
from app.scodoc import sco_etud
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_exceptions import ScoValueError
from app.scodoc.sco_permissions import Permission

View File

@ -39,7 +39,7 @@ from flask import g, url_for
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc import sco_cache
from app.scodoc import sco_edit_module
from app.scodoc import sco_etud

View File

@ -46,7 +46,7 @@ from PIL import Image as PILImage
import flask
from flask import url_for, g
from app.scodoc.notes_log import log
from app import log
import app.scodoc.sco_utils as scu
from app.scodoc.TrivialFormulator import TrivialFormulator
from app.scodoc.sco_exceptions import ScoValueError

View File

@ -37,7 +37,7 @@ from reportlab.lib import pagesizes
from reportlab.lib.pagesizes import A4, A3
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc import sco_abs
from app.scodoc import sco_groups
from app.scodoc import sco_groups_view

View File

@ -58,7 +58,7 @@ from flask_login import current_user
import app.scodoc.notesdb as ndb
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc import html_sco_header
from app.scodoc import sco_codes_parcours
from app.scodoc import sco_edit_matiere

View File

@ -32,7 +32,7 @@
import datetime
import app.scodoc.sco_utils as scu
from app.scodoc.notes_log import log
from app import log
# Appel renvoyant la subversion "stable"
# La notion de "stable" est juste là pour éviter d'afficher trop frequemment

View File

@ -45,7 +45,7 @@ from app.scodoc import sco_etud
from app.scodoc import sco_excel
from app.scodoc import sco_preferences
from app.scodoc.gen_tables import GenTable
from app.scodoc.notes_log import log
from app import log
from app.scodoc.scolog import logdb
import app.scodoc.sco_utils as scu

View File

@ -43,13 +43,14 @@ import six
import six.moves._thread
import sys
import time
import traceback
import types
import unicodedata
import six.moves.urllib.parse, six.moves.urllib.error
import six.moves.urllib.error, six.moves.urllib.parse
from xml.etree import ElementTree
STRING_TYPES = six.string_types
from flask import g, current_app
from PIL import Image as PILImage
@ -57,7 +58,6 @@ from flask import g, url_for, request
from config import Config
from app.scodoc.notes_log import log
from app.scodoc.sco_vdi import ApoEtapeVDI
from app.scodoc.sco_xml import quote_xml_attr
from app.scodoc.sco_codes_parcours import NOTES_TOLERANCE, CODES_EXPL
@ -794,7 +794,7 @@ def return_text_if_published(val, REQUEST):
sauf quand elles sont appellées depuis python.
La présence de l'argument REQUEST indique la publication.
"""
if REQUEST and not isinstance(val, STRING_TYPES):
if REQUEST and not isinstance(val, str):
return sendJSON(REQUEST, val)
return val

View File

@ -75,7 +75,7 @@ from app.views import absences_bp as bp
# ---------------
from app.scodoc import sco_utils as scu
from app.scodoc import notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc.scolog import logdb
from app.scodoc.sco_permissions import Permission
from app.scodoc.sco_exceptions import ScoValueError, ScoInvalidDateError

View File

@ -42,7 +42,7 @@ import calendar
# A REVOIR
# from sco_permissions import ScoEntrepriseView, ScoEntrepriseChange
# from app.scodoc.notes_log import log
# from app import log
# from scolog import logdb
# from sco_utils import SCO_ENCODING
# import app.scodoc.sco_utils as scu

View File

@ -60,7 +60,7 @@ from app.views import notes_bp as bp
from app.scodoc import sco_utils as scu
from app.scodoc import notesdb as ndb
from app.scodoc.notes_log import log, sendAlarm
from app import log, send_scodoc_alarm
from app.scodoc import scolog
from app.scodoc.scolog import logdb
@ -2514,7 +2514,7 @@ def check_formsemestre_integrity(formsemestre_id, REQUEST=None):
)
)
if diag:
sendAlarm(
send_scodoc_alarm(
"Notes: formation incoherente dans semestre %s !" % formsemestre_id,
"\n".join(diag),
)

View File

@ -62,3 +62,19 @@ def index():
def table_etud_in_accessible_depts():
"""recherche étudiants sur plusieurs départements"""
return sco_find_etud.table_etud_in_accessible_depts(expnom=request.form["expnom"])
# essais
@bp.route("/testlog")
def testlog():
import time
from flask import current_app
from app import log
log(f"testlog called: handlers={current_app.logger.handlers}")
current_app.logger.debug(f"testlog message DEBUG")
current_app.logger.info(f"testlog message INFO")
current_app.logger.warning(f"testlog message WARNING")
current_app.logger.error(f"testlog message ERROR")
current_app.logger.critical(f"testlog message CRITICAL")
return "testlog completed at " + str(time.time())

View File

@ -57,7 +57,7 @@ from app.views import scolar_bp as bp
import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb
from app.scodoc.notes_log import log
from app import log
from app.scodoc.scolog import logdb
from app.scodoc.sco_permissions import Permission
from app.scodoc.sco_exceptions import (
@ -119,9 +119,6 @@ def sco_publish(route, function, permission, methods=["GET"]):
)
log.set_log_directory(Config.SCODOC_VAR_DIR + "/log")
log("ScoDoc restarting...")
# --------------------------------------------------------------------
#
# SCOLARITE (/ScoDoc/<dept>/Scolarite/...)

View File

@ -61,7 +61,7 @@ from app.scodoc import html_sco_header, sco_import_users, sco_excel
from app.scodoc import sco_users
from app.scodoc import sco_utils as scu
from app.scodoc import sco_xml
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_exceptions import AccessDenied, ScoValueError
from app.scodoc.sco_permissions_check import can_handle_passwd
from app.scodoc.TrivialFormulator import TrivialFormulator, tf_error_message

View File

@ -29,7 +29,7 @@ class Config:
BOOTSTRAP_SERVE_LOCAL = os.environ.get("BOOTSTRAP_SERVE_LOCAL")
SCODOC_DIR = os.environ.get("SCODOC_DIR", "/opt/scodoc")
SCODOC_VAR_DIR = os.environ.get("SCODOC_VAR_DIR", "/opt/scodoc-data")
SCODOC_LOG_FILE = os.path.join(SCODOC_VAR_DIR, "log", "scodoc.log")
# For legacy ScoDoc7 installs: postgresql user
SCODOC7_SQL_USER = os.environ.get("SCODOC7_SQL_USER", "www-data")
DEFAULT_SQL_PORT = os.environ.get("DEFAULT_SQL_PORT", "5432")

View File

@ -34,7 +34,7 @@ from app.scodoc import sco_moduleimpl
from app.scodoc import sco_saisie_notes
from app.scodoc import sco_synchro_etuds
from app.scodoc import sco_utils as scu
from app.scodoc.notes_log import log
from app import log
from app.scodoc.sco_exceptions import ScoValueError
random.seed(12345) # tests reproductibles

View File

@ -103,6 +103,10 @@ then
su -c "(cd $SCODOC_DIR && source venv/bin/activate && flask db upgrade)" "$SCODOC_USER"
fi
# ------------ LOGROTATE
cp "$SCODOC_DIR"/tools/etc/scodoc-logrotate /etc/logrotate.d/scodoc
chmod 644 /etc/logrotate.d/scodoc
# ------------ CONFIG SERVICE SCODOC
echo
echo "Installation du service systemd scodoc9..."

View File

@ -0,0 +1,9 @@
/opt/scodoc-datalog/scodoc.log {
weekly
missingok
rotate 64
compress
notifempty
dateext
create 0644 scodoc scodoc
}