Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
 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")
Ejemplo n.º 3
0
 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")
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
 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")
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
 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