def login(): if current_user is not None \ and current_user.is_authenticated: flash('Vous êtes déjà identifié-e.') return redirect(url_for('suivi_index')) form = LoginForm(request.form) #, nexturl=request.args['next']) if request.args and request.args.get('next'): form.nexturl.data = request.args['next'] if request.method == 'POST' and form.validate(): username = request.form.get('username') password = request.form.get('password') rememberme = request.form.get('rememberme') user = User.get_user(username) auth_ok, auth_db_ok, auth_ldap_ok = False, False, False if user and not user.is_ldap_user(): # Avoid database request if not useful try: auth_db_ok = User.try_db_login(username, password) except: raise auth_ok = auth_db_ok if not auth_ok and app.config['USE_LDAP']: try: auth_ldap_ok = User.try_ldap_login(username, password) except: raise finally: auth_ok = auth_ldap_ok if not auth_ok: flash('Login ou mot de passe invalide. Veuillez ré-essayer', 'danger') return render_template('login.html', form=form) if type(auth_ok) == type((1,)) and len(auth_ok) > 1: session.update(gecos = auth_ok[1]) user_email = auth_ok[2] else: user_email = None if not user and auth_ldap_ok: user = User(username, password='******', email=user_email) db_session.add(user) db_session.commit() user.authenticate() login_user(user, remember = rememberme) flash(gettext('Identification réussie.'), 'auth success') nexturl = request.form.get('nexturl') # next_is_valid should check if the user has valid # permission to access the `next` url # FIXME #if not next_is_valid(nexturl): # return flask.abort(400) return redirect(nexturl or url_for('suivi_index')) if form.errors: flash(form.errors, 'danger') return render_template('login.html', form=form)
def modif_date_cloture(self, form, date): f = self.query.get(form) f.date_cloture_inscriptions = date db_session.add(f) try: db_session.commit() except: raise IntegrityError("Unknown error")
def modif_attributs(self, evt, **kwargs): e = self.query.get(evt) for a in ['titre', 'sstitre', 'lieu']: if kwargs.has_key(a) and kwargs[a]: setattr(e, a, kwargs[a]) db_session.add(e) try: db_session.commit() except: raise IntegrityError("Unknown error")
def post(self): from werkzeug.datastructures import FileStorage parser = reqparse.RequestParser() parser.add_argument( 'id', required=True, help=lazy_gettext("L'événement concerné doit être spécifié")) parser.add_argument('csvfile', type=FileStorage, location='files') args = parser.parse_args() try: id_evenement = int(args['id']) except: raise ValueError("'%s' is not a valid form id" % args['id']) # le CSV contient nom;prenom;institution;fonction rows = [] try: lines = args['csvfile'].readlines() for l in lines[1:]: l = l.strip().decode('utf-8') if not l: continue r = [x.strip()[:70] for x in l.split('\t')] if len(r) < 4: r = [x.strip()[:70] for x in l.split(';')] if len(r) < 4: r = [x.strip()[:70] for x in l.split(',')] if len(r) > 3: rows.append(r) except: return gettext("'%s' is not a valid CSV file" % args['csvfile']) # ajouter les personnes et les inscriptions, puis générer les codes personnels num_inscriptions_ajoutees = 0 for r in rows: personne, inscription = None, None personne = Personne.query.filter_by(nom=r[0], prenom=r[1]).first() if personne: inscription = Inscription.query.filter_by( id_personne=personne.id, id_evenement=args['id']).first() else: personne = Personne(nom=r[0], prenom=r[1]) if not inscription: num_inscriptions_ajoutees += 1 inscription = Inscription(id_evenement=args['id'], personne=personne, institution=r[2]) inscription.institution = r[2] inscription.fonction = r[3] if not inscription.token: inscription.genere_token() db_session.add(inscription) db_session.commit() return "Nombre de lignes traitées : %d\nNombre d'inscriptions ajoutées : %d" % ( len(rows), num_inscriptions_ajoutees)
def createuser(): form = UserForm() if form.validate_on_submit(): deja = User.get_user(form.username.data) if deja: flash(gettext('Cet utilisateur existe déjà')) return render_template('createuser.html', form=form) hashed = User.hash_pwd(form.password.data) newuser = User(username=form.username.data, password=hashed, gecos=form.gecos.data) db_session.add(newuser) db_session.commit() flash(gettext('L\'utilisateur \'{username}\' a bien été créé').format(username=form.username.data)) return redirect(url_for('index')) return render_template('createuser.html', form=form)
def get(self): parser = reqparse.RequestParser() parser.add_argument('id', required=True, help="Le formulaire à modifier doit être spécifié") parser.add_argument('datecloture', required=True, help="Date de clôture à modifier ?") args = parser.parse_args() from .emails import envoyer_mail_modification_formulaire try: id_formulaire = int(args['id']) except: raise ValueError("'%s' is not a valid form id" % args['id']) try: date_cloture = datetime.datetime.strptime( args['datecloture'], '%Y-%m-%d').strftime('%Y-%m-%d') except: raise ValueError("'%s' is not a valid date" % args['datecloture']) f = Formulaire.query.get(id_formulaire) if str(f.date_cloture_inscriptions) == date_cloture: return f.date_cloture_inscriptions = date_cloture db_session.add(f) try: db_session.commit() except: raise IntegrityError("Unknown error") emails_or_uids_organisateurs = Evenement.get_emails_or_uids_organisateurs( f.evenement.id) envoyer_mail_modification_formulaire( emails_or_uids_organisateurs, f.evenement, date_cloture_inscriptions=f.date_cloture_inscriptions.strftime( '%d/%m/%Y')) return f.date_cloture_inscriptions.strftime("%d/%m/%Y")
def new(formulaire_id=None): if formulaire_id: # Édition d'un formulaire déjà créé formulaire = Formulaire.query.get(formulaire_id) # Vérifier qu'on a bien les droits if int(formulaire_id) in get_current_user_forms(): form = FormulaireForm(obj=formulaire) if formulaire.evenement.lieu: form.evenement.lieu.data = formulaire.evenement.id_lieu if formulaire.evenement.organisateurs: form.evenement.organisateurs.data = [ u.id for u in formulaire.evenement.organisateurs ] print(form.data) else: flash(gettext('Vous n\'avez pas les droits d\'accès à cette page'), 'error') form = FormulaireForm() else: # Formulaire tout neuf form = FormulaireForm() if form.validate_on_submit(): if form.evenement.organisateurs.data: organisateurs = [ User.query.get(ident) for ident in form.evenement.organisateurs.data ] else: form.evenement.organisateurs.data = [current_user.id] organisateurs = [current_user] if form.evenement.lieu.data: lieu = Lieu.query.get(form.evenement.lieu.data) else: lieu = None if formulaire_id: formulaire.evenement.titre = form.evenement.titre.data formulaire.evenement.sstitre = form.evenement.sstitre.data formulaire.evenement.date = form.evenement.date.data formulaire.evenement.date_fin = form.evenement.date_fin.data formulaire.evenement.recurrence = form.evenement.recurrence.data formulaire.evenement.lieu = lieu formulaire.evenement.organisateurs = organisateurs formulaire.date_ouverture_inscriptions = form.date_ouverture_inscriptions.data formulaire.date_cloture_inscriptions = form.date_cloture_inscriptions.data else: evenement = Evenement(titre=form.evenement.titre.data, sstitre=form.evenement.sstitre.data, date=form.evenement.date.data, date_fin=form.evenement.date_fin.data, recurrence=form.evenement.recurrence.data, lieu=lieu) evenement.organisateurs = organisateurs formulaire = Formulaire( evenement=evenement, date_ouverture_inscriptions=form.date_ouverture_inscriptions. data, date_cloture_inscriptions=form.date_cloture_inscriptions.data) if form.champ_restauration_1.data: formulaire.champ_restauration_1 = True formulaire.texte_restauration_1 = form.texte_restauration_1.data else: formulaire.champ_restauration_1 = False formulaire.texte_restauration_1 = None if form.champ_libre_1.data: formulaire.champ_libre_1 = True formulaire.texte_libre_1 = form.texte_libre_1.data else: formulaire.champ_libre_1 = False formulaire.texte_libre_1 = None if formulaire.evenement.recurrence: formulaire.evenement.calcule_recurrence() formulaire.jour_par_jour = True db_session.add(formulaire) try: db_session.commit() except IntegrityError as err: db_session.rollback() flash( lazy_gettext( "Un événement a déjà été créé de même date et même titre"), 'erreur') # unicité titre + date + organisation if "uc_even" in str(err.orig): flash( lazy_gettext( "Vous avez déjà créé un événement à la même date, avec le même titre !" ), 'erreur') if "uc_form" in str(err.orig): flash( lazy_gettext( "Un formulaire existe déjà pour cet évenement, avec la même date d'ouverture des inscriptions !" ), 'erreur') else: url_formulaire = request.url_root + url_for('soco', flform=formulaire.id) url_parts = url_formulaire.split('//') # enlever les '//' internes url_formulaire = url_parts[0] + '//' + '/'.join(url_parts[1:]) if formulaire_id: flash(gettext("Votre formulaire a bien été modifié."), 'info') else: flash(gettext("Votre formulaire a bien été créé."), 'info') flash( gettext("Voici son URL : <a href=\"" + url_formulaire + "\">" + url_formulaire + "</a>"), 'url') return redirect(url_for('suivi_index')) return render_template('new.html', form=form, avec_recurrence=app.config['AVEC_RECURRENCE'], formulaire_id=formulaire_id, current_user=current_user)
def soco(flform, token=None): formulaire = Formulaire.query.filter_by(id=flform).first() if not formulaire: return render_template('404.html') evenement = formulaire.evenement # Vérification pour le cas 'Intervenant' speaker = False if token: intervenant = Intervenant.check_token(evenement.id, token) if intervenant: speaker = True # Choix des logos logo, url = evenement.infos_comm() if evenement.entite_organisatrice: logo0, url0 = evenement.entite_organisatrice.infos_comm() if logo0 == logo: logo0 = LOGO_DEFAULT if url0 == url: url0 = URL_DEFAULT else: logo0, url0 = LOGO_DEFAULT, URL_DEFAULT logofilename0, logofilename = afflogo(logo0), "" if logo: logofilename = afflogo(logo) if speaker: form = IntervenantForm(formulaire) deja_personne = intervenant.inscription.personne inscription = intervenant.inscription else: # avant ou après l'heure, ce n'est pas l'heure de s'inscrire. Sauf pour les responsables d'événements if formulaire.date_cloture_inscriptions < datetime.date.today(): return render_template( 'erreur.html', msg=gettext( 'Les inscriptions pour cet événement sont closes !')) elif formulaire.date_ouverture_inscriptions > datetime.date.today( ) and not formulaire.id in get_current_forms(): return render_template( 'erreur.html', msg=gettext( 'Les inscriptions pour cet événement ne sont pas encore ouvertes !' )) form = InscriptionForm(formulaire) deja_personne = None inscription = None if form.validate_on_submit(): # FIXME mieux gérer le cas où la personne (intervenant) a modifié les infos ci-dessous personne = Personne.query.filter_by(nom=form.nom.data, prenom=form.prenom.data, email=form.email.data).first() if personne == None: personne = Personne(nom=form.nom.data, prenom=form.prenom.data, email=form.email.data) if inscription == None: inscription = Inscription(evenement=evenement, personne=personne) inscription.genere_token() inscription.badge1 = form.badge1.data inscription.badge2 = form.badge2.data if form.telephone.data: inscription.telephone = form.telephone.data if form.fonction.data: inscription.fonction = form.fonction.data if form.organisation.data: inscription.organisation = form.organisation.data inscription.date_inscription = datetime.datetime.now() # Champs facultatifs if formulaire.champ_attestation and form.attestation_demandee.data: inscription.attestation_demandee = form.attestation_demandee.data if formulaire.champ_type_inscription and form.type_inscription.data: inscription.type_inscription = form.type_inscription.data jours_de_presence = None if form.jours_de_presence.data: jours_de_presence = [] for k, v in request.values.items(): if k[:4] == "jour": jours_de_presence.append(k[5:]) inscription.jours_de_presence = ' '.join(jours_de_presence) if formulaire.champ_restauration_1 and form.inscription_repas_1.data: inscription.inscription_repas_1 = form.inscription_repas_1.data if formulaire.champ_restauration_2 and form.inscription_repas_2.data: inscription.inscription_repas_2 = form.inscription_repas_2.data if formulaire.champ_libre_1 and form.reponse_question_1.data: inscription.reponse_question_1 = form.reponse_question_1.data if formulaire.champ_libre_2 and form.reponse_question_2.data: inscription.reponse_question_2 = form.reponse_question_2.data db_session.add(inscription) if speaker: for attrname in [ 'besoin_materiel', 'transport_aller', 'ville_depart_aller', 'horaire_depart_aller', 'transport_retour', 'ville_arrivee_retour', 'horaire_depart_retour' ]: field = getattr(form, attrname) if field.data: setattr(intervenant, attrname, field.data) hebergements = [] for k, v in request.values.items(): if k[:4] in ['nuit', 'midi', 'soir'] and v == 'on': hebergements.append(k) intervenant.hebergements = ' '.join(hebergements) db_session.add(intervenant) print("intervenant=", intervenant) try: db_session.commit() except IntegrityError as err: db_session.rollback() if speaker: flash(lazy_gettext("Erreur d'intégrité"), 'erreur') if "uc_intv" in str(err.orig): flash( lazy_gettext( "Vous avez déjà fourni vos informations !"), 'erreur') else: flash(lazy_gettext("Erreur d'intégrité"), 'erreur') if "uc_porg" in str(err.orig): flash( lazy_gettext( "Vous vous êtes déjà inscrit-e avec ces mêmes nom, prénom et organisation !" ), 'erreur') if "uc_pers" in str(err.orig): flash( lazy_gettext( "Vous vous êtes déjà inscrit-e avec ces mêmes nom, prénom et adresse électronique !" ), 'erreur') if "uc_insc" in str(err.orig): flash( lazy_gettext( "Vous êtes déjà inscrit-e à cet événement !"), 'erreur') else: confirmer_inscription(personne.email, formulaire.evenement, jours=jours_de_presence) nb_inscrits = len(evenement.inscription) capacite_lieu = evenement.lieu.capacite if capacite_lieu and capacite_lieu > 0: pourcentage_anterieur = (nb_inscrits - 1) * 100 / capacite_lieu pourcentage = nb_inscrits * 100 / capacite_lieu if (pourcentage_anterieur < 80 and pourcentage >= 80) \ or (pourcentage_anterieur < 90 and pourcentage >= 90) \ or (pourcentage_anterieur < 100 and pourcentage >= 100) \ or (pourcentage_anterieur < 110 and pourcentage >= 110) \ or (pourcentage_anterieur < 120 and pourcentage >= 120) \ or (pourcentage_anterieur < 150 and pourcentage >= 150) \ or (pourcentage_anterieur < 200 and pourcentage >= 200): envoyer_mail_capacite_salle(formulaire.evenement, nb_inscrits, capacite_lieu) if speaker: flash(gettext("Vos informations ont bien été enregistrées.")) else: flash(gettext("Votre inscription a bien été effectuée.")) if app.config['AVEC_QRCODE']: flash( gettext( "Ce code graphique vous permettra d'entrer sur les lieux de l'événement, conservez-le !" )) url_verif = app.config['URL_APPLICATION'] + '/verif/%s/%s' % ( evenement.id, inscription.token) qrstring = gettext( "SoCo - Événement {evt} : {prenom} {nom} est inscrit-e sous le numéro {num}.\n{url}" ).format(evt=evenement.titre, prenom=personne.prenom, nom=personne.nom, num=inscription.id, url=url_verif) print(qrstring) else: qrstring = '' return render_template('end.html', evenement=evenement, logofilename=logofilename, qrstring=qrstring, lienevt=url) return render_template('flform.html', form=form, formulaire=formulaire, evenement=evenement, speaker=speaker, intervenant=deja_personne, logofilename0=logofilename0, logofilename=logofilename, url0=url0, lienevt=url, current_user=current_user)
def get(self): parser = reqparse.RequestParser() parser.add_argument( 'id', required=True, help=lazy_gettext("L'événement concerné doit être spécifié")) parser.add_argument( 'nom', required=True, help=lazy_gettext("Nom de l'interven. à inviter ?")) parser.add_argument( 'prenom', required=False, help=lazy_gettext("Prénom de l'interven. à inviter")) parser.add_argument( 'email', required=True, help=lazy_gettext( "Adresse électronique de l'interven. à inviter ?")) parser.add_argument('msg', required=False, help=lazy_gettext("Message d'invitation")) args = parser.parse_args() # ajouter une inscription et un intervenant, puis générer le code personnel personne = Personne.query.filter_by(email=args['email']).first() if personne and args['prenom'] and not personne.prenom: personne.prenom = args['prenom'] if not personne and args['prenom']: personne = Personne.query.filter_by(nom=args['nom'], prenom=args['prenom']).first() if not personne: personne = Personne(nom=args['nom'], email=args['email']) if args['prenom']: personne.prenom = args['prenom'] inscription = Inscription.query.filter_by( id_personne=personne.id, id_evenement=args['id']).first() if not inscription: inscription = Inscription(id_evenement=args['id'], personne=personne) inscription.genere_token() token = inscription.token deja_intervenant = False intervenant = Intervenant.query.filter_by( id_inscription=inscription.id).first() if intervenant: deja_intervenant = True else: intervenant = Intervenant(inscription=inscription) db_session.add(intervenant) db_session.commit() from .emails import envoyer_invitation_intervenant try: id_evenement = int(args['id']) except: raise ValueError("'%s' is not a valid event id" % args['id']) e = Evenement.query.get(id_evenement) emails_or_uids_organisateurs = Evenement.get_emails_or_uids_organisateurs( args['id']) envoyer_invitation_intervenant(e, emails_or_uids_organisateurs, args['email'], token, args['msg']) if deja_intervenant: return False return True