# -*- coding: utf8 -*- from pyramid.view import ( view_config, ) from pyramid.httpexceptions import ( HTTPFound, ) from datetime import datetime, timedelta import json from ..models.planning import * from ..models.default import ( get_users_by_code, get_user_access, get_user_cd_mon, get_user_cd_mon_B78, isDelaiOK, get_formules, get_formule, get_moniteur_by_code, delete_stage_lig_by_cd_cli, delete_moto_lig_by_cd_cli, update_panning_moto_dispo, get_moniteur_aff, get_moniteur_aff_by_agence ) from ..models.eleves import ( get_eleves_by_code, get_moniteurs_by_code, update_eleve_delettrer, ) from ..views.default import ( to_age, to_date, to_euro, to_euroN, to_euroz, to_time, to_int, to_percent, to_sha1, to_str, ) from datetime import timedelta, date as ddate from jours_feries_france.compute import JoursFeries def ctlEleve_PLB(request, cd_cli): # Lire la fiche Elève eleve = get_eleves_by_code(request, cd_cli) if eleve is None or len(eleve) == 0: message = "Elève %s non trouvé !" % cd_cli return message # est-ce une activité ? oui, fin des controles if eleve.AGENCE == 0 : return '' if eleve.CLOTURE_LE : message = "Le DOSSIER de cet élève est CLOTURE ou RETIRE ou en LITIGE !" return message if eleve.ELEVEGARDE02 : message = "Le DOSSIER est gardé par l'élève !" return message # controler la date de validité de la visite medicale if eleve.visite_med_fin_le : today = date.today() diff = eleve.visite_med_fin_le - today nbJours = diff.days if nbJours < 0 : message = "Attention! La date de visite médicale de l'élève est exprirée." return message #elif nbJours < 90 : # message = "Attention! La date de visite médicale de l'élève expirera dans %s jours." % nbJours # return message # controles spécifiques if eleve.PERMIS_DEMANDE != "B" and eleve.PERMIS_DEMANDE != "B78" : message = "La catégorie de permis demandée n'est pas compatible avec ce planning !" return message return '' @view_config(route_name='monplanning', renderer='../templates/planning/monplanning.pt', permission='view') def monplanning(request): def generer_planning(agence, cd_mon, datedeb, datefin,edit='rdvb_edit'): # construire la liste des rdv du moniteurs rows = get_rendez_vous_moniteur(request, agence, cd_mon, datedeb, datefin) events = [] for row in rows: if row.comment == None: comment = '' else: comment = row.comment if row.NOM_ENTREPRISE : etoile = ' (E)' else: etoile = '' nom = row.nom + etoile # déterminer la couleur de l'event if row.date_valeur : color = 'LightGreen' # rdv validé = vert pale else: if to_int(row.ref) != row.cd_cli : if row.statut > 1 : color = 'DeepPink' # rdv élève décommandé if row.statut == 10 or row.statut == 15 : color = 'LightGray' # moniteur absent elif row.fin_reservation : color = 'LightPink' # résa = LightPink else: color = 'LightYellow' # rdv élève = jaune pale if row.circuit == 1: color = 'Gold' # gold elif row.circuit == 2: color = 'Plum' # Plum elif row.circuit == 3: color = 'YellowGreen' # YellowGreen elif row.circuit == 4: color = 'DeepSkyBlue' # DeepSkyBlue elif row.circuit == 5: color = 'LimeGreen' # LimeGreen elif row.circuit == 6: color = 'GoldenRod' # Marron else: if row.cd_cli == 99995 : color = 'White' # résa web = couleur blanc) elif row.cd_cli == 1 : color = 'Gainsboro' # /////// else: color = 'LightBlue' # activité if row.statut == 10 or row.statut == 15 : color = 'LightGray' # moniteur absent json_event = { 'title': nom, 'start': '%s %02d:00:00' % (row.DATE.strftime('%Y-%m-%d'), row.noplan), 'end': '%s %02d:00:00' % (row.DATE.strftime('%Y-%m-%d'), row.noplan + row.qte), 'description': comment, 'allDay': False, 'color': color, 'textColor': '#000000', 'url': '/'+edit+'/%s' % (row.no_ligne), } events.append(json_event) # construire la liste des rdv annulés du moniteurs rows = get_rendez_vous_annules(request, agence, cd_mon, datedeb, datefin) for row in rows: if row.NOM_ENTREPRISE : etoile += ' (E)' else: etoile = '' nom = row.nom + etoile json_event = { 'title': nom, 'start': row.DATE.strftime('%Y-%m-%d'), 'end': row.DATE.strftime('%Y-%m-%d'), 'description': '%s par %s' % (row.intitule.replace(' (0)', ''), row.cd_uti), 'allDay': True, 'color': 'White', 'textColor': 'Black', 'url': '/'+edit+'/%s' % (row.no_ligne), } events.append(json_event) return json.dumps(events) # récupérer les paramètres de l'appel de la view datePlan = request.matchdict['date'] cd_mon = request.matchdict['cd_mon'] logged_in = request.authenticated_userid isSeulB78 = False url = request.current_route_path() if cd_mon == 'codeMon': cd_mon,cd_mon_B78 = get_user_cd_mon(request, logged_in) else : moni = get_moniteurs_by_code(request,cd_mon) if moni and moni['PLANNING'] == "B78" : cd_mon_B78 = moni['CD_MON'] isSeulB78 = True else: cd_mon_B78 = get_user_cd_mon_B78(request, logged_in) isSeulB78 = False url = request.route_url('monplanning', cd_mon='codeMon', date='today') if datePlan == 'today': datePlan = date.today().strftime('%Y-%m-%d') # si cd_mon a été changé par le user if 'cd_mon' in request.params: cd_mon = request.params["cd_mon"] moni = get_moniteurs_by_code(request,cd_mon) if moni and moni['PLANNING'] == "B78" : cd_mon_B78 = moni['CD_MON'] isSeulB78 = True else: isSeulB78 = False url_select = request.route_url('eleve_select', cd_mon=cd_mon, date=datePlan) member = get_users_by_code(request, logged_in) if not member: request.session.flash(u"Moniteur %s introuvable" % (logged_in), 'danger') return HTTPFound(location=request.route_url("home")) agence = member.agence QTE = 1 message = '' # -- CREER un rendez-vous if 'form.submitted' in request.params: name = request.params['name'].split(' | ') cd_cli = int(name[1]) QTE = int(request.params['QTE']) dateRDV = request.params['dateRDV'] heureRDV = request.params['heureRDV'] isB78 = 'cd_mon_B78' in request.params # controle date exportation isAffected, lastdate = controlAffectationEtAgece(request,cd_mon,dateRDV,heureRDV,agence) if controleDateExport(request, dateRDV, agence) == False: message = "Cette journée est déjà comptabilisée ! Création impossible." elif not isAffected: if lastdate : message = "La dernier affectation de ce moniteur pour l'agence "+str(agence)+ " était le " + lastdate['DATEF'].strftime('%d/%m/%Y')+ " à "+str(lastdate['DMATIN'])+"h jusqu'à "+str(lastdate['FMATIN'])+"h le matin et " +str(lastdate['DSOIR'])+"h jusqu'à "+str(lastdate['FSOIR'])+"h l'apres midi.!!" else : message = "Ce moniteur n'a aucune affectation dans cet agence pour la date de {0} à {1}h!!".format(dateRDV,heureRDV) else: if cd_cli < 100000: ref = str(cd_cli) else: if isB78 : ref = "HCB78" else: ref = "HCB" # controles sur l'élève message = ctlEleve_PLB(request, cd_cli) if len(message) == 0: nDelai = controleSoldeResa(request, cd_cli, ref) # plafond dépassé ? if nDelai == -1: request.session.flash(u"L'encours de l'élève a dépassé son plafond autorisé. Impossible de lui ajouter une heure.", 'danger') return HTTPFound(location=request.route_url("monplanning", cd_mon=cd_mon, date=dateRDV)) else: if isB78 : update_rdvb(request, 0, 0, cd_cli, dateRDV, heureRDV, QTE, ref, cd_mon_B78, agence, '', 0, 0, nDelai, 0, logged_in) else : update_rdvb(request, 0, 0, cd_cli, dateRDV, heureRDV, QTE, ref, cd_mon, agence, '', 0, 0, nDelai, 0, logged_in) if nDelai == 0: request.session.flash(u"Le rendez-vous a été CREE avec succès.", 'success') else: request.session.flash(u"Le rendez-vous a été RESERVE avec succès.", 'warning') return HTTPFound(location=request.route_url("monplanning", cd_mon=cd_mon, date=dateRDV)) TODAY = date.today() # début = aujourd'hui - 3 semaines d = TODAY + relativedelta(weeks=-3) datedeb = d.strftime('%Y-%m-%d') # fin = aujourd'hui + 6 mois d = TODAY + relativedelta(months=+6) datefin = d.strftime('%Y-%m-%d') # lire les moniteurs moniteurs = get_moniteurs_by_aff(request, agence, datedeb, datefin) #sort moniteur , mettre B78 à la fin moniteurs.sort(key=lambda m: str(m.PLANNING) == "B", reverse=True) moniteursB = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "B"] moniteursB78 = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "B78"] moniteurs2R = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "2R"] moniteursGL = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "GL"] moniteurs = [moniteursB,moniteurs2R,moniteursGL,moniteursB78] # generer le planning B calendar_events = generer_planning(agence, cd_mon, datedeb, datefin) # generer le planning B78 calendar_events_b78 = generer_planning(agence, cd_mon_B78, datedeb, datefin,'rdvb78_edit') return { 'page_title': "Planning de %s (agence %s)" % (cd_mon, agence) if not isSeulB78 else "Planning B78 de %s (agence %s)" % (cd_mon, agence), 'url': url, 'url_select': url_select, 'datePlan': datePlan, 'message': message, 'calendar_events': calendar_events, 'calendar_events_b78': calendar_events_b78, 'moniteurs': moniteurs, 'cd_mon': cd_mon, 'cd_mon_B78':cd_mon_B78, 'isSeulB78': isSeulB78, 'agence' : agence, 'QTE': QTE, } @view_config(route_name='planningb', renderer='../templates/planning/planningb.pt', permission='view') def planningb(request): def generer_ressources(moniteurs): # construire la liste des ressources # {"id":"a","title":"Auditorium A"} ressources = [] for row in moniteurs: name = ' (B78)' if row.PLANNING == "B78" else '' json_ressources = { 'id': row.CD_MON, 'planning': row.PLANNING, 'title': row.NOM + name, } ressources.append(json_ressources) ressources.sort(key=lambda r: r['planning'] == 'B78') return json.dumps(ressources, indent=4, sort_keys=True, default=str) def generer_planning(agence, moniteurs, datedeb, datefin, current_date=date.today()): # construire la liste des events events = [] delta = timedelta(days=1) first = current_date - timedelta(days=7) last = current_date + timedelta(days=30) for item in moniteurs: cd_mon = item.CD_MON rows = get_rendez_vous_moniteur(request, agence, cd_mon, datedeb, datefin) affectations = get_moniteur_aff_by_agence(request, cd_mon, agence) for affectation in affectations: disabled_days = [i if affectation['REPOS' + str(i)] != 0 else None for i in range(1, 7)] start_date = affectation.DATED end_date = affectation.DATEF if end_date < first or start_date > last: continue count = 0 diffday = (current_date - start_date) if diffday.days > 7 and diffday > timedelta(0): start_date = first while start_date <= end_date: weekday = start_date.weekday() + 1 feries = JoursFeries.for_year(start_date.year).values() if first <= start_date <= last and weekday != 7 and weekday not in disabled_days and start_date not in feries: morning_event = { 'resourceId': cd_mon, 'title': '', 'start': '%s %02d:00:00' % (start_date.strftime('%Y-%m-%d'), affectation.DMATIN), 'end': '%s %02d:00:00' % (start_date.strftime('%Y-%m-%d'), affectation.FMATIN), 'color': '#ffffff', 'rendering': 'background', } events.append(morning_event) afternoon_event = { 'resourceId': cd_mon, 'title': '', 'start': '%s %02d:00:00' % (start_date.strftime('%Y-%m-%d'), affectation.DSOIR), 'end': '%s %02d:00:00' % (start_date.strftime('%Y-%m-%d'), affectation.FSOIR), 'color': '#ffffff', 'display': 'background', 'rendering': 'background', } events.append(afternoon_event) count += 1 start_date += delta if count >= 38: break planning_edit = 'rdvb78_edit' if item.PLANNING == "B78" else 'rdvb_edit' for row in rows: nom = row.nom etoile = '' if row.NOM_ENTREPRISE: etoile += 'E' if row.comment: etoile += 'C' if len(etoile) > 0: nom = '%s (%s)' % (nom, etoile) # déterminer la couleur de l'event if row.date_valeur: color = 'LightGreen' # rdv validé = vert pale else: if to_int(row.ref) != row.cd_cli: if row.statut > 1: color = 'DeepPink' # rdv élève décommandé if row.statut == 10 or 15: color = 'LightGray' # moniteur absent elif row.fin_reservation: color = 'LightPink' # résa = LightPink else: color = 'LightYellow' # rdv élève = jaune pale if row.circuit == 1: color = 'Gold' # gold elif row.circuit == 2: color = 'Plum' # Plum elif row.circuit == 3: color = 'YellowGreen' # YellowGreen elif row.circuit == 4: color = 'DeepSkyBlue' # DeepSkyBlue elif row.circuit == 5: color = 'LimeGreen' # LimeGreen elif row.circuit == 6: color = 'GoldenRod' # Marron else: if row.cd_cli == 99995: color = 'White' # résa web = couleur blanc) elif row.cd_cli == 1: color = 'Gainsboro' # /////// else: color = 'LightBlue' # activité if row.statut == 10 or row.statut == 15: color = 'LightGray' # moniteur absent json_event = { 'resourceId': cd_mon, 'title': nom, 'start': '%s %02d:00:00' % (row.DATE.strftime('%Y-%m-%d'), row.noplan), 'end': '%s %02d:00:00' % (row.DATE.strftime('%Y-%m-%d'), row.noplan + row.qte), 'description': "%06d" % row.cd_cli, 'allDay': False, 'color': color, 'textColor': '#000000', 'url': '/%s/%s?from=planningb&agence=%s' % (planning_edit, row.no_ligne, str(agence)) } events.append(json_event) return json.dumps(events) logged_in = request.authenticated_userid # lire le user connecté member = get_users_by_code(request, logged_in) type_plannings = ['B', 'B78', '2R', 'GL'] current_planning = 'ALL' if 'current_planning' in request.params: current_planning = request.params['current_planning'] message = '' if not member: request.session.flash(u"Moniteur %s introuvable" % (logged_in), 'danger') return HTTPFound(location=request.route_url("home")) # lire son agence d'appartenance url = request.route_url('planningb') if 'agence' in request.GET: agence = request.GET['agence'] elif 'agence' in request.params: agence = request.params['agence'] else: agence = member.agence # start date if 'next' in request.GET: try: current_date = datetime.strptime(request.GET['next'], '%Y-%m-%d') current_date = current_date.date() except: current_date = date.today() else: current_date = date.today() # -- CREER un rendez-vous if 'form.submitted' in request.params: name = request.params['name'].split(' | ') cd_cli = int(name[1]) QTE = int(request.params['QTE']) dateRDV = request.params['dateRDV'] heureRDV = request.params['heureRDV'] fromUrl = url + "?agence=" + agence + '&next=' + dateRDV if 'cd_mon_B78' in request.params: isB78 = True cd_mon = request.params['cd_mon_B78'] else: cd_mon = request.params['cd_mon'] isB78 = False # controle date exportation isAffected, lastdate = controlAffectationEtAgece(request, cd_mon, dateRDV, heureRDV, agence) if controleDateExport(request, dateRDV, agence) == False: message = "Cette journée est déjà comptabilisée ! Création impossible." elif not isAffected: if lastdate: message = "La dernier affectation de ce moniteur pour l'agence " + str(agence) + " était le " + \ lastdate['DATEF'].strftime('%d/%m/%Y') + " à " + str(lastdate['DMATIN']) + "h jusqu'à " + str( lastdate['FMATIN']) + "h le matin et " + str(lastdate['DSOIR']) + "h jusqu'à " + str( lastdate['FSOIR']) + "h l'apres midi.!!" else: message = "Ce moniteur n'a aucune affectation dans cet agence pour la date de {0} à {1}h!!".format( dateRDV, heureRDV) else: if cd_cli < 100000: ref = str(cd_cli) else: if isB78: ref = "HCB78" else: ref = "HCB" # controles sur l'élève message = ctlEleve_PLB(request, cd_cli) if len(message) == 0: nDelai = controleSoldeResa(request, cd_cli, ref) # plafond dépassé ? if nDelai == -1: request.session.flash( u"L'encours de l'élève a dépassé son plafond autorisé. Impossible de lui ajouter une heure.", 'danger') return HTTPFound(location=fromUrl) else: update_rdvb(request, 0, 0, cd_cli, dateRDV, heureRDV, QTE, ref, cd_mon, agence, '', 0, 0, nDelai, 0, logged_in) if nDelai == 0: request.session.flash( u"Le rendez-vous a été CREE avec succès.", 'success') else: request.session.flash( u"Le rendez-vous a été RESERVE avec succès.", 'warning') return HTTPFound(location=fromUrl) # -- CREER un rendez-vous if 'form.validated' in request.params: if member.secu < 4: request.session.flash( u"Vous n’avez pas les droits suffisants pour faire ce traitement.", 'error') return HTTPFound(location=url) else: try: current_date = datetime.strptime( request.params['date'], '%d/%m/%Y').date() fromUrl = url + "?agence=" + \ str(agence) + '&next=' + current_date.strftime('%Y-%m-%d') if (current_date - date.today()) > timedelta(0): request.session.flash( u"Hmm, il est encore trop tôt pour valider ce planning, non ?.", 'error') return HTTPFound(location=fromUrl) else: code = member.secu if code < 9: if str(agence) != str(member.agence) and int(member.mobile) == 0: request.session.flash( u"Vous n’avez pas les droits suffisants pour faire ce traitement.", 'error') return HTTPFound(location=fromUrl) else: rows_start_after_now = get_rendez_vous_b_debut_apres_now( request, agence, current_date) if len(rows_start_after_now) > 0: request.session.flash( u"Vous ne pouvez pas encore valider ce planning. Il y a encore des leçons qui ne débutent pas.", 'error') return HTTPFound(location=fromUrl) ligne_cpts = get_eleve_cpt( request, current_date, agence) for ligne_cpt in ligne_cpts: nStatut = ligne_cpt.STATUT nQte = ligne_cpt.QTE if ligne_cpt.STATUT == 0: nStatut = 1 if ligne_cpt.CD_CLI == 99995: nQte = 0 # valiriser l'heure valoriser_heure(request, ligne_cpt.CD_CLI) # Marque l’heure comme validée et RAZ la date de résa validate_heure_rdvb(request, ligne_cpt.no_ligne, current_date, nQte, nStatut, ligne_cpt.CD_CLI, ligne_cpt.CD_MON, agence) request.session.flash( u"Le planning a été validé avec succès.", 'success') return HTTPFound(location=fromUrl) except: request.session.flash(u"Date non validé", 'error') return HTTPFound(location=url + '?agence=' + str(agence)) TODAY = date.today() # début = aujourd'hui - 3 semaines d = TODAY + relativedelta(weeks=-1) datedeb = d.strftime('%Y-%m-%d') # fin = aujourd'hui + 6 mois d = TODAY + relativedelta(months=+1) datefin = d.strftime('%Y-%m-%d') # generer le planning # lire tous les moniteurs de l'agence moniteurs = get_moniteurs_by_aff(request, agence, datedeb, datefin, current_planning) # sort moniteur , mettre B78 à la fin # moniteurs.sort(key=lambda m: str(m.PLANNING) == "B", reverse=True) moniteursB = [ moniteur for moniteur in moniteurs if moniteur.PLANNING == "B"] moniteursB78 = [ moniteur for moniteur in moniteurs if moniteur.PLANNING == "B78"] moniteurs2R = [ moniteur for moniteur in moniteurs if moniteur.PLANNING == "2R"] moniteursGL = [ moniteur for moniteur in moniteurs if moniteur.PLANNING == "GL"] moniteurs = moniteursB + moniteursB78 + moniteurs2R + moniteursGL calendar_ressources = generer_ressources(moniteurs) calendar_events = generer_planning( agence, moniteurs, datedeb, datefin, current_date) return { 'page_title': "Planning de B - Agence %s" % (agence), 'url': url, 'current_url': request.current_route_path(), 'calendar_events': calendar_events, 'calendar_ressources': calendar_ressources, 'QTE': 1, 'agence': int(agence), 'message': message, 'type_plannings': type_plannings, 'current_planning': current_planning, 'current_date': current_date, 'code': member.secu, 'myagence': member.agence } @view_config(route_name='rdvb_edit', renderer='../templates/planning/rdvb_edit.pt') def rdvb_edit(request): logged_in = request.authenticated_userid cd_mon, cd_mon_B78 = get_user_cd_mon(request, logged_in) no_ligne = request.matchdict['no_ligne'] rdvb = get_rendezvous_by_noligne(request, no_ligne) if ('from' and 'agence') in request.GET: url = request.route_url('rdvb_edit', no_ligne=no_ligne) + "?from=%s&agence=%s" % ( request.GET['from'], request.GET['agence']) location = request.route_url(request.GET['from']) + "?agence=%s" % ( request.GET['agence'] + '&next=' + rdvb.DATE.strftime('%Y-%m-%d')) else: url = request.route_url('rdvb_edit', no_ligne=no_ligne) location = request.route_url("monplanning", cd_mon=rdvb.CD_MON, date=rdvb.DATE.strftime('%Y-%m-%d')) message = '' # rdv déjà validé ? if rdvb.DATE_VALEUR: rdv_valide = True else: rdv_valide = False heuresSpe = [ '0 - HEURE CONDUITE B', '1 - EXAMEN BLANC', '2 - RDV PREALABLE', '3 - RDV PEDAGOGIQUE 1', '4 - 1ERES HEURES', '5 - RDV PEDAGOGIQUE 2', '6 - AVANT PERMIS', ] statuts = get_statuts_lecon(request) # déterminer l'url du bouton 'Fiche Elève' / 'Planning xxx' btn_name = 'Planning %s' % rdvb.NOM if rdvb.CD_CLI == 37: # circuit # btn_url = '/circuit_list/%s/%s' % (rdvb.DATE,'C') btn_url = "/motos_schd/I" elif rdvb.CD_CLI == 18: # rdv Stage code btn_url = '/motos_schd/D' elif rdvb.CD_CLI == 20: # rdv Planning 2R btn_url = '/motos_schd/A' elif rdvb.CD_CLI in [21, 56, 59, 69]: # rdv Planning Stage 2R btn_url = '/stages_schd/M' elif rdvb.CD_CLI == 54: # rdv Examen blanc btn_url = 'motos_schd/E' elif rdvb.CD_CLI == 52 or rdvb.CD_CLI == 55: # rdv pedagoque 1 et 2 btn_url = '/motos_schd/R' elif rdvb.CD_CLI == 10: # circuit stage btn_url = '/stageb_list/%s/A/%s/%s' % (rdvb.DATE, 'C', cd_mon) elif rdvb.CD_CLI == 11: # stage B btn_url = '/stageb_list/%s/A/%s/%s' % (rdvb.DATE, 'S', cd_mon) elif rdvb.CD_CLI == 16: # passage permis 2R btn_url = '/examens_schd/today/2R' elif rdvb.CD_CLI > 100000: btn_url = '/fiche_eleve/%s' % (rdvb.CD_CLI) btn_name = 'Fiche élève' else: btn_url = '' btn_name = '' if 'form.submitted' in request.params or 'form.validated' in request.params: name_cdcli = request.params['NOM'].split(' | ') if len(name_cdcli) < 2: message = "Elevé non validé !" NEW_CDCLI = name_cdcli[1] qte = int(request.params['QTE']) if qte < 1 or qte > 12: message = "Le nombre d'heures est incorrect" else: # controles sur l'élève message = ctlEleve_PLB(request, NEW_CDCLI) if len(message) == 0: nDelai = 0 update_rdvb(request, no_ligne, rdvb.CD_CLI, NEW_CDCLI, rdvb.DATE.strftime('%Y-%m-%d'), rdvb.NoPlan, qte, rdvb.REF, rdvb.CD_MON, rdvb.AGENCE, request.params['COMMENT'], int(request.params['STATUT']), int(request.params['typeHeure'][0]), nDelai, rdvb.cd_cli_old, logged_in) if 'form.validated' in request.params: validate_rdvb(request, no_ligne) request.session.flash(u"Le rendez-vous a été mis à jour avec succès.", 'success') return HTTPFound(location=location) if 'form.deleted' in request.params: p = request.GET # user autorisé ? userAcces = get_user_access(request, logged_in) if userAcces < 6: message = "Vous n'êtes pas autorisé à effectuer cette opération !" else: # journée déjà comptabilisée ? if rdvb.DATE_VALEUR: message = "Journée déjà validée" else: delaiOK = 'OK' if userAcces < 9 and rdvb.CD_CLI > 1000000: # controler le délai annulation ? delaiOK = isDelaiOK(request, rdvb.DATE, rdvb.cree_le, rdvb.STATUT) if delaiOK != 'OK': message = "Délai de suppression est dépassé. Suppression impossible!" else: # delettrer la ligne de compte update_eleve_delettrer(request, no_ligne) # mise à jour de la ligne comme annulée delete_eleve_cpt(request, no_ligne, rdvb.CD_CLI, rdvb.NoPlan, rdvb.STATUT, rdvb.CD_UTI) request.session.flash(u"Le rendez-vous a été supprimer avec succès.", 'success') return HTTPFound(location=location) return { 'page_title': 'Rendez-vous du %s à %s h' % (rdvb.DATE.strftime('%d-%m-%Y'), rdvb.NoPlan), 'url': url, 'rdvb': rdvb, 'rdv_valide': rdv_valide, 'btn_url': btn_url, 'btn_name': btn_name, 'heuresSpe': heuresSpe, 'statuts': statuts, 'message': message, 'back': location } @view_config(route_name='rdvb78_edit', renderer='../templates/planning/rdvb78_edit.pt') def rdvb78_edit(request): logged_in = request.authenticated_userid cd_mon, cd_mon_B78 = get_user_cd_mon(request, logged_in) no_ligne = request.matchdict['no_ligne'] rdvb78 = get_rendezvous_by_noligne(request, no_ligne) if ('from' and 'agence') in request.GET: url = request.route_url('rdvb78_edit', no_ligne=no_ligne) + "?from=%s&agence=%s" % ( request.GET['from'], request.GET['agence']) location = request.route_url(request.GET['from']) + "?agence=%s" % ( request.GET['agence'] + '&next=' + rdvb78.DATE.strftime('%Y-%m-%d')) else: url = request.route_url('rdvb78_edit', no_ligne=no_ligne) location = request.route_url("monplanning", cd_mon=cd_mon, date=rdvb78.DATE.strftime('%Y-%m-%d')) message = '' # rdv déjà validé ? if rdvb78.DATE_VALEUR: rdv_valide = True else: rdv_valide = False heuresSpe = [ '0 - HEURE CONDUITE B78', '1 - EXAMEN BLANC', '2 - RDV PREALABLE', '3 - RDV PEDAGOGIQUE 1', '4 - 1ERES HEURES', '5 - RDV PEDAGOGIQUE 2', '6 - AVANT PERMIS', ] statuts = get_statuts_lecon(request) # déterminer l'url du bouton 'Fiche Elève' / 'Planning xxx' btn_name = 'Planning %s' % rdvb78.NOM if rdvb78.CD_CLI == 37: # circuit btn_url = '/circuit_list/%s/%s' % (rdvb78.DATE, rdvb78.GROUPE) elif rdvb78.CD_CLI == 18: # rdv Stage code btn_url = '/motos_schd/D' elif rdvb78.CD_CLI == 20: # rdv Planning 2R btn_url = '/motos_schd/A' elif rdvb78.CD_CLI in [21, 56, 59, 69]: # rdv Planning Stage 2R btn_url = '/stages_schd/M' elif rdvb78.CD_CLI == 54: # rdv Examen blanc btn_url = 'motos_schd/E' elif rdvb78.CD_CLI == 52 or rdvb78.CD_CLI == 55: # rdv pedagoque 1 et 2 btn_url = '/motos_schd/R' elif rdvb78.CD_CLI == 10: # circuit stage btn_url = '/stageb_list/%s/A/%s/%s' % (rdvb78.DATE, 'C', cd_mon) elif rdvb78.CD_CLI == 11: # stage B btn_url = '/stageb_list/%s/A/%s/%s' % (rdvb78.DATE, 'S', cd_mon) elif rdvb78.CD_CLI == 16: # passage permis 2R btn_url = '/examens_schd/today/2R' elif rdvb78.CD_CLI > 100000: btn_url = '/fiche_eleve/%s' % (rdvb78.CD_CLI) btn_name = 'Fiche élève' else: btn_url = '' btn_name = '' if 'form.submitted' in request.params or 'form.validated' in request.params: name_cdcli = request.params['NOM'].split(' | ') if len(name_cdcli) < 2: message = "Elevé non validé !" NEW_CDCLI = name_cdcli[1] qte = int(request.params['QTE']) if qte < 1 or qte > 12: message = "Le nombre d'heures est incorrect" else: # controles sur l'élève message = ctlEleve_PLB(request, NEW_CDCLI) if len(message) == 0: nDelai = 0 typeheure = int(request.params['typeHeure'][0]) update_rdvb(request, no_ligne, rdvb78.CD_CLI, NEW_CDCLI, rdvb78.DATE.strftime('%Y-%m-%d'), rdvb78.NoPlan, qte, rdvb78.REF, rdvb78.CD_MON, rdvb78.AGENCE, request.params['COMMENT'], int(request.params['STATUT']), typeheure, nDelai, rdvb78.cd_cli_old, logged_in) if 'form.validated' in request.params: validate_rdvb(request, no_ligne) request.session.flash(u"Le rendez-vous a été mis à jour avec succès.", 'success') return HTTPFound(location=location) if 'form.deleted' in request.params: p = request.GET # user autorisé ? userAcces = get_user_access(request, logged_in) if userAcces < 6: message = "Vous n'êtes pas autorisé à effectuer cette opération !" else: # journée déjà comptabilisée ? if rdvb78.DATE_VALEUR: message = "Journée déjà validée" else: delaiOK = 'OK' if userAcces < 9 and rdvb78.CD_CLI > 1000000: # controler le délai annulation ? delaiOK = isDelaiOK(request, rdvb78.DATE, rdvb78.cree_le, rdvb78.STATUT) if delaiOK != 'OK': message = "Délai de suppression est dépassé. Suppression impossible!" else: # delettrer la ligne de compte update_eleve_delettrer(request, no_ligne) # mise à jour de la ligne comme annulée delete_eleve_cpt(request, no_ligne, rdvb78.CD_CLI, rdvb78.NoPlan, rdvb78.STATUT, rdvb78.CD_UTI) request.session.flash(u"Le rendez-vous a été supprimer avec succès.", 'success') return HTTPFound(location=location) return { 'page_title': 'Rendez-vous du %s à %s h' % (rdvb78.DATE.strftime('%d-%m-%Y'), rdvb78.NoPlan), 'url': url, 'rdvb78': rdvb78, 'rdv_valide': rdv_valide, 'btn_url': btn_url, 'btn_name': btn_name, 'heuresSpe': heuresSpe, 'statuts': statuts, 'message': message, 'back': location } @view_config(route_name='motos_edit', renderer='../templates/planning/motos_edit.pt') def motos_edit(request): type_stage = request.matchdict['type'] groupe = request.matchdict['groupe'] date_stage = request.matchdict['date'] cd_cli = request.matchdict['cd_cli'] url = request.route_url('motos_edit', type=type_stage,groupe=groupe,date=date_stage,cd_cli=cd_cli) logged_in = request.authenticated_userid member = get_users_by_code(request, logged_in) code = int(member.secu) # initialise la variable de session if 'url_retour' not in request.session: request.session['url_retour'] = url # save url appelant dans une variable de session if request.referrer and request.referrer != url: request.session['url_retour'] = request.referrer message = '' formated_date = datetime.strptime(date_stage,'%Y-%m-%d') if date_stage != None else None if int(cd_cli) == 0 : rdvb = { 'QTE' : 1, 'REF' : "HCA3", 'LIEU' : '', 'STATUT' : None, 'VALIDE' : 'N', 'CD_CLI' : 0, 'CD_UTI' : member.cd_uti, 'COMMENT' : None, 'ligne_cpt' : 0, 'cree_le' : datetime.now(), 'modif_le' : datetime.now(), 'DATE' : formated_date } else : rdvb = get_pla_moto_ligne_by_date(request,type_stage,groupe,formated_date,int(cd_cli)) delete = True if code <= 6 or rdvb['VALIDE'] == "O" or int(cd_cli) == 0: delete = False eleve = get_eleves_by_code(request,rdvb['CD_CLI']) lieux = get_lieux_by_type(request,type_stage+groupe) statuts = get_statuts_lecon(request) reference = get_ref_by_motos_type(request,type_stage) stage_edit = get_pla_moto_by_date(request,type_stage,groupe,formated_date) fin_reservation = stage_edit['DATE'].strftime('%d-%m-%Y') if stage_edit and stage_edit['DATE'] != None and stage_edit['DATE'] != "" else None cree_le = rdvb['cree_le'].strftime('%d-%m-%Y') if rdvb != None and rdvb['cree_le'] != None and rdvb['cree_le'] != "" else None modif_le = rdvb['modif_le'].strftime('%d-%m-%Y') if rdvb != None and rdvb['modif_le'] != None and rdvb['modif_le']!= "" else None if 'form.deleted' in request.params and int(cd_cli) != 0 : if code < 9 and int(cd_cli) > 100000 : isdelayok = isDelaiOK(request,stage_edit['DATE'],rdvb['cree_le'],8) if not isdelayok: request.session.flash(u"Interdiction de suppression de l'éleve %s dans le planning %s groupe %s." %(eleve['NOM']+" "+eleve['PRENOM'],type_stage,groupe), 'danger') return HTTPFound(request.session['url']) delete_moto_lig_by_cd_cli(request,rdvb.no_ligne,rdvb.ligne_cpt,cd_cli,member.cd_uti) update_panning_moto_dispo(request,type_stage,formated_date,groupe) request.session.flash(u"L'eleve %s est bien suprimé dans le planning %s groupe %s." %(eleve['NOM']+" "+eleve['PRENOM'],type_stage,groupe), 'success') return HTTPFound(request.session['url_retour']) if 'form.submitted' in request.params: new_values = dict(rdvb) params = dict(request.params) del params['form.submitted'] data = params['NOM'].split(' | ') if len(data) == 2 : cd_cli2 = int(data[1]) if int(cd_cli) == 0 and stage_edit and stage_edit.DISPO <= 0 : request.session.flash(u"Les eleves inscrits sont completes !", 'danger') return HTTPFound(request.session['url_retour']) if cd_cli2 != 0: eleve_edit = get_eleves_by_code(request,cd_cli2) if eleve_edit: if int (eleve_edit['AGENCE']) != 0 : if int(code) < 9 and eleve_edit['CLOTURE_LE'] != None : request.session.flash(u"Le DOSSIER de cet élève est CLOTURE ou RETIRE ou en LITIGE !", 'danger') return HTTPFound(url) elif eleve_edit['ELEVEGARDE02'] != 0 : request.session.flash(u"Le DOSSIER est gardé par l'élève !", 'danger') return HTTPFound(url) elif eleve_edit['FORMULE'] == None : request.session.flash(u" Attention! La FORMULE de l'élève n'est pas renseignée !", 'danger') return HTTPFound(url) elif (type_stage == "I" or type_stage == "R" or type_stage == "E") and eleve_edit.PERMIS_DEMANDE != "B" : request.session.flash(u"La catégorie de permis demandée n'est pas compatible avec ce planning !", 'danger') return HTTPFound(url) elif (type_stage == "A" or type_stage == "F") and not eleve_edit.PERMIS_DEMANDE.startswith('A'): request.session.flash(u"La catégorie de permis demandée n'est pas compatible avec ce planning !", 'danger') return HTTPFound(url) elif eleve_edit['COMPLET_LE'] == None or eleve_edit['DOSSIER_DATE'] == None: request.session.flash(u"Attention! Le dossier de l'élève est INCOMPLET ou NON ENREGISTRE!", 'warning') if eleve_edit['visite_med_fin_le'] != None : days = (eleve_edit['visite_med_fin_le'] - date.today()).days if days < 0 : request.session.flash(u"Attention! La date de visite médicale de l'élève est exprirée.", 'danger') return HTTPFound(url) elif days < 90 : request.session.flash(u"Attention! La date de visite médicale de l'élève est exprirée.", 'warning') formule = get_formule(request,eleve_edit['FORMULE']) if formule: if type_stage == "A": params['REF'] = formule.HCONDUIT params['QTE'] = formule.HSeance else: params['QTE'] = 1 if type_stage == "F": params['REF'] = "TA" if type_stage == "E": params['REF'] = 'TB' elif type_stage == "D": params['REF'] = 'PREPACODE' elif type_stage == "I": params['REF'] = 'CIRCUIT' elif type_stage == "R": params['REF'] = 'RDVP' # controle de solde resultatSolde = controleSoldeResa(request,cd_cli2,params['REF']) if int(cd_cli) != 0 : new_values['SOLDE'] = resultatSolde else : params['SOLDE'] = resultatSolde if resultatSolde == -1: request.session.flash(u"Le solde REEL de l'élève a dépassé l'encours autorisé et son total de réservation a dépassé le plafond autorisé",'danger') return HTTPFound(url) else : pass else: request.session.flash(u"Formule invalidé",'danger') return HTTPFound(url) #insert params['CD_CLI'] = eleve_edit.CD_CLI params['NOM'] = eleve_edit.NOMPREN if int(cd_cli) == 0: params['TYPE'] = type_stage params['GROUPE'] = groupe params['DATE'] = formated_date params['Route'] = eleve_edit.TR_P_OK if eleve_edit.TR_P_OK != None else 0 params['CD_UTI'] = member.cd_uti params['AGENCE'] = member.agence params['STATUT'] = 0 params['VALIDE'] = 'N' params['fin_reservation'] = datetime.strptime(fin_reservation,"%d-%m-%Y").date() if fin_reservation != None and fin_reservation != "" else None # inserer l'eleve exist = get_pla_moto_ligne_by_date(request,type_stage,groupe,formated_date,eleve_edit.CD_CLI) if not exist : # solde = params['SOLDE'] # del params['SOLDE'] # insert_motos_lig(request,params) params['CD_UTI'] = member.cd_uti params['OLD_CD_CLI'] = 0 params['AGENCE'] = member.agence params['LIGNE_CPT'] = 0 # params['SOLDE'] = solde update_motos_lig_avec_control(request,params) update_panning_moto_dispo(request,type_stage,formated_date,groupe) request.session.flash(u"L'eleve est inscrit dans le planning.", 'success') return HTTPFound(request.session['url_retour']) else: request.session.flash(u"L'eleve est déjà inscrit dans le planning.", 'danger') return HTTPFound(url) else: params['STATUT'] = int(params['STATUT']) for param, value in params.items(): if param in new_values.keys(): new_values[param] = value new_values['CD_UTI'] = member.cd_uti new_values['OLD_CD_CLI'] = rdvb.CD_CLI new_values['LIGNE_CPT'] = rdvb.ligne_cpt new_values['AGENCE'] = member.agence update_motos_lig_avec_control(request,new_values) request.session.flash(u"Le rendez-vous a été mis à jour avec succès.", 'success') return HTTPFound(request.session['url_retour']) else: request.session.flash(u"L'élève non validé pour le planning %s, groupe %s" %(str(rdvb.TYPE),str(rdvb.GROUPE)),'danger') return HTTPFound(url) else: request.session.flash(u"L'élève non validé pour planning %s, groupe %s" %(str(type_stage),str(groupe)),'danger') return HTTPFound(url) else: request.session.flash(u"Eleve non validé.", 'danger') return HTTPFound(url) return { 'page_title': 'Rendez-vous du %s' % (rdvb['DATE'].strftime('%d/%m/%Y')), 'url': url, 'url_retour': request.session['url_retour'], 'rdvb': rdvb, 'statuts': statuts, 'message': message, 'eleve' : eleve, 'lieux' : lieux, 'code' : code, 'delete' : delete, 'cree_le' : cree_le, 'modif_le' : modif_le, 'fin_reservation': fin_reservation, 'cd_uti' : rdvb['CD_UTI'], } @view_config(route_name='stages_edit', renderer='../templates/planning/stages_edit.pt') def stages_edit(request): no_ligne = request.matchdict['no_ligne'] url = request.route_url('stages_edit', no_ligne=no_ligne) logged_in = request.authenticated_userid member = get_users_by_code(request, logged_in) # initialise la variable de session if 'url_retour' not in request.session: request.session['url_retour'] = url # save url appelant dans une variable de session if request.referrer and request.referrer != url: request.session['url_retour'] = request.referrer message = '' code = int(member.secu) delete = True rdvb = get_stages_lig_by_noligne(request, no_ligne) statuts = get_statuts_lecon(request) type_stage = no_ligne[0:1] semaine = no_ligne[1:7] groupe = no_ligne[7:8] cd_cli = no_ligne[8:14] stage_edit = get_pla_stage_by_semaine(request,type_stage,semaine,groupe) cree_le = rdvb['cree_le'].strftime('%d-%m-%Y') if rdvb != None and rdvb['cree_le'].strftime('%d-%m-%Y') != None and rdvb['cree_le'].strftime('%d-%m-%Y') != "" else None modif_le = rdvb['modif_le'].strftime('%d-%m-%Y') if rdvb != None and rdvb['modif_le'].strftime('%d-%m-%Y') != None and rdvb['modif_le'].strftime('%d-%m-%Y') != "" else None fin_reservation = stage_edit['fin'].strftime('%d-%m-%Y') if stage_edit['fin'].strftime('%d-%m-%Y') != None and stage_edit['fin'].strftime('%d-%m-%Y') != "" else None eleve = get_eleves_by_code(request,cd_cli) reference = get_ref_by_stage_type(request,type_stage) if type_stage == 'B' and (groupe == "C" or groupe == "D"): reference[0] = {'REF':'HCB78'} if rdvb is None : semaine = no_ligne[1:7] rdvb = { 'QTE' : 1, 'REF' : "HCB", 'ligne_cpt' : 0, 'LIEU' : '', 'STATUT' : None, 'VALIDE' : 'N', 'CD_CLI' : 0 } else: semaine = rdvb.SEMAINE if code <= 6 or rdvb['VALIDE'] == "O": delete = False if code < 9 and int(cd_cli) > 100000 : isdelayok = isDelaiOK(request, stage_edit['fin'], rdvb['cree_le'].date(), 8) if not isdelayok: delete = False if 'form.deleted' in request.params and rdvb != None : if code < 9 and int(cd_cli) > 100000 : isdelayok = isDelaiOK(request, stage_edit['fin'], rdvb['cree_le'].date(), 8) if not isdelayok: request.session.flash(u"Interdiction de suppression de l'éleve %s dans le stage %s groupe %s." %(eleve['NOM']+" "+eleve['PRENOM'],type_stage,groupe), 'danger') return HTTPFound(request.session['url']) delete_stage_lig_by_cd_cli(request,type_stage,semaine,groupe,cd_cli) request.session.flash(u"L'eleve %s est bien suprimé dans le stage %s groupe %s." %(eleve['NOM']+" "+eleve['PRENOM'],type_stage,groupe), 'success') return HTTPFound(request.session['url_retour']) if 'form.submitted' in request.params: params = dict(request.params) del params['form.submitted'] data = params['NOM'].split(' | ') eleve_edit = None if len(data) == 2 : cd_cli2 = data[1] if stage_edit.DISPO <= 0 and int(cd_cli) == 0: request.session.flash(u"Les eleves inscrits sont completes !", 'danger') return HTTPFound(request.session['url_retour']) if int(cd_cli2) != 0 : eleve_edit = get_eleves_by_code(request,cd_cli2) eleve_stage = stage_lig_by_eleve(request,cd_cli2,type_stage,semaine,groupe) params['NOM'] = eleve_edit.NOMPREN params['CD_CLI'] = cd_cli2 if int(cd_cli) != int(cd_cli2): formule = get_formule(request,eleve_edit['FORMULE']) if formule : params['QTE'] = formule.HSeance params['REF'] = formule.INS1 if int (eleve_edit['AGENCE']) != 0 : eleve_formule = get_formule(request,eleve_edit['FORMULE']) if not eleve_formule : request.session.falsh(u'Attention! La FORMULE de l\'élève n\'est pas renseignée') return HTTPFound(url) if int(code) < 9 and eleve_edit['CLOTURE_LE'] != None : request.session.flash(u"Le DOSSIER de cet élève est CLOTURE ou RETIRE ou en LITIGE !", 'danger') return HTTPFound(url) elif eleve_edit['ELEVEGARDE02'] != 0 : request.session.flash(u"Le DOSSIER est gardé par l'élève !", 'danger') return HTTPFound(url) elif eleve_edit['FORMULE'] == None : request.session.flash(u" Attention! La FORMULE de l'élève n'est pas renseignée !", 'danger') return HTTPFound(url) elif type_stage == "B" and groupe != "C" and groupe != "D" and eleve_edit['PERMIS_DEMANDE'] != "B" : request.session.flash(u"La catégorie de permis demandée n'est pas compatible avec ce planning !", 'danger') return HTTPFound(url) elif type_stage == "B" and (groupe == "C" or groupe == "D") and eleve_edit['PERMIS_DEMANDE'] != "B78" : request.session.flash(u"Le groupe demandée est réservé pour boite automatique", 'danger') return HTTPFound(url) elif type_stage == "B78" and params['REF'] == "HCB" : request.session.flash(u"Le groupe demandée est réservé pour boite automatique", 'danger') return HTTPFound(url) elif type_stage == "B" and int(code) <= 2 : request.session.flash(u"Les moniteurs sont autorisés à modifier seulement le planning Moto !", 'danger') return HTTPFound(url) elif type_stage == "C" and eleve_edit['PERMIS_DEMANDE'] != "POINT": request.session.flash(u"La catégorie de permis demandée n'est pas compatible avec ce planning !", 'danger') return HTTPFound(url) elif type_stage == "M" and not eleve_edit['PERMIS_DEMANDE'].startswith('A'): request.session.flash(u"La catégorie de permis demandée n'est pas compatible avec ce planning !", 'danger') return HTTPFound(url) elif eleve_edit['COMPLET_LE'] == None or eleve_edit['DOSSIER_DATE'] == None: request.session.flash(u"Attention! Le dossier de l'élève est INCOMPLET ou NON ENREGISTRE!", 'warning') if eleve_edit['visite_med_fin_le'] != None : days = (eleve_edit['visite_med_fin_le'] - date.today()).days if days < 0 : request.session.flash(u"Attention! La date de visite médicale de l'élève est exprirée.", 'danger') return HTTPFound(url) elif days < 90 : request.session.flash(u"Attention! La date de visite médicale de l'élève est exprirée.", 'warning') if eleve_formule and int(eleve_formule['STAGE']) == 0 : request.session.flash(u"La FORMULE de cet élève n'est pas de type stage !", 'danger') return HTTPFound(url) elif int(cd_cli) != int(cd_cli2) and len(eleve_stage) > 0 : request.session.flash(u"L'élève est déjà inscrit au stage de la semaine %s, groupe %s" %(str(semaine),str(groupe)),'danger') return HTTPFound(url) else: request.session.flash(u"L'élève non validé pour le stage de la semaine %s, groupe %s" %(str(semaine),str(groupe)),'danger') return HTTPFound(url) else: request.session.flash(u"Eleve fomat incorrect %s, groupe %s" %(str(semaine),str(groupe)),'danger') return HTTPFound(url) params['CD_UTI'] = member.cd_uti params['AGENCE'] = stage_edit['AGENCE'] if int(cd_cli) == 0 : update_stages_lig(request, no_ligne, params,1) else: if'REF' not in params : params['REF'] = rdvb['REF'] params['LIGNE_CPT'] = rdvb['ligne_cpt'] update_stages_lig(request, no_ligne, params) request.session.flash(u"Le rendez-vous a été mis à jour avec succès.", 'success') return HTTPFound(request.session['url_retour']) return { 'page_title': 'Stage de la semaine %s' % (semaine), 'url': url, 'url_retour': request.session['url_retour'], 'rdvb': rdvb, 'statuts': statuts, 'message': message, 'eleve' : eleve, 'delete' : delete, 'cree_le' : cree_le, 'modif_le' : modif_le, 'fin_reservation': fin_reservation, 'reference': reference, 'ligne_cpt' : rdvb['ligne_cpt'] if rdvb != None else None, 'cd_uti' : stage_edit['CD_UTI'], 'cd_cli' : rdvb['CD_CLI'] } @view_config(route_name='stageb_list', renderer='../templates/planning/stageb_list.pt', permission='view') def stageb_list(request): def generer_datatable(date_stage, groupe_stage, type_stage, cd_mon_stage): # lire les stages B items = get_stage_lig_by_date(request, 'B', date_stage, groupe_stage) dates_stage = '' date_deb = date.today() date_fin = date.today() # construire la liste liste=[] dates_stage = '' for item in items: # mémoriser les dates du stage dates_stage = '%s au %s' % (item.debut.strftime('%d'), item.fin.strftime('%d-%m-%Y')) date_deb = item.debut.date() date_fin = item.fin if type_stage == 'A' or (type_stage == 'S' and item.CD_MON == cd_mon_stage) or (type_stage == 'C' and item.cd_circuit == cd_mon_stage): # n'affiche que les élèves du moniteur solde = to_euroN(item.solde) if item.nom_entreprise : solde += ' E' if item.perime_le: code_ok = to_age(item.perime_le, '<') else: code_ok = '' # examen prévu ? examen = get_examens_prevu(request, item.CD_CLI) if examen: if examen.PERMIS == 'ETG': code_ok = 'Inscrit' if item.VALIDE == 'N': heures = item.heures else: heures = 'VAL' circuit = item.seance if item.cd_circuit: circuit += ' - ' + item.cd_circuit d = (item.CD_CLI, item.GROUPE, item.niveau, to_str(item.CD_MON), to_str(circuit), to_str(item.CD_CLI) + ' - ' + item.NOM, solde, code_ok, item.filiere + '-' + item.CD_REF, item.LIEU, heures, str(item.STATUT), item.TYPE + to_str(item.SEMAINE) + item.GROUPE + to_str(item.CD_CLI), item.VALIDE) liste.append(d) return date_deb, date_fin, dates_stage, json.dumps(liste) date_stage = request.matchdict['date'] date_date_stage = datetime.strptime(date_stage,'%Y-%m-%d') weeknumber = date_date_stage.isocalendar()[1] if len(str(weeknumber)) == 1: weeknumber = "0" + str(weeknumber) semaine = str(date_date_stage.year) +''+str(weeknumber) groupe_stage = request.matchdict['groupe'] type_stage = request.matchdict['sorc'] cd_mon_stage = request.matchdict['cd_mon'] url = request.route_url('stageb_list', date=date_stage, groupe=groupe_stage, sorc=type_stage, cd_mon=cd_mon_stage) groupe = dict({ "A" : "Grp A-5 jrs B", "B" : "Grp B-3 jrs B", "C" : "Grp C-5 jrs B78", "D" : "Grp D-3 jrs B78", "E" : "Grp E", "F" : "Grp F", "G" : "Grp G-B96 en ligne", "H" : "Grp H-B96", "I" : "Grp I-B96", "J" : "Grp J–POST PERMIS VAISE", "K" : "Grp K–POST PERMIS CHARPENNES", "L" : "Grp L–POST PERMIS PRESQUILE", "M" : "Grp M–POST PERMIS VAUGNERAY", "N" : "Gpr N" }) # si 'A' en paramètre if type_stage == 'A': cb_all = "oui" # si afficher tous est coché ? if 'cb_all' in request.params: cb_all = "oui" type_stage = 'A' else: cb_all = "non" # si 'A' en paramètre if type_stage == 'A': cb_all = "oui" # initialise la variable de session if 'url_retour' not in request.session: request.session['url_retour'] = url # save url appelant dans une variable de session if request.referrer and request.referrer != url: request.session['url_retour'] = request.referrer message = '' # generer la datatable date_deb, date_fin, dates_stage, dt_data = generer_datatable(date_stage, groupe_stage, type_stage, cd_mon_stage) # lire les moniteurs stageB de la semaine moniteurs = get_moniteurs_by_activite(request, date_deb, date_fin, 10, 11) cd_mon = request.authenticated_userid member = get_users_by_code(request, cd_mon) if 'form.submitted' in request.params: # oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')]) liste_param = '' for param in request.params: if param[:2] == 'id': cd_cli = request.params[param] # maj le statut de la ligne à 1 update_stage_lig_statut(request, 'B', date_stage, cd_cli) if liste_param: liste_param += "-%s" % cd_cli else: liste_param = cd_cli # des lignes ont été sélectionnées ? if len(liste_param) > 0: # goto fiche de suivi return HTTPFound(location=request.route_url('show_iframe', param='B' + liste_param)) if 'form.stage' in request.params or 'form.circuit' in request.params: message = '' cd_mon = request.params['cd_mon'] # oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')]) for param in request.params: if param[:2] == 'id': if 'form.stage' in request.params: update_stageb_lig_moniteur(request, date_stage, request.params[param], cd_mon) message = "Le moniteur STAGE est mis à jour avec succès" else: update_stageb_lig_circuit(request, date_stage, request.params[param], cd_mon) message = "Le moniteur CIRCUIT est mis à jour avec succès" # generer la datatable date_deb, date_fin, dates_stage, dt_data = generer_datatable(date_stage, groupe_stage, type_stage, cd_mon_stage) if 'form.seance' in request.params: message = '' seance = request.params['seance'] # oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')]) for param in request.params: if param[:2] == 'id': update_stageb_lig_seance(request, date_stage, request.params[param], seance) message = "La SEANCE est mise à jour avec succès" # generer la datatable date_deb, date_fin, dates_stage, dt_data = generer_datatable(date_stage, groupe_stage, type_stage, cd_mon_stage) if 'form.updated' in request.params : params = dict(request.params) stage = get_pla_stage_by_semaine(request,'B',semaine,groupe_stage) del params['form.updated'] params['debut'] = datetime.strptime(request.params['debut']+' '+request.params['starttime'],'%d-%m-%Y %H:%M') if request.params['debut'] != None and request.params['debut'] != '' else None params['fin'] = datetime.strptime(request.params['fin'],'%d-%m-%Y') if request.params['fin'] != None and request.params['fin'] != '' else None del params['starttime'] params['CD_UTI'] = cd_mon params['nom_formateur'] = params['nom_formateur'].split(' | ')[0] params['nom_psy'] = params['nom_psy'].split(' | ')[0] # params['DISPO'] = int(params['TOTAL']) - int(params['DISPO']) update_pla_stage(request,params,'B',semaine,groupe_stage) request.session.flash(u"Le stage B groupe %s a été mis à jour avec succès" %groupe_stage,'success') # generer la datatable date_deb, date_fin, dates_stage, dt_data = generer_datatable(date_stage, groupe_stage, type_stage, cd_mon_stage) if 'form.validated' in request.params : params = dict(request.params) hashed = to_sha1(params['password']) if 'password' in params else None passed = member.mdp_hash == hashed if hashed == None or passed : if StageHasPending(request,"B",semaine,groupe_stage): request.session.flash(u"Il y a un ou des élèves provisoires dans ce stage. Validation impossible","danger") return HTTPFound(location=url) else: # lire tous les planning items = get_stage_lig_by_date(request, 'B', date_stage, groupe_stage) AGENCE = member.agence stage = get_pla_stage_by_semaine(request,'B',semaine,groupe_stage) date_valeur = stage['fin'] VALIDE = 'O' LIBELLE = groupe[groupe_stage] for item in items : nStatus = 1 if int (item.STATUT) != 0 : nStatus = item.STATUT # update stage ligne and eleve_cpt update_stage_lig_by_cd_cli(request,'B',semaine,groupe_stage,item.CD_CLI,nStatus,VALIDE,AGENCE,item.ligne_cpt,LIBELLE,date_valeur) # update stage update_pla_stage_by_semaine(request,'B',semaine,groupe_stage,AGENCE,VALIDE,member.cd_uti) request.session.flash(u"Le stage est validé avec succés","success") return HTTPFound(location=request.route_url('stages_schd', type='B')) else: request.session.flash(u"Erreur d'authentification" ,'danger') return HTTPFound(location=url) if 'form.deleted' in request.params: items = get_stage_lig_by_date(request, 'B', date_stage, groupe_stage) if len(items) > 0 : request.session.flash(u"Interdiction de suppression, des eleves ont déjà inscrit dans ce stage." ,'danger') return HTTPFound(location=url) else: delete_pla_stage_by_semaine(request,'B',semaine,groupe_stage) request.session.flash(u"Le stage %s groupe %s du %s est supprimé avec success"%('B',groupe_stage,date_stage),"success") return HTTPFound(location=request.route_url('stages_schd', type='B')) if 'form.deleted_selected' in request.params: ids = str(request.params['deleted_selected_inputs']).split('-') stage_edit = get_pla_stage_by_semaine( request, 'B', semaine, groupe_stage) type_stage = 'B' for eleve_id in ids: eleve = get_eleves_by_code(request, eleve_id) rdvb = get_stage_lig_by_cd_cli(request, type_stage, eleve_id) if member.secu < 9 and int(eleve_id) > 100000: isdelayok = isDelaiOK( request, stage_edit['fin'], rdvb['cree_le'].date(), 8) if not isdelayok: request.session.flash(u"Interdiction de suppression de l'éleve %s dans le stage %s groupe %s." % ( eleve['NOM']+" "+eleve['PRENOM'], type_stage, groupe_stage), 'danger') delete_stage_lig_by_cd_cli( request, type_stage, semaine, groupe_stage, eleve_id) request.session.flash(u"L'eleve %s est bien suprimé dans le stage %s groupe_stage %s." % ( eleve['NOM']+" "+eleve['PRENOM'], type_stage, groupe_stage), 'success') return HTTPFound(url) stage = get_pla_stage_by_semaine(request,'B',semaine,groupe_stage) ispassed = (stage['fin'] - date.today()).days > 0 stage_debut = "" starttime = "" if stage['debut'] != None : stage_debut = stage['debut'].strftime('%d-%m-%Y') starttime = stage['debut'].strftime('%H:%M') stage_fin = stage['fin'].strftime('%d-%m-%Y') if stage['fin'] != None else "" return { 'page_title': 'Stage B du %s' % date_date_stage.strftime('%d-%m-%Y'), 'url': url, 'url_retour': request.session['url_retour'], 'message': message, 'dt_data': dt_data, 'moniteurs': moniteurs, 'cd_mon': cd_mon, 'cb_all': cb_all, 'groupe': groupe, 'stage' : stage, 'ispassed' : ispassed, 'code' : member.secu, 'stage_debut' : stage_debut, 'stage_fin' : stage_fin, 'starttime' : starttime, 'codeleve' : stage.TYPE + to_str(stage.SEMAINE) + stage.GROUPE + to_str(0) } @view_config(route_name='circuit_list', renderer='../templates/planning/circuit_list.pt', permission='view') def circuit_list(request): def generer_datatable(type_stage, date_stage,groupe): # lire les circuits items = get_motos_lig_by_date(request, type_stage, date_stage, groupe) # construire la liste liste=[] dates_stage = '' for item in items: dates_stage = item.DATE.strftime('%d-%m-%Y') solde = to_euroN(item.solde) if item.nom_entreprise : solde += ' E' if item.perime_le: code_ok = to_age(item.perime_le, '<') else: code_ok = '' if item.VALIDE == 'N': heures = item.heures else: heures = 'VAL' d = (item.CD_CLI, item.GROUPE, item.niveau, to_str(item.cd_circuit), to_str(item.CD_CLI) + ' - ' + item.NOM, solde, code_ok, item.filiere + '-' + item.cd_mon, item.LIEU, heures, item.STATUT, item.no_ligne) liste.append(d) return dates_stage, json.dumps(liste) type_stage = 'I' date_stage = request.matchdict['date'] groupe = request.matchdict['groupe'] url = request.route_url('circuit_list', date=date_stage ,groupe=groupe) logged_in = request.authenticated_userid member = get_users_by_code(request, logged_in) code = int(member.secu) groupe_stage = dict({ "A" : "Grp A-8h à 11h", "B" : "Grp B-12h à 15h", "C" : "Grp C-15h à 18h", "D" : "Grp D-18h à 21h", "E" : "Grp E-8h à 12h", "F" : "Grp F-13h à 17h", "G" : "Grp G-13h à 17h", }) # initialise la variable de session if 'url_retour' not in request.session: request.session['url_retour'] = url # save url appelant dans une variable de session if request.referrer and request.referrer != url: request.session['url_retour'] = request.referrer message = '' # generer la datatable dates_stage, dt_data = generer_datatable('I', date_stage,groupe) # lire les moniteurs stageB de la semaine cd_mon = request.authenticated_userid button_title = 'Suivi groupe' moniteurs = get_moniteurs_by_activite(request, date_stage, date_stage, 37, 37) if 'form.submitted' in request.params: # des lignes ont été sélectionnées ? if len(request.params) > 1: # oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')]) liste_param = '' for param in request.params: if param[:2] == 'id': if liste_param: liste_param += "-%s" % request.params[param] else: liste_param = request.params[param] if liste_param : # suivi circuit ou suivi rdvp return HTTPFound(location=request.route_url('show_iframe', param=type_stage + liste_param)) else: message = 'Veuillez sélectionner au moins un(e) élève' if 'form.circuit' in request.params: message = '' cd_mon = request.params['cd_mon'] # oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')]) for param in request.params: if param[:2] == 'id': update_motos_lig_circuit(request, type_stage, date_stage, request.params[param], cd_mon) message = "Le moniteur CIRCUIT est mis à jour avec succès" # generer la datatable dates_stage, dt_data = generer_datatable(type_stage, date_stage) formated_date = datetime.strptime(date_stage,'%Y-%m-%d') if date_stage != None and date_stage != '' else None if 'form.updated' in request.params : params = dict(request.params) del params['form.updated'] update_pla_motos(request,type_stage,formated_date,groupe,params) request.session.flash(u"Le stage %s groupe %s a été mis à jour avec succès" %(type_stage,groupe),'success') if 'form.validated' in request.params : params = dict(request.params) diff = (formated_date - datetime.today()).days if diff > 0 : request.session.flash(u"Hmm, il est encore trop tôt pour valider ce planning","danger") return HTTPFound(location=url) if planningHasPending(request,type_stage,formated_date,groupe): request.session.flash(u"Il y a un ou des élèves provisoires dans ce planning. Validation impossible","danger") return HTTPFound(location=url) else: # lire tous les planning items = get_motos_lig_by_date(request, type_stage, formated_date, groupe) planning = get_pla_moto_by_date(request,type_stage,groupe,formated_date) fin_reservation = None VALIDE = 'O' AGENCE = member.agence CD_UTI = member.cd_uti for item in items : nStatus = 1 if int (item.STATUT) != 0 : nStatus = item.STATUT # update planning ligne and eleve_cpt update_motos_lig_by_cd_cli(request,type_stage,formated_date,groupe,item.CD_CLI,nStatus,VALIDE,AGENCE,item.ligne_cpt,item.REF,item.CD_MON) # update planning update_pla_moto_by_date(request,type_stage,formated_date,groupe,AGENCE,VALIDE,member.cd_uti) request.session.flash(u"Le planning est validé avec succés","success") return HTTPFound(location=request.route_url('motos_schd', type=type_stage)) if 'form.deleted' in request.params: items = get_motos_lig_by_date(request, type_stage, formated_date, groupe) if len(items) > 0 : request.session.flash(u"Interdiction de suppression, des eleves ont déjà inscrit dans ce planning." ,'danger') return HTTPFound(location=url) else: delete_pla_moto_by_date(request,type_stage,formated_date,groupe) request.session.flash(u"Le planning %s groupe %s du %s est supprimé avec success"%(type_stage,groupe,date_stage),"success") return HTTPFound(location=request.route_url('motos_schd', type=type_stage)) stage = get_pla_moto_by_date(request,type_stage,groupe,formated_date) if not stage : request.session.flash(u"Planning non trouvé","danger") return HTTPFound(location=request.route_url('motos_schd', type=type_stage)) return { 'page_title': 'Circuit forfait du %s' % dates_stage, 'url': url, 'url_retour': request.session['url_retour'], 'message': message, 'dt_data': dt_data, 'moniteurs': moniteurs, 'cd_mon': cd_mon, 'button_title': button_title, 'type': type_stage, 'stage' : stage, 'groupe' : groupe_stage, 'grp' : groupe, 'date':date_stage, 'code':code, 'codeleve' : to_str(0) } @view_config(route_name='motos_list', renderer='../templates/planning/motos_list.pt', permission='view') def motos_list(request): def generer_datatable(type_stage, date_stage, groupe): # lire les circuits items = get_motos_lig_by_date(request, type_stage, date_stage, groupe) # construire la liste liste=[] dates_stage = '' for item in items: dates_stage = item.DATE.strftime('%d-%m-%Y') solde = to_euroN(item.solde) if item.nom_entreprise : solde += ' E' if item.perime_le: code_ok = to_age(item.perime_le, '<') else: code_ok = '' if item.VALIDE == 'N': heures = item.heures else: heures = 'VAL' d = (item.CD_CLI, item.GROUPE, item.niveau, to_str(item.CD_MON), to_str(item.CD_CLI) + ' - ' + item.NOM, solde,code_ok,'%s - %s' % (item.filiere, item.cd_mon), item.LIEU, heures, item.STATUT, item.no_ligne, item.VALIDE) liste.append(d) return dates_stage, json.dumps(liste) type_stage = request.matchdict['type'] date_stage = request.matchdict['date'] groupe = request.matchdict['groupe'] url = request.route_url('motos_list', type=type_stage, date=date_stage, groupe=groupe) logged_in = request.authenticated_userid member = get_users_by_code(request, logged_in) code = int(member.secu) groupe_stage = dict({ "A" : "Grp A-8h à 11h", "B" : "Grp B-12h à 15h", "C" : "Grp C-15h à 18h", "D" : "Grp D-18h à 21h", "E" : "Grp E-8h à 12h", "F" : "Grp F-13h à 17h", "G" : "Grp G-13h à 17h", }) # initialise la variable de session if 'url_retour' not in request.session: request.session['url_retour'] = url # save url appelant dans une variable de session if request.referrer and request.referrer != url: request.session['url_retour'] = request.referrer message = '' # lire le stage stage = get_motos_byId(request, type_stage, date_stage, groupe) # generer la datatable dates_stage, dt_data = generer_datatable(type_stage, date_stage, groupe) # moniteur par défaut = moniteur connecté cd_mon = logged_in if type_stage == "R": page_title = 'RDV pédagogique du %s' % dates_stage button_title = 'Suivi théorique' moniteurs = get_moniteurs_by_activite(request, date_stage, date_stage, 52, 55) elif type_stage == "E": page_title = 'Examen blanc B du %s' % dates_stage button_title = 'Suivi groupe' moniteurs = get_moniteurs_by_activite(request, date_stage, date_stage, 54, 54) elif type_stage == "F": page_title = 'Examen blanc A du %s' % dates_stage button_title = 'Suivi groupe' moniteurs = get_moniteurs_by_activite(request, date_stage, date_stage, 54, 54) else: page_title = 'Stage code %s' % dates_stage button_title = 'Smartcode' moniteurs = get_moniteurs_by_activite(request, date_stage, date_stage, 18, 18) if 'form.submitted' in request.params: # des lignes ont été sélectionnées ? if len(request.params) > 1: # oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')]) liste_param = '' for param in request.params: if param[:2] == 'id': cd_cli = request.params[param] # mise à jour du cd_mon update_motos_lig_cd_mon(request, type_stage, date_stage, cd_cli, logged_in) if liste_param: liste_param += "-%s" % cd_cli else: liste_param = cd_cli if type_stage == "D": # stage code --> smart code return HTTPFound(location=request.route_url('show_iframe', param='smartcode')) if liste_param : # suivi circuit ou suivi rdvp return HTTPFound(location=request.route_url('show_iframe', param=type_stage + liste_param)) else: message = 'Veuillez sélectionner au moins un(e) élève' if 'form.circuit' in request.params: message = '' cd_mon = request.params['cd_mon'] # oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')]) for param in request.params: if param[:2] == 'id': update_motos_lig_circuit(request, type_stage, date_stage, request.params[param], cd_mon) message = "Le moniteur CIRCUIT est mis à jour avec succès" # generer la datatable dates_stage, dt_data = generer_datatable(type_stage, date_stage, groupe) formated_date = datetime.strptime(date_stage,'%Y-%m-%d') if date_stage != None and date_stage != '' else None if 'form.updated' in request.params : params = dict(request.params) del params['form.updated'] update_pla_motos(request,type_stage,formated_date,groupe,params) request.session.flash(u"Le stage %s groupe %s a été mis à jour avec succès" %(type_stage,groupe),'success') if 'form.validated' in request.params : params = dict(request.params) diff = (formated_date - datetime.today()).days if diff > 0 : request.session.flash(u"Hmm, il est encore trop tôt pour valider ce planning","danger") return HTTPFound(location=url) if planningHasPending(request,type_stage,formated_date,groupe): request.session.flash(u"Il y a un ou des élèves provisoires dans ce planning. Validation impossible","danger") return HTTPFound(location=url) else: # lire tous les planning items = get_motos_lig_by_date(request, type_stage, formated_date, groupe) planning = get_pla_moto_by_date(request,type_stage,groupe,formated_date) fin_reservation = None VALIDE = 'O' AGENCE = member.agence CD_UTI = member.cd_uti for item in items : nStatus = 1 if int (item.STATUT) != 0 : nStatus = item.STATUT # update planning ligne and eleve_cpt update_motos_lig_by_cd_cli(request,type_stage,formated_date,groupe,item.CD_CLI,nStatus,VALIDE,AGENCE,item.ligne_cpt,item.REF,item.CD_MON) # update planning update_pla_moto_by_date(request,type_stage,formated_date,groupe,AGENCE,VALIDE,member.cd_uti) request.session.flash(u"Le planning est validé avec succés","success") return HTTPFound(location=request.route_url('motos_schd', type=type_stage)) if 'form.deleted' in request.params: items = get_motos_lig_by_date(request, type_stage, formated_date, groupe) if len(items) > 0 : request.session.flash(u"Interdiction de suppression, des eleves ont déjà inscrit dans ce planning." ,'danger') return HTTPFound(location=url) else: delete_pla_moto_by_date(request,type_stage,formated_date,groupe) request.session.flash(u"Le planning %s groupe %s du %s est supprimé avec success"%(type_stage,groupe,date_stage),"success") return HTTPFound(location=request.route_url('motos_schd', type=type_stage)) if 'form.deleted_selected' in request.params: ids = str(request.params['deleted_selected_inputs']).split('-') for eleve_id in ids: eleve = get_eleves_by_code(request, eleve_id) delete_pla_moto_by_cd_cli( request, type_stage, groupe, formated_date, eleve_id) request.session.flash(u"L'eleve %s est bien suprimé dans % %s." % ( eleve['NOM'] + " " + eleve['PRENOM'], page_title), 'success') return { 'page_title': page_title, 'url': url, 'url_retour': request.session['url_retour'], 'message': message, 'dt_data': dt_data, 'type' : type_stage, 'stage': stage, 'moniteurs': moniteurs, 'cd_mon': cd_mon, 'button_title': button_title, 'groupe' : groupe_stage, 'grp' : groupe, 'date':date_stage, 'code':code, 'codeleve' : to_str(0) } @view_config(route_name='stages_schd', renderer='../templates/planning/stages_schd.pt', permission='view') def stages_schd(request): type_stage = request.matchdict['type'] cd_mon = request.authenticated_userid member = get_users_by_code(request, cd_mon) code = int(member.secu) groupe = dict({ "A" : "Grp A-5 jrs B", "B" : "Grp B-3 jrs B", "C" : "Grp C-5 jrs B78", "D" : "Grp D-3 jrs B78", "E" : "Grp E", "F" : "Grp F", "G" : "Grp G-B96 en ligne", "H" : "Grp H-B96", "I" : "Grp I-B96", "J" : "Grp J–POST PERMIS VAISE", "K" : "Grp K–POST PERMIS CHARPENNES", "L" : "Grp L–POST PERMIS PRESQUILE", "M" : "Grp M–POST PERMIS VAUGNERAY", "N" : "Gpr N" }) if type_stage == 'M': title = "Stages 2R" groupe = dict({ "A" : "Grp A-Stage 8h", "B" : "Grp B-10h", "C" : "Grp C-Stage 15H", "D" : "Grp D-10h ", "E" : "Grp E-10h", "F" : "Grp F-10h", "G" : "Grp G-10h", "H" : "Grp H-10h", "I" : "Grp I-10h", "J" : "Grp J-10h", "K" : "Grp K-10h", "L" : "Grp L-10h", "M" : "Grp M-10h", "N" : "Gpr N-10h" }) elif type_stage == 'C': title = "Stages PAP" groupe = dict({ "A" : "Grp A-CHARP", "B" : "Grp B-VAUGN", "C" : "Grp C", "D" : "Grp D", "E" : "Grp E", "F" : "Grp F", "G" : "Grp G", "H" : "Grp H", "I" : "Grp I", "J" : "Grp J", "K" : "Grp K", "L" : "Grp L", "M" : "Grp M", "N" : "Gpr N" }) else: title = "Stages B" message = '' if 'form.submitted' in request.params : params = dict(request.params) semaine = get_pla_stage_by_semaine(request,type_stage,params['SEMAINE'],params['GROUPE']) if semaine is None: del params['form.submitted'] params['debut'] = datetime.strptime(request.params['debut']+' '+request.params['starttime'],'%d-%m-%Y %H:%M') if request.params['debut'] != None and request.params['debut'] != '' else None params['fin'] = datetime.strptime(request.params['fin'],'%d-%m-%Y') if request.params['fin'] != None and request.params['fin'] != '' else None del params['starttime'] params['CD_UTI'] = cd_mon params['nom_formateur'] = params['nom_formateur'].split(' | ')[0] params['nom_psy'] = params['nom_psy'].split(' | ')[0] params['VALIDE'] = 'N' params['ROUTE'] = 0 params['DISPO'] = params['TOTAL'] params['DispoRoute'] = 0 # params['DISPO'] = int(params['TOTAL']) - int(params['DISPO']) params['TYPE'] = type_stage insert_pla_stage(request,params) request.session.flash(u"Le stage %s groupe %s est crée avec succès" %(type_stage,params['GROUPE']),'success') else: request.session.flash(u"Le stage %s groupe %s est dejà existé"%(type_stage,params['GROUPE']), 'danger') rows = get_stages(request, type_stage) # construire la liste des events events = [] for row in rows: if row.VALIDE == 'O': color = 'LightGreen' # planning validé = vert pale elif StageHasPending(request, row.TYPE, row.SEMAINE, row.GROUPE) == True : color = "LightPink" # en attente elif row.DISPO > 0 : color = "LightYellow" # disponible else: color = "LightBlue" # complet if type_stage == 'B': url = '/stageb_list/%s/%s/%s/%s' % (row.debut.strftime('%Y-%m-%d'), row.GROUPE, 'A', 'x') elif type_stage == 'M': url = '/stagea_list/%s/%s' % (row.debut.strftime('%Y-%m-%d'), row.GROUPE) else: url = '/stagec_list/%s/%s' % (row.debut.strftime('%Y-%m-%d'), row.GROUPE) json_event = { 'title': '%s - %s %s/%s' % (row.GROUPE, row.LIBELLE, row.DISPO, row.TOTAL), 'start': row.debut.strftime('%Y-%m-%d %H:%M:%S'), 'end': row.fin.strftime('%Y-%m-%d 18:00:00'), 'allDay': False, 'color': color, 'textColor': '#000000', 'url': url, } events.append(json_event) return { 'page_title': title, 'calendar_events': json.dumps(events), 'type_stage': type_stage, "groupe" : groupe, 'message' : message, 'code': code } @view_config(route_name='motos_schd', renderer='../templates/planning/motos_schd.pt', permission='view') def motos_schd(request): # type de planning motos cd_mon = request.authenticated_userid member = get_users_by_code(request, cd_mon) code = int(member.secu) type_stage = request.matchdict['type'] if type_stage == 'I': page_title = "Circuit forfait" elif type_stage == 'R': page_title = "Rendez-vous pédagogique" elif type_stage == 'D': page_title = "Stage code" elif type_stage == 'E': page_title = "Examens blancs B" elif type_stage == 'F': page_title = "Examens blancs A" else: page_title = "Planning 2R" groupe = dict({ "A" : "Grp A-8h à 11h", "B" : "Grp B-12h à 15h", "C" : "Grp C-15h à 18h", "D" : "Grp D-18h à 21h", "E" : "Grp E-8h à 12h", "F" : "Grp F-13h à 17h", "G" : "Grp G-13h à 17h", }) if 'form.submitted' in request.params: params = dict(request.params) params['DATE'] = datetime.strptime(request.params['DATE'],'%d-%m-%Y') if request.params['DATE'] != None and request.params['DATE'] != '' else None exist = get_pla_moto_by_date(request,type_stage,params['GROUPE'],params['DATE']) if not exist : del params['form.submitted'] params['AGENCE'] = member.agence params['CD_UTI'] = cd_mon if 'ROUTE' in params : params['ROUTE_DISPO'] = params['ROUTE'] params['DISPO'] = params['TOTAL'] insert_pla_moto(request,params) request.session.flash(u"Le planning %s groupe %s est crée avec succès" %(type_stage,params['GROUPE']),'success') else: request.session.flash(u"Le planning %s groupe %s est dejà existé"%(type_stage,params['GROUPE']), 'danger') if 'form.duplicated' in request.params : params = dict(request.params) del params['form.duplicated'] start = datetime.strptime(request.params['DATE1'],'%d/%m/%Y') if request.params['DATE1'] != None and request.params['DATE1'] != '' else None dest = datetime.strptime(request.params['DATE2'],'%d/%m/%Y') if request.params['DATE2'] != None and request.params['DATE2'] != '' else None nb = int(request.params['NB']) for i in range(1,nb+1,1): duplicate_pla_moto_by_semaine(request,type_stage,start,dest,code) dest = dest + timedelta(days=7) request.session.flash(u"La duplication du planning %s est exectuté avec succès" %(type_stage),'success') # construire la liste des events rows = get_motos(request, type_stage) events = [] for row in rows: # titre selon le type_stage if type_stage == 'A' or type_stage == 'F': title = '%s - P:%s/%s R:%s/%s' % (row.GROUPE, row.DISPO, row.TOTAL, row.ROUTE_DISPO, row.ROUTE) url = '/planninga_list/%s/%s/%s' % (type_stage, row.DATE, row.GROUPE) elif type_stage == 'I': title = '%s - %s/%s' % (row.GROUPE, row.DISPO, row.TOTAL) url = '/circuit_list/%s/%s' % (row.DATE,row.GROUPE) else: title = '%s - %s/%s' % (row.GROUPE, row.DISPO, row.TOTAL) url = '/motos_list/%s/%s/%s' % (type_stage, row.DATE, row.GROUPE) # couleur de la cellule if row.VALIDE == 'O': color = 'LightGreen' # planning validé = vert pale elif PlanningHasPending(request, row.TYPE, row.DATE, row.GROUPE) == True : color = "LightPink" # en attente elif row.DISPO == 0 and row.ROUTE_DISPO == 0 : color = "LightBlue" # complet else: color = "LightYellow" # disponible if row.LIBELLE == None or len(row.LIBELLE) == 0: comment = '.' else: comment = row.LIBELLE json_event = { 'title': title, 'start': row.DATE.strftime('%Y-%m-%d 08:00:00'), 'end': row.DATE.strftime('%Y-%m-%d 18:00:00'), 'allDay': False, 'color': color, 'textColor': '#000000', 'description': comment, 'url': url, } events.append(json_event) return { 'page_title': page_title, 'calendar_events': json.dumps(events), 'groupe' : groupe, 'type' : type_stage } @view_config(route_name='show_iframe', renderer='../templates/planning/show_iframe.pt', permission='view') def show_iframe(request): logged_in = request.authenticated_userid # lire la fiche du moniteur moniteur = get_users_by_code(request, logged_in) # calculer le jour de l'année d'auj d = date.today() yearday = (d - date(d.year, 1, 1)).days + 1 # calculer la clé du moniteur keyM = int(yearday * d.year / d.day * (ord(logged_in[0]) + ord(logged_in[1]))) param = request.matchdict['param'] choicelist = 'pedagogie-pedagoGL-agences-infos' if param in choicelist: # param = aide et infos iFrame : pvar = 'codeU=%s&Mn=%s&keyM=%s' % (logged_in, moniteur.nom, keyM) iframe_src = "https://suivi-eleve.marietton.com/documents-interne/%s.php?%s" % (param, pvar) elif param == 'smartcode': # param = télécommande code param = 'codeU=%s&Mn=%s&keyM=%s' % (logged_in, moniteur.nom, keyM) iframe_src = "https://www.marietton.com/telecode/indexE.php?%s" % param elif param == 'msgerie': # param = messagerie interne param = 'codeU=%s&Mn=%s&keyM=%s' % (logged_in, moniteur.nom, keyM) iframe_src = "https://suivi-eleve.marietton.com/MSG-messagerie.php?%s" % param elif param == 'dessin': # param = dessin param = 'Mn=%s&codeU=%s&keyM=%s' % (moniteur.nom, logged_in, keyM) iframe_src = "https://suivi-eleve.marietton.com/dessin/index.php?%s" % param elif param == 'listingGL': # param = listing GL param = 'codeU=%s&Mn=%s&keyM=%s' % (logged_in, moniteur.nom, keyM) iframe_src = "http://devng.marietton.com/stagiairePro.php?%s" % param elif param.startswith('suivi-peda-'): # param = suivi pédagogique # code élève est à la fin de param cd_cli = param[-6:] # fiche eleve eleve = get_eleves_by_code(request, cd_cli) keyE = int(yearday * d.year / d.day * eleve.CD_CLI) param = 'codeE=%s&key=%s&Mn=%s&codeU=%s&keyM=%s&En=%s&MnR=%s&filiere=%s&agence=%s&ste=%s&AP=%s&email=%s&permis=%s&formule=%s' % ( cd_cli, keyE, moniteur.nom, logged_in, keyM, eleve.NOMPREN, eleve.CD_MON, eleve.filiere, eleve.AGENCE, eleve.NOM_ENTREPRISE, eleve.annulation_permis, eleve.email, eleve.PERMIS_DEMANDE, eleve.FORMULE) iframe_src = "https://www.suivi-eleve.marietton.com/suivi.php?%s" % param else: if param[:1] == 'R': # rendez-vous pédagogique php_page = 'rvpLotUp.php' elif param[:1] == 'M': # planning 2R php_page = 'comp2RLotUp.php' else: # planning circuit php_page = 'circuitLotUp.php' # param = liste d'élève codes_list = param[1:] codes = codes_list.split("-") # totaliser les codes élève codes_sum = 0 for code in codes: codes_sum += int(code) # calcul des clés élève et moniteur # codeE = concaténation des codes Élèves séparé par un tiret : codeE=672211-661640-271213 # keyE = la même que pour la fiche de suivi sauf que le code élève est remplacé par l’addition de tous les code élève keyE = int(yearday * d.year / d.day * codes_sum) param = 'codeE=%s&key=%s&Mn=%s&codeU=%s&keyM=%s' % (codes_list, keyE, moniteur.nom, logged_in, keyM) iframe_src = "https://suivi-eleve.marietton.com/%s?%s" % (php_page, param) return { 'page_title': "", 'iframe_src': iframe_src, } @view_config(route_name='plannings', renderer='../templates/planning/plannings.pt', permission='view') def plannings(request): logged_in = request.authenticated_userid.lower() # lire la fiche du moniteur moniteur = get_users_by_code(request, logged_in) # calcul des clés élève et moniteur d = date.today() # calculer le jour de l'année d'auj yearday = (d - date(d.year, 1, 1)).days + 1 keyM = int(yearday * d.year / d.day * (ord(logged_in[0]) + ord(logged_in[1]))) url_listeGL = "http://devng.marietton.com/stagiairePro.php?codeU=%s&Mn=%s&keyM=%s" % (logged_in, moniteur.nom, keyM) return { 'page_title': "Les plannings", 'logged_in': logged_in, 'url_listeGL': url_listeGL, } @view_config(route_name='stagea_list', renderer='../templates/planning/stagea_list.pt', permission='view') def stagea_list(request): def generer_datatable(date_stage, groupe): # lire les stages B items = get_stage_lig_by_date(request, 'M', date_stage, groupe) dates_stage = '' date_deb = date.today() date_fin = date.today() # construire la liste liste=[] dates_stage = '' for item in items: # mémoriser les dates du stage dates_stage = '%s au %s' % (item.debut.strftime('%d'), item.fin.strftime('%d-%m-%Y')) date_deb = item.debut.date() date_fin = item.fin # n'affiche que les élèves du moniteur solde = to_euroN(item.solde) if item.perime_le: code_ok = to_age(item.perime_le, '<') else: code_ok = '' # date inscription + date 1er plateau date_plateau = 'Insc.:' + item.cree_le.strftime('%d-%m-%Y') if item.h1plateau_le: date_plateau += ' 1erP.:' + item.h1plateau_le.strftime('%d-%m-%Y') # date examen plateau + route if item.TR_P_DATE: date_examens = '[%s] %s' % (item.TR_P_NB, item.TR_P_DATE.strftime('%d-%m-%Y')) else: date_examens = 'néant' if item.TR_R_DATE: date_examens += ' - [%s] %s' % (item.TR_R_NB, item.TR_R_DATE.strftime('%d-%m-%Y')) else: date_examens += ' - néant' # examen prévu ? examen = get_examens_prevu(request, item.CD_CLI) if examen: if examen.PERMIS == 'ETG': code_ok = 'Inscrit' else: date_examens += ' AP' if item.VALIDE == 'N': heures = '' else: heures = 'VAL' circuit = item.seance if item.cd_circuit: circuit += ' - ' + item.cd_circuit d = (item.CD_CLI, to_str(item.CD_CLI) + ' - ' + item.NOM, solde, code_ok, item.permis_demande, date_plateau, date_examens, str(item.STATUT), item.TYPE + to_str(item.SEMAINE) + item.GROUPE + to_str(item.CD_CLI), item.VALIDE) liste.append(d) return date_deb, date_fin, dates_stage, json.dumps(liste) date_stage = request.matchdict['date'] date_date_stage = datetime.strptime(date_stage,'%Y-%m-%d') weeknumber = date_date_stage.isocalendar()[1] if len(str(weeknumber)) == 1: weeknumber = "0"+str(weeknumber) semaine = str(date_date_stage.year) +''+str(weeknumber) groupe_stage = request.matchdict['groupe'] groupe = dict({ "A" : "Grp A-Stage 8h", "B" : "Grp B-10h", "C" : "Grp C-Stage 15H", "D" : "Grp D-10h ", "E" : "Grp E-10h", "F" : "Grp F-10h", "G" : "Grp G-10h", "H" : "Grp H-10h", "I" : "Grp I-10h", "J" : "Grp J-10h", "K" : "Grp K-10h", "L" : "Grp L-10h", "M" : "Grp M-10h", "N" : "Gpr N-10h" }) url = request.route_url('stagea_list', date=date_stage, groupe=groupe_stage) message = '' cd_mon = request.authenticated_userid member = get_users_by_code(request, cd_mon) if 'form.submitted' in request.params: # des lignes ont été sélectionnées ? if len(request.params) > 1: # oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')]) liste_param = '' for param in request.params: if param[:2] == 'id': cd_cli = request.params[param] # maj le statut de la ligne à 1 update_stage_lig_statut(request, 'M', date_stage, cd_cli) if liste_param: liste_param += "-%s" % cd_cli else: liste_param = cd_cli if liste_param : # suivi 2R return HTTPFound(location=request.route_url('show_iframe', param='M' + liste_param)) else: message = 'Veuillez sélectionner au moins un(e) élève' if 'form.updated' in request.params : params = dict(request.params) stage = get_pla_stage_by_semaine(request,'M',semaine,groupe_stage) del params['form.updated'] params['debut'] = datetime.strptime(request.params['debut']+' '+request.params['starttime'],'%d-%m-%Y %H:%M') if request.params['debut'] != None and request.params['debut'] != '' else None params['fin'] = datetime.strptime(request.params['fin'],'%d-%m-%Y') if request.params['fin'] != None and request.params['fin'] != '' else None del params['starttime'] params['CD_UTI'] = cd_mon params['nom_formateur'] = params['nom_formateur'].split(' | ')[0] params['nom_psy'] = params['nom_psy'].split(' | ')[0] # params['DISPO'] = int(params['TOTAL']) - int(params['DISPO']) update_pla_stage(request,params,'M',semaine,groupe_stage) request.session.flash(u"Le stage 2R groupe %s a été mis à jour avec succès" %groupe_stage,'success') if 'form.validated' in request.params : params = dict(request.params) hashed = to_sha1(params['password']) if 'password' in params else None passed = member.mdp_hash == hashed if hashed == None or passed : if StageHasPending(request,"M",semaine,groupe_stage): request.session.flash(u"Il y a un ou des élèves provisoires dans ce stage. Validation impossible","danger") return HTTPFound(location=url) else: # lire tous les planning items = get_stage_lig_by_date(request, 'M', date_stage, groupe_stage) AGENCE = member.agence stage = get_pla_stage_by_semaine(request,'M',semaine,groupe_stage) date_valeur = stage['fin'] VALIDE = 'O' LIBELLE = groupe[groupe_stage] for item in items : nStatus = 1 if int (item.STATUT) != 0 : nStatus = item.STATUT # update stage ligne and eleve_cpt update_stage_lig_by_cd_cli(request,'M',semaine,groupe_stage,item.CD_CLI,nStatus,VALIDE,AGENCE,item.ligne_cpt,LIBELLE,date_valeur) # update stage update_pla_stage_by_semaine(request,'M',semaine,groupe_stage,AGENCE,VALIDE,member.cd_uti) request.session.flash(u"Le stage est validé avec succés","success") return HTTPFound(location=request.route_url('stages_schd', type='M')) else: request.session.flash(u"Erreur d'authentification" ,'danger') return HTTPFound(location=url) if 'form.deleted' in request.params: items = get_stage_lig_by_date(request, 'M', date_stage, groupe_stage) if len(items) > 0 : request.session.flash(u"Interdiction de suppression, des eleves ont déjà inscrit dans ce stage." ,'danger') return HTTPFound(location=url) else: delete_pla_stage_by_semaine(request,'M',semaine,groupe_stage) request.session.flash(u"Le stage %s groupe %s du %s est supprimé avec success"%('M',groupe_stage,date_stage),"success") return HTTPFound(location=request.route_url('stages_schd', type='M')) if 'form.deleted_selected' in request.params: ids = str(request.params['deleted_selected_inputs']).split('-') stage_edit = get_pla_stage_by_semaine( request, 'M', semaine, groupe_stage) type_stage = 'M' for eleve_id in ids: eleve = get_eleves_by_code(request, eleve_id) rdvb = get_stage_lig_by_cd_cli(request, type_stage, eleve_id) if member.secu < 9 and int(eleve_id) > 100000: isdelayok = isDelaiOK( request, stage_edit['fin'], rdvb['cree_le'].date(), 8) if not isdelayok: request.session.flash(u"Interdiction de suppression de l'éleve %s dans le stage %s groupe %s." % ( eleve['NOM']+" "+eleve['PRENOM'], type_stage, groupe_stage), 'danger') delete_stage_lig_by_cd_cli( request, type_stage, semaine, groupe_stage, eleve_id) request.session.flash(u"L'eleve %s est bien suprimé dans le stage %s groupe_stage %s." % ( eleve['NOM']+" "+eleve['PRENOM'], type_stage, groupe_stage), 'success') return HTTPFound(url) # generer la datatable stage = get_pla_stage_by_semaine(request,'M',semaine,groupe_stage) ispassed = (stage['fin'] - date.today()).days > 0 stage_debut = "" starttime = "" if stage['debut'] != None : stage_debut = stage['debut'].strftime('%d-%m-%Y') starttime = stage['debut'].strftime('%H:%M') stage_fin = stage['fin'].strftime('%d-%m-%Y') if stage['fin'] != None else "" date_deb, date_fin, dates_stage, dt_data = generer_datatable(date_stage, groupe_stage) return { 'page_title': 'Stage 2R du %s' % date_date_stage.strftime('%d-%m-%Y'), 'url': url, 'message': message, 'dt_data': dt_data, 'groupe': groupe, 'stage' : stage, 'stage_debut' : stage_debut, 'stage_fin' : stage_fin, 'ispassed' : ispassed, 'code' : int(member.secu), 'starttime' : starttime, 'codeleve' : stage.TYPE + to_str(stage.SEMAINE) + stage.GROUPE + to_str(0) } @view_config(route_name='planninga_list', renderer='../templates/planning/planninga_list.pt', permission='view') def planninga_list(request): def generer_datatable(type_stage, date_stage, groupe): # lire le planning A items = get_motos_lig_by_date(request, type_stage , date_stage, groupe) dates_stage = '' # construire la liste liste=[] dates_stage = '' for item in items: # mémoriser les dates du stage dates_stage = item.DATE.strftime('%d-%m-%Y') # n'affiche que les élèves du moniteur solde = to_euroN(item.solde) if item.perime_le: code_ok = to_age(item.perime_le, '<') else: code_ok = '' # date 1er plateau if item.h1plateau_le: date_plateau = item.h1plateau_le.strftime('%d-%m-%Y') else: date_plateau = '' # date examen plateau + route if item.TR_P_DATE: date_examens = '[%s] %s' % (item.TR_P_NB, item.TR_P_DATE.strftime('%d-%m-%Y')) if item.tr_p_ok: date_examens += '(OK)' else: date_examens = 'néant' if item.TR_R_DATE: date_examens += ' - [%s] %s' % (item.TR_R_NB, item.TR_R_DATE.strftime('%d-%m-%Y')) else: date_examens += ' - néant' # examen prévu ? examen = get_examens_prevu(request, item.CD_CLI) if examen: if examen.PERMIS == 'ETG': code_ok = 'Inscrit' else: date_examens += ' AP' if item.VALIDE == 'N': heures = '' else: heures = 'VAL' if item.Route == 0: cat = 'P - ' else: cat = 'R - ' cat = cat + item.permis_demande d = (item.CD_CLI, to_str(item.CD_CLI) + ' - ' + item.NOM, solde, code_ok, cat, date_plateau, item.heures, date_examens, str(item.STATUT), item.no_ligne, item.VALIDE) liste.append(d) return dates_stage, json.dumps(liste) type_stage = request.matchdict['type'] date_stage = request.matchdict['date'] groupe = request.matchdict['groupe'] url = request.route_url('planninga_list', type=type_stage, date=date_stage, groupe=groupe) logged_in = request.authenticated_userid member = get_users_by_code(request, logged_in) code = int(member.secu) groupe_stage = dict({ "A" : "Grp A-8h à 11h", "B" : "Grp B-12h à 15h", "C" : "Grp C-15h à 18h", "D" : "Grp D-18h à 21h", "E" : "Grp E-8h à 12h", "F" : "Grp F-13h à 17h", "G" : "Grp G-13h à 17h", }) message = '' # generer la datatable dates_stage, dt_data = generer_datatable(type_stage, date_stage, groupe) # planning A ou TB A if type_stage == "A": page_title = 'Planning 2R du %s' % date_stage else: page_title = 'Test blanc 2R du %s' % date_stage if 'form.submitted' in request.params: # des lignes ont été sélectionnées ? if len(request.params) > 1: # oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')]) liste_param = '' for param in request.params: if param[:2] == 'id': cd_cli = request.params[param] # mise à jour du cd_mon update_motos_lig_cd_mon(request, type_stage, date_stage, cd_cli, logged_in) if liste_param: liste_param += "-%s" % cd_cli else: liste_param = cd_cli if liste_param : # suivi 2R return HTTPFound(location=request.route_url('show_iframe', param='M' + liste_param)) else: message = 'Veuillez sélectionner au moins un(e) élève' formated_date = datetime.strptime(date_stage,'%Y-%m-%d') if date_stage != None and date_stage != '' else None if 'form.updated' in request.params : params = dict(request.params) del params['form.updated'] update_pla_motos(request,type_stage,formated_date,groupe,params) request.session.flash(u"Le stage %s groupe %s a été mis à jour avec succès" %(type_stage,groupe),'success') if 'form.validated' in request.params : params = dict(request.params) diff = (formated_date - datetime.today()).days if diff > 0 : request.session.flash(u"Hmm, il est encore trop tôt pour valider ce planning","danger") return HTTPFound(location=url) if planningHasPending(request,type_stage,formated_date,groupe): request.session.flash(u"Il y a un ou des élèves provisoires dans ce planning. Validation impossible","danger") return HTTPFound(location=url) else: # lire tous les planning items = get_motos_lig_by_date(request, type_stage, formated_date, groupe) planning = get_pla_moto_by_date(request,type_stage,groupe,formated_date) fin_reservation = None VALIDE = 'O' AGENCE = member.agence CD_UTI = member.cd_uti for item in items : nStatus = 1 if int (item.STATUT) != 0 : nStatus = item.STATUT # update planning ligne and eleve_cpt update_motos_lig_by_cd_cli(request,type_stage,formated_date,groupe,item.CD_CLI,nStatus,VALIDE,AGENCE,item.ligne_cpt,item.REF,item.CD_MON) # update planning update_pla_moto_by_date(request,type_stage,formated_date,groupe,AGENCE,VALIDE,member.cd_uti) request.session.flash(u"Le planning est validé avec succés","success") return HTTPFound(location=request.route_url('motos_schd', type=type_stage)) if 'form.deleted' in request.params: items = get_motos_lig_by_date(request, type_stage, formated_date, groupe) if len(items) > 0 : request.session.flash(u"Interdiction de suppression, des eleves ont déjà inscrit dans ce planning." ,'danger') return HTTPFound(location=url) else: delete_pla_moto_by_date(request,type_stage,formated_date,groupe) request.session.flash(u"Le planning %s groupe %s du %s est supprimé avec success"%(type_stage,groupe,date_stage),"success") return HTTPFound(location=request.route_url('motos_schd', type=type_stage)) if 'form.deleted_selected' in request.params: ids = str(request.params['deleted_selected_inputs']).split('-') for eleve_id in ids: eleve = get_eleves_by_code(request, eleve_id) delete_pla_moto_by_cd_cli( request, type_stage, groupe, formated_date, eleve_id) request.session.flash(u"L'eleve %s est bien suprimé dans le planning %s groupe_stage %s." % ( eleve['NOM']+" "+eleve['PRENOM'], type_stage, groupe), 'success') return HTTPFound(url) stage = get_pla_moto_by_date(request,type_stage,groupe,formated_date) if not stage : request.session.flash(u"Planning non trouvé","danger") return HTTPFound(location=request.route_url('motos_schd', type=type_stage)) return { 'page_title': page_title, 'url': url, 'message': message, 'type': type_stage, 'dt_data': dt_data, 'stage' : stage, 'groupe' : groupe_stage, 'grp' : groupe, 'date':date_stage, 'code':code, 'codeleve' : to_str(0) } @view_config(route_name='stagec_list', renderer='../templates/planning/stagec_list.pt', permission='view') def stagec_list(request): def generer_datatable(date_stage, groupe): # lire les stages B items = get_stage_lig_by_date(request, 'C', date_stage, groupe) dates_stage = '' date_deb = date.today() date_fin = date.today() # construire la liste liste=[] dates_stage = '' for item in items: # mémoriser les dates du stage dates_stage = '%s au %s' % (item.debut.strftime('%d'), item.fin.strftime('%d-%m-%Y')) date_deb = item.debut.date() date_fin = item.fin # n'affiche que les élèves du moniteur solde = to_euroN(item.solde) # date inscription inscrit_le = item.cree_le.strftime('%d-%m-%Y') if item.VALIDE == 'N': heures = '' else: heures = 'VAL' d = (item.CD_CLI, to_str(item.CD_CLI) + ' - ' + item.NOM, solde, item.permis_demande, inscrit_le, item.LIEU, str(item.STATUT), item.TYPE + to_str(item.SEMAINE) + item.GROUPE + to_str(item.CD_CLI), item.VALIDE) liste.append(d) return date_deb, date_fin, dates_stage, json.dumps(liste) groupe = dict({ "A" : "Grp A-CHARP", "B" : "Grp B-VAUGN", "C" : "Grp C", "D" : "Grp D", "E" : "Grp E", "F" : "Grp F", "G" : "Grp G", "H" : "Grp H", "I" : "Grp I", "J" : "Grp J", "K" : "Grp K", "L" : "Grp L", "M" : "Grp M", "N" : "Gpr N" }) date_stage = request.matchdict['date'] groupe_stage = request.matchdict['groupe'] url = request.route_url('stagec_list', date=date_stage, groupe=groupe_stage) date_date_stage = datetime.strptime(date_stage,'%Y-%m-%d') weeknumber = date_date_stage.isocalendar()[1] if len(str(weeknumber)) == 1: weeknumber = "0"+str(weeknumber) semaine = str(date_date_stage.year) +''+str(weeknumber) message = '' cd_mon = request.authenticated_userid member = get_users_by_code(request, cd_mon) if 'form.submitted' in request.params: # des lignes ont été sélectionnées ? if len(request.params) > 1: # oui, NestedMultiDict([('form.submitted', ''), ('id0', '271246'), ('id1', '370929')]) liste_param = '' for param in request.params: if param[:2] == 'id': if liste_param: liste_param += "-%s" % request.params[param] else: liste_param = request.params[param] if liste_param : # suivi PAP return HTTPFound(location=request.route_url('show_iframe', param='M' + liste_param)) else: message = 'Veuillez sélectionner au moins un(e) élève' if 'form.validated' in request.params : params = dict(request.params) hashed = to_sha1(params['password']) if 'password' in params else None passed = member.mdp_hash == hashed if hashed == None or passed : if StageHasPending(request,"C",semaine,groupe_stage): request.session.flash(u"Il y a un ou des élèves provisoires dans ce stage. Validation impossible","danger") return HTTPFound(location=url) else: # lire tous les planning items = get_stage_lig_by_date(request, 'C', date_stage, groupe_stage) AGENCE = member.agence stage = get_pla_stage_by_semaine(request,'C',semaine,groupe_stage) date_valeur = stage['fin'] VALIDE = 'O' LIBELLE = groupe[groupe_stage] for item in items : nStatus = 1 if int (item.STATUT) != 0 : nStatus = item.STATUT # update stage ligne and eleve_cpt update_stage_lig_by_cd_cli(request,'C',semaine,groupe_stage,item.CD_CLI,nStatus,VALIDE,AGENCE,item.ligne_cpt,LIBELLE,date_valeur) # update stage update_pla_stage_by_semaine(request,'C',semaine,groupe_stage,AGENCE,VALIDE,member.cd_uti) request.session.flash(u"Le stage est validé avec succés","success") return HTTPFound(location=request.route_url('stages_schd', type='C')) else: request.session.flash(u"Erreur d'authentification" ,'danger') return HTTPFound(location=url) if 'form.updated' in request.params : params = dict(request.params) stage = get_pla_stage_by_semaine(request,'C',semaine,groupe_stage) del params['form.updated'] params['debut'] = datetime.strptime(request.params['debut']+' '+request.params['starttime'],'%d-%m-%Y %H:%M') if request.params['debut'] != None and request.params['debut'] != '' else None params['fin'] = datetime.strptime(request.params['fin'],'%d-%m-%Y') if request.params['fin'] != None and request.params['fin'] != '' else None del params['starttime'] params['CD_UTI'] = cd_mon params['nom_formateur'] = params['nom_formateur'].split(' | ')[0] params['nom_psy'] = params['nom_psy'].split(' | ')[0] # params['DISPO'] = int(params['TOTAL']) - int(params['DISPO']) update_pla_stage(request,params,'C',semaine,groupe_stage) request.session.flash(u"Le stage PAP groupe %s a été mis à jour avec succès" %groupe_stage,'success') if 'form.deleted' in request.params: items = get_stage_lig_by_date(request, 'C', date_stage, groupe_stage) if len(items) > 0 : request.session.flash(u"Interdiction de suppression, des eleves ont déjà inscrit dans ce stage." ,'danger') return HTTPFound(location=url) else: delete_pla_stage_by_semaine(request,'C',semaine,groupe_stage) request.session.flash(u"Le stage %s groupe %s du %s est supprimé avec success"%('C',groupe_stage,date_stage),"success") return HTTPFound(location=request.route_url('stages_schd', type='C')) if 'form.deleted_selected' in request.params: ids = str(request.params['deleted_selected_inputs']).split('-') stage_edit = get_pla_stage_by_semaine( request, 'C', semaine, groupe_stage) type_stage = 'C' for eleve_id in ids: eleve = get_eleves_by_code(request, eleve_id) rdvb = get_stage_lig_by_cd_cli(request, type_stage, eleve_id) if member.secu < 9 and int(eleve_id) > 100000: isdelayok = isDelaiOK( request, stage_edit['fin'], rdvb['cree_le'].date(), 8) if not isdelayok: request.session.flash(u"Interdiction de suppression de l'éleve %s dans le stage %s groupe %s." % ( eleve['NOM'] + " " + eleve['PRENOM'], type_stage, groupe_stage), 'danger') delete_stage_lig_by_cd_cli( request, type_stage, semaine, groupe_stage, eleve_id) request.session.flash(u"L'eleve %s est bien suprimé dans le stage %s groupe_stage %s." % ( eleve['NOM'] + " " + eleve['PRENOM'], type_stage, groupe_stage), 'success') return HTTPFound(url) # generer la datatable stage = get_pla_stage_by_semaine(request,'C',semaine,groupe_stage) ispassed = (stage['fin'] - date.today()).days > 0 stage_debut = "" starttime = "" if stage['debut'] != None : stage_debut = stage['debut'].strftime('%d-%m-%Y') starttime = stage['debut'].strftime('%H:%M') stage_fin = stage['fin'].strftime('%d-%m-%Y') if stage['fin'] != None else "" date_deb, date_fin, dates_stage, dt_data = generer_datatable(date_stage, groupe_stage) return { 'page_title': 'Stage PAP du %s' % date_date_stage.strftime('%d-%m-%Y'), 'url': url, 'message': message, 'dt_data': dt_data, 'groupe': groupe, 'stage' : stage, 'stage_debut' : stage_debut, 'stage_fin' : stage_fin, 'code' : member.secu, 'ispassed' : ispassed, 'starttime' : starttime, 'codeleve' : stage.TYPE + to_str(stage.SEMAINE) + stage.GROUPE + to_str(0) } @view_config(route_name='planifier', renderer='../templates/planning/planifier.pt', permission='view') def planifier(request): def generer_planning(agence, cd_mon, datedeb, datefin): # construire la liste des rdv du moniteurs rows = get_rendez_vous_moniteur(request, agence, cd_mon, datedeb, datefin) events = [] for row in rows: if row.comment == None: comment = '' else: comment = row.comment if row.NOM_ENTREPRISE : etoile = ' (E)' else: etoile = '' nom = row.nom + etoile # déterminer la couleur de l'event if row.date_valeur : color = 'LightGreen' # rdv validé = vert pale else: if to_int(row.ref) != row.cd_cli : if row.statut > 1 : color = 'DeepPink' # rdv élève décommandé if row.statut == 10 or row.statut == 15 : color = 'LightGray' # moniteur absent elif row.fin_reservation : color = 'LightPink' # résa = LightPink else: color = 'LightYellow' # rdv élève = jaune pale if row.circuit == 1: color = 'Gold' # gold elif row.circuit == 2: color = 'Plum' # Plum elif row.circuit == 3: color = 'YellowGreen' # YellowGreen elif row.circuit == 4: color = 'DeepSkyBlue' # DeepSkyBlue elif row.circuit == 5: color = 'LimeGreen' # LimeGreen elif row.circuit == 6: color = 'GoldenRod' # Marron else: if row.cd_cli == 99995 : color = 'White' # résa web = couleur blanc) elif row.cd_cli == 1 : color = 'Gainsboro' # /////// else: color = 'LightBlue' # activité if row.statut == 10 or row.statut == 15 : color = 'LightGray' # moniteur absent json_event = { 'title': nom, 'start': '%s %02d:00:00' % (row.DATE.strftime('%Y-%m-%d'), row.noplan), 'end': '%s %02d:00:00' % (row.DATE.strftime('%Y-%m-%d'), row.noplan + row.qte), 'description': comment, 'allDay': False, 'color': color, 'textColor': '#000000', 'url': '/activ_edit/%s' % (row.no_ligne), } events.append(json_event) return json.dumps(events) logged_in = request.authenticated_userid.upper() TODAY = date.today() # récupérer les paramètres de l'appel de la view datePlan = request.matchdict['date'] if datePlan == '6mois': # la plannification des activités se fait 6 mois à l'avance datePlan = TODAY + relativedelta(months=6) else: datePlan = datetime.strptime(datePlan,'%Y-%m-%d') cd_mon = request.matchdict['cd_mon'] if cd_mon == 'codeMon': cd_mon,cd_mon_B78 = get_user_cd_mon(request, logged_in) # si cd_mon a été changé par le user if 'cd_mon' in request.params: cd_mon = request.params["cd_mon"] url = request.route_url('planifier', cd_mon=cd_mon, date=datePlan.strftime('%Y-%m-%d')) member = get_users_by_code(request, logged_in) if not member: request.session.flash(u"Moniteur %s introuvable" % (logged_in), 'danger') return HTTPFound(location=request.route_url("home")) agence = member.agence QTE = 1 message = '' # -- CREER une semaine type if 'form.submitted' in request.params: if 'alterne' in request.params: increment = 2 else: increment = 1 # insérer la semaine type sélectionnée semaine = request.params['semaine'] QTE = int(request.params['QTE']) dateRDV = datetime.strptime(request.params['dateRDV'],'%d-%m-%Y') # date de départ = Lundi dateDepart = dateRDV - timedelta(days = dateRDV.weekday()) insert_semaine_type(request, cd_mon, semaine, dateDepart, QTE, increment, agence, logged_in) request.session.flash(u"La semaine type a été insérée avec succès.", 'success') # afficher le formulaire à partir de cette date return HTTPFound(location=request.route_url('planifier', cd_mon=cd_mon, date=dateDepart.strftime('%Y-%m-%d'))) # début = date - 3 semaines d = datePlan + relativedelta(weeks=-3) datedeb = d.strftime('%Y-%m-%d') # fin = date + 6 mois d = datePlan + relativedelta(months=+6) datefin = d.strftime('%Y-%m-%d') # lire les moniteurs moniteurs = get_moniteurs_by_aff(request, agence, datedeb, datefin) #sort moniteur , mettre B78 à la fin moniteurs.sort(key=lambda m: str(m.PLANNING) == "B", reverse=True) moniteursB = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "B"] moniteursB78 = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "B78"] moniteurs2R = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "2R"] moniteursGL = [moniteur for moniteur in moniteurs if moniteur.PLANNING == "GL"] moniteurs = [moniteursB,moniteurs2R,moniteursGL,moniteursB78] # generer le planning B calendar_events = generer_planning(agence, cd_mon, datedeb, datefin) # le type de planning du moniteur moniteur = get_moniteur_by_code(request,cd_mon) type_planning = moniteur.PLANNING # lire les semaines type p_semaines = get_p_semaines(request, type_planning) semaine = '' return { 'page_title': "Activités de %s (agence %s)" % (cd_mon, agence), 'url': url, 'datePlan': datePlan.strftime('%Y-%m-%d'), 'message': message, 'calendar_events': calendar_events, 'moniteurs': moniteurs, 'cd_mon': cd_mon, 'type_planning': type_planning, 'agence' : agence, 'p_semaines': p_semaines, 'semaine': semaine, 'QTE': QTE, } @view_config(route_name='activ_edit', renderer='../templates/planning/activ_edit.pt') def activ_edit(request): logged_in = request.authenticated_userid cd_mon,cd_mon_B78 = get_user_cd_mon(request, logged_in) no_ligne = request.matchdict['no_ligne'] rdvb = get_rendezvous_by_noligne(request, no_ligne) url = request.route_url('activ_edit', no_ligne=no_ligne) location = request.route_url("planifier", cd_mon=rdvb.CD_MON, date=rdvb.DATE.strftime('%Y-%m-%d')) message = '' if 'form.submitted' in request.params: qte = int(request.params['QTE']) if qte < 1 or qte > 12: message = "Le nombre d'heures est incorrect" else: update_rdvb(request, no_ligne, rdvb.CD_CLI, rdvb.CD_CLI, rdvb.DATE.strftime('%Y-%m-%d'), rdvb.NoPlan, qte, rdvb.REF, rdvb.CD_MON, rdvb.AGENCE, request.params['COMMENT'], 0, 0, 0, rdvb.cd_cli_old, logged_in) request.session.flash(u"Le rendez-vous a été mis à jour avec succès.", 'success') return HTTPFound(location=location) if 'form.deleted' in request.params: # user autorisé ? userAcces = get_user_access(request, logged_in) if userAcces < 6: message = "Vous n'êtes pas autorisé à effectuer cette opération !" else: delete_eleve_cpt(request, no_ligne, rdvb.CD_CLI, rdvb.NoPlan, rdvb.STATUT, rdvb.CD_UTI) request.session.flash(u"Le rendez-vous a été supprimer avec succès.", 'success') return HTTPFound(location=location) return { 'page_title': 'Activité du %s à %s h' % (rdvb.DATE.strftime('%d-%m-%Y'), rdvb.NoPlan), 'url': url, 'rdvb': rdvb, 'message': message, 'back' : location }