382 lines
14 KiB
Python
382 lines
14 KiB
Python
# -*- coding: utf8 -*-
|
|
import json
|
|
from sqlalchemy import text
|
|
from sqlalchemy.ext.declarative import declarative_base
|
|
from sqlalchemy.orm import (
|
|
scoped_session,
|
|
sessionmaker,
|
|
)
|
|
|
|
from zope.sqlalchemy import ZopeTransactionExtension, mark_changed
|
|
import transaction
|
|
from datetime import *
|
|
|
|
|
|
def execute_query(request, query, params):
|
|
"""Execute query and mark session as changed"""
|
|
request.dbsession.execute(query, params)
|
|
mark_changed(request.dbsession)
|
|
transaction.commit()
|
|
|
|
def get_agences(request, code):
|
|
if code == 0:
|
|
query = "SELECT * FROM p_agences ORDER BY CODE;"
|
|
results = request.dbsession.execute(query)
|
|
return results.fetchall()
|
|
else:
|
|
query = "SELECT * FROM p_agences WHERE code = :code;"
|
|
results = request.dbsession.execute(query, {'code': code})
|
|
return results.first()
|
|
|
|
def get_date_examen(request, logged_in):
|
|
# lire la date examen de l'eleve
|
|
query = "call spGet_EXAMENS_AFF_PREVU(:logged_in)"
|
|
results = request.dbsession.execute(query, {'logged_in': logged_in}).first()
|
|
return results
|
|
|
|
|
|
def get_dates_fin_validite(request, logged_in):
|
|
query = """SELECT
|
|
DATE_FORMAT(fin_forfait_code_le,'%d-%m-%Y') AS date_fin_code,
|
|
DATE_FORMAT(visite_med_fin_le,'%d-%m-%Y') AS date_fin_vm
|
|
FROM eleves WHERE cd_cli=:logged_in;"""
|
|
results = request.dbsession.execute(query, {'logged_in': logged_in}).fetchall()
|
|
return results
|
|
|
|
|
|
def get_eleve_agence(request, logged_in):
|
|
# lire l'adresse email de l'agence de l'eleve
|
|
query = "SELECT a.* FROM p_agences a INNER JOIN eleves e ON e.agence = a.code WHERE e.cd_cli=:logged_in"
|
|
results = request.dbsession.execute(query, {'logged_in': logged_in}).first()
|
|
return results
|
|
|
|
|
|
def get_eleve_stage(request, logged_in):
|
|
# lire les donnees de l'eleve
|
|
query = "call spGet_ELEVES_INFOS(:logged_in)"
|
|
results = request.dbsession.execute(query, {'logged_in': logged_in}).fetchall()
|
|
return results
|
|
|
|
|
|
def get_eleve_info(request, userid):
|
|
query = "select nompren, email, permis_demande, formule from eleves where cd_cli=:userid"
|
|
result = request.dbsession.execute(query, {'userid': userid}).first()
|
|
return {'fullname': result[0],
|
|
'email': result[1],
|
|
'permis': result[2],
|
|
'formule': result[3]
|
|
}
|
|
|
|
|
|
def get_eleves_by_code(request, login):
|
|
# lire l'eleve connecte
|
|
query = """SELECT e.* FROM eleves e INNER JOIN permis p ON e.permis_demande = p.cat
|
|
WHERE cd_cli=:login """
|
|
results = request.dbsession.execute(query, {'login': login}).first()
|
|
return results
|
|
|
|
|
|
def get_eleve_justifs(request, cd_cli):
|
|
# lire tous les justifs téléchargés ou non
|
|
query = """SELECT * FROM eleves_upload
|
|
WHERE cd_cli = :cd_cli and type='JUST' ORDER BY no_tri;"""
|
|
results = request.dbsession.execute(query, {'cd_cli': cd_cli}).fetchall()
|
|
return results
|
|
|
|
|
|
def get_eleves_by_date_nais(request, login, date_nais):
|
|
# lire l'eleve connecte
|
|
query = """SELECT e.* FROM eleves e INNER JOIN permis p ON e.permis_demande = p.cat
|
|
WHERE cd_cli=:login AND DATE_NAIS = STR_TO_DATE(:date_nais, '%d/%m/%Y');"""
|
|
results = request.dbsession.execute(query, {'login': login, 'date_nais': date_nais}).first()
|
|
return results
|
|
|
|
|
|
def get_eleves_by_name_date_nais(request, name, forname, date_nais):
|
|
# lire l'eleve connecte
|
|
nomprenom = "%s %s" % (name, forname)
|
|
query = """SELECT e.* FROM eleves e INNER JOIN permis p ON e.permis_demande = p.cat
|
|
WHERE NOMPREN=:nomprenom AND DATE_NAIS = STR_TO_DATE(:date_nais, '%d/%m/%Y');"""
|
|
results = request.dbsession.execute(query, {'nomprenom': nomprenom, 'date_nais': date_nais}).first()
|
|
return results
|
|
|
|
|
|
def get_horaires_dispo(request, agence, date_debut):
|
|
query = """
|
|
SELECT c.date, c.noplan, c.qte, m.nom, c.intitule, to_SEMAINE(DATE_FORMAT(c.date, '%a %d %b')) AS DATE_CLAIR, TIME_FORMAT(SEC_TO_TIME(c.noplan * 3600), '%Hh%i') AS HEURE_CLAIR
|
|
FROM eleves_cpt c
|
|
LEFT JOIN moniteurs m ON c.cd_mon = m.cd_mon
|
|
WHERE c.agence = :agence AND c.date = :date_debut AND cd_cli > 1 AND cd_cli < 100000 AND c.noplan > 0 ORDER BY noplan;
|
|
"""
|
|
results = request.dbsession.execute(query, {'agence': agence, 'date_debut': date_debut}).fetchall()
|
|
return results
|
|
|
|
|
|
def update_last_connection(request, login, ua_string):
|
|
"""Update last connection for login """
|
|
query = "UPDATE eleves SET dern_cnx_le=NOW(), device_used=:ua_string, mdp_oublie = NULL, mdp_oublie_date = NULL WHERE cd_cli=:login;"
|
|
execute_query(request, query, {'login': login, 'ua_string': ua_string})
|
|
|
|
|
|
def update_details(request, login, new_values):
|
|
s = ''
|
|
for param in new_values.keys():
|
|
if s:
|
|
s += ",%s=:%s" % (param, param)
|
|
else:
|
|
s = "%s=:%s" % (param, param)
|
|
new_values['login'] = login
|
|
query = "UPDATE eleves SET %s WHERE CD_CLI=:login" % s
|
|
execute_query(request, query, new_values)
|
|
|
|
|
|
def update_password(request, login, password):
|
|
"""Update password for member login"""
|
|
query = "UPDATE eleves SET mdp_hash=SHA1(:password), mdp_oublie=NULL, mdp_oublie_date=NULL WHERE CD_CLI=:login"
|
|
execute_query(request, query, {'login': login, 'password': password})
|
|
|
|
|
|
def is_lien_mdp_oublie(request, lien):
|
|
query = "SELECT mdp_oublie FROM eleves WHERE mdp_oublie=:lien;"
|
|
results = request.dbsession.execute(query, {'lien': lien}).fetchall()
|
|
return len(results) > 0
|
|
|
|
|
|
def get_mdp_oublie_infos(request, lien):
|
|
query = "SELECT * FROM eleves WHERE mdp_oublie=:lien;"
|
|
results = request.dbsession.execute(query, {"lien": lien}).first()
|
|
return results
|
|
|
|
|
|
def update_membre_mdp_oublie(request, cd_cli):
|
|
import uuid, base64
|
|
|
|
# get a UUID - URL safe, Base64
|
|
uid = uuid.uuid1()
|
|
urlslug = base64.urlsafe_b64encode(uid.bytes).decode("utf-8").rstrip('=\n').replace('/', '_')
|
|
query = "UPDATE eleves SET mdp_oublie=:urlslug, mdp_oublie_date=now() WHERE cd_cli=:cd_cli;"
|
|
execute_query(request, query, {'urlslug': urlslug, 'cd_cli': cd_cli})
|
|
return urlslug
|
|
|
|
|
|
def to_int(x):
|
|
try:
|
|
number = int(x.replace(',', '.'))
|
|
return number
|
|
except ValueError:
|
|
return 0
|
|
|
|
|
|
def get_faqs(request, faq_id):
|
|
"""Lire les FAQ"""
|
|
if faq_id == 0:
|
|
query = "SELECT * FROM p_faq ORDER BY theme, intitule;"
|
|
results = request.dbsession.execute(query).fetchall()
|
|
elif faq_id == -1:
|
|
query = "SELECT * FROM p_faq where theme != 'INTERNE' ORDER BY theme, intitule;"
|
|
results = request.dbsession.execute(query).fetchall()
|
|
else:
|
|
query = "SELECT * FROM p_faq where faq_id = :faq_id;"
|
|
results = request.dbsession.execute(query, {'faq_id': faq_id}).first()
|
|
return results
|
|
|
|
|
|
def get_eleves_by_name(request, name):
|
|
if to_int(name) > 0:
|
|
# lire l'eleve par son code
|
|
query = """SELECT e.nompren, e.cd_cli, e.permis_demande, e.formule, e.cree_le, e.statut
|
|
FROM eleves e INNER JOIN permis p ON e.permis_demande = p.cat
|
|
WHERE e.cd_cli=:name ;"""
|
|
else:
|
|
# lire l'eleve par son nom
|
|
query = """SELECT e.nompren, e.cd_cli, e.permis_demande, e.formule, e.cree_le, e.statut
|
|
FROM eleves e INNER JOIN permis p ON e.permis_demande = p.cat
|
|
WHERE e.nom like :name ORDER BY e.nompren;"""
|
|
results = request.dbsession.execute(query, {'name': name + "%"}).fetchall()
|
|
return results
|
|
|
|
|
|
def get_departements(request, libelle):
|
|
""" Lire toutes les départements """
|
|
query = "SELECT * FROM p_departements WHERE libelle like :name order by libelle;"
|
|
results = request.dbsession.execute(query, {'name': libelle + "%"}).fetchall()
|
|
return results
|
|
|
|
|
|
def get_codespostaux(request, code):
|
|
query = "SELECT * FROM p_codespostaux WHERE code_postal like :code;"
|
|
results = request.dbsession.execute(query, {'code': code + "%"})
|
|
return results.fetchall()
|
|
|
|
|
|
def get_messageConformation(request, ref):
|
|
""" Lire le tarif seleon la référence """
|
|
query = "select confirmation_md from tarifs where ref = :ref;"
|
|
results = request.dbsession.execute(query, {'ref': ref}).first()
|
|
if results:
|
|
return results.confirmation_md
|
|
else:
|
|
return "<blockquote>Rappel de rendez-vous " + ref + "</blockquote>"
|
|
|
|
|
|
def get_eleve_docs(request, cd_cli, type):
|
|
# lire les docs téléchargés du client
|
|
query = """SELECT *, j.libelle FROM eleves_upload e INNER JOIN p_justifs j ON e.code = j.code
|
|
WHERE e.cd_cli = :cd_cli AND e.type = :type AND (LENGTH(e.nom_fic) > 0 OR e.libelle_fic IS NOT NULL) ORDER BY j.libelle;"""
|
|
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'type': type}).fetchall()
|
|
return results
|
|
|
|
|
|
def get_eleve_justifs_byligne(request, no_ligne):
|
|
# Lire le justif dans élève
|
|
query = """SELECT p.*, j.LIBELLE, j.conditions FROM eleves_upload p
|
|
INNER JOIN p_justifs j ON j.code = p.code
|
|
WHERE p.no_ligne = :no_ligne;"""
|
|
results = request.dbsession.execute(query, {'no_ligne': no_ligne}).first()
|
|
|
|
return results
|
|
|
|
|
|
def get_eleve_justifs_manquant(request, cd_cli):
|
|
# Lire les justifs manquant dans élève
|
|
query = """SELECT e.* ,j.libelle, j.conditions FROM eleves_upload e, p_justifs j
|
|
WHERE e.cd_cli = :cd_cli and e.code=j.code AND e.type='JUST' AND LENGTH(e.nom_fic)=0 AND e.libelle_fic IS NULL ORDER BY e.no_tri;"""
|
|
results = request.dbsession.execute(query, {'cd_cli': cd_cli}).fetchall()
|
|
|
|
return results
|
|
|
|
|
|
def update_eleve_justif(request, no_ligne, new_values):
|
|
# mettre à jour justifs de l'élève
|
|
s = ''
|
|
for param in new_values.keys():
|
|
if s:
|
|
s += ",%s=:%s" % (param, param)
|
|
else:
|
|
s = "%s=:%s" % (param, param)
|
|
new_values['no_ligne'] = no_ligne
|
|
query = "UPDATE eleves_upload SET %s WHERE no_ligne=:no_ligne" % s
|
|
execute_query(request, query, new_values)
|
|
|
|
|
|
def delete_eleve_justif(request, no_ligne):
|
|
query = "DELETE FROM eleves_upload WHERE no_ligne = :no_ligne ;"
|
|
execute_query(request, query, {'no_ligne': no_ligne})
|
|
|
|
|
|
def init_eleve_justifs(request, cd_cli):
|
|
# la liste des justifs de l'élève est-elle remplie ?
|
|
justifs = get_eleve_justifs(request, cd_cli)
|
|
if not justifs:
|
|
# non, lire la fiche de l'élève
|
|
eleve = get_eleves_by_code(request, cd_cli)
|
|
# et créer les justifs à partir du permis demandé
|
|
query = """INSERT INTO eleves_upload (cd_cli, code, type)
|
|
SELECT :cd_cli, code, 'JUST' FROM permis_justifs WHERE cat=:permis_demande;"""
|
|
execute_query(request, query, {'cd_cli': cd_cli, 'permis_demande': eleve.PERMIS_DEMANDE})
|
|
|
|
|
|
def get_stages_by_type(request, stage_type,stage_debut,day_diff):
|
|
|
|
condition = """;"""
|
|
|
|
if day_diff < 15 :
|
|
condition = """ and debut <= :stage_debut ;"""
|
|
|
|
if stage_type == 'POINT':
|
|
""" Lire tous les stage PAP dispo a partir de damain """
|
|
query = """
|
|
SELECT
|
|
concat(type,semaine,groupe) as stage_id,
|
|
type,
|
|
semaine,
|
|
groupe,
|
|
debut, fin,
|
|
dispo,
|
|
CASE
|
|
WHEN groupe = 'A' THEN 'CHARPENNES'
|
|
ELSE 'VAUGNERAY'
|
|
END as lieu,
|
|
total
|
|
FROM pla_stage where type='C' and dispo > 0 and debut > DATE_FORMAT(NOW() ,'%Y-%m-%d') """ + condition
|
|
|
|
results = request.dbsession.execute(query,{"stage_debut":stage_debut}).fetchall()
|
|
|
|
elif stage_type == 'PEM125':
|
|
""" Lire tous les stage PEM dispo a partir de damain """
|
|
query = """
|
|
SELECT
|
|
concat(type,semaine,groupe) as stage_id,
|
|
debut, fin,dispo,
|
|
'VAUGNERAY' as lieu,
|
|
total
|
|
FROM pla_stage where type='M' and dispo > 0 and debut > DATE_FORMAT(NOW() ,'%Y-%m-%d') and libelle like 'pem%' """ + condition
|
|
results = request.dbsession.execute(query,{"stage_debut":stage_debut}).fetchall()
|
|
|
|
elif stage_type == 'PASSERELLE':
|
|
""" Lire tous les stage PAS A2 dispo a partir de damain """
|
|
query = """
|
|
SELECT
|
|
concat(type,semaine,groupe) as stage_id,
|
|
debut, fin,
|
|
'RD 30 - LES AIGUILLONS ou 69670 VAUGNERAY' as lieu,dispo,
|
|
total
|
|
FROM pla_stage where type='M' and dispo > 0 and debut > DATE_FORMAT(NOW() ,'%Y-%m-%d') and libelle like 'pas%' """ + condition
|
|
results = request.dbsession.execute(query,{"stage_debut":stage_debut}).fetchall()
|
|
elif stage_type == 'B96':
|
|
""" Lire tous les stage B96 dispo a partir de demain """
|
|
query = """
|
|
SELECT
|
|
concat(type,semaine,groupe) as stage_id,
|
|
debut, fin,
|
|
'RD 30 - LES AIGUILLONS ou 69670 VAUGNERAY' as lieu,
|
|
dispo,
|
|
total
|
|
FROM pla_stage where type='B' and dispo > 0 and debut > DATE_FORMAT(NOW() ,'%Y-%m-%d') and groupe ='G' """ + condition
|
|
results = request.dbsession.execute(query,{"stage_debut":stage_debut}).fetchall()
|
|
else:
|
|
results = list()
|
|
return results
|
|
|
|
def get_stage_by_id(request, stage_id):
|
|
""" Lire le stage demandé """
|
|
type = stage_id[0:1]
|
|
semaine = stage_id[1:7]
|
|
groupe = stage_id[7:8]
|
|
query = """
|
|
SELECT
|
|
concat(type,semaine,groupe) as stage_id,
|
|
debut, fin,
|
|
getLieu_PAP(groupe, 2) as lieu1,
|
|
getLieu_PAP(groupe, 3) as lieu2,
|
|
dispo,
|
|
total
|
|
FROM pla_stage where type=:type and semaine=:semaine and groupe=:groupe;"""
|
|
results = request.dbsession.execute(query, {'type': type, 'semaine': semaine, 'groupe': groupe}).first()
|
|
return results
|
|
|
|
def get_stage_ligne_by_cd_cli(request,cd_cli,groupe):
|
|
query = """SELECT * FROM pla_stage_lignes where cd_cli=:cd_cli and groupe=:groupe"""
|
|
results = request.dbsession.execute(query, {'cd_cli': cd_cli, 'groupe': groupe}).first()
|
|
return results
|
|
|
|
|
|
def ins_stage_eleve(request, ref, stage_id, cd_cli, nom, prenom):
|
|
# inscrire un élève dans un stage PAP
|
|
type = stage_id[0:1]
|
|
semaine = stage_id[1:7]
|
|
groupe = stage_id[7:8]
|
|
|
|
# controler inscription en double ?
|
|
query = """SELECT s.debut FROM pla_stage_lignes l
|
|
INNER JOIN pla_stage s on s.type = l.type AND s.semaine = l.semaine AND s.groupe = l.groupe
|
|
WHERE l.type=:type AND l.cd_cli=:cd_cli and l.VALIDE ='N'"""
|
|
results = request.dbsession.execute(query, {'type': type, 'cd_cli': cd_cli}).first()
|
|
if results:
|
|
return results.debut
|
|
else:
|
|
# insérer l'élève dans le stage
|
|
query = """CALL spUpd_PLA_STAGE_LIG(:type, :semaine, :groupe, 0, :cd_cli, :nompren, '', :ref, 0, 6, 1, 0, 'WEB')"""
|
|
execute_query(request, query, {'type': type, 'semaine': semaine, 'groupe': groupe, 'cd_cli': cd_cli, 'nompren': nom + ' ' + prenom, 'ref': ref})
|
|
return None
|