コード例 #1
0
def update_password():
    """
    Mettre à jour son mot de passe.

    Lors de la mise à jour, on vérifie que l'utilisateur connait bien le mot de passe actuel,
    afin d'éviter les reset par des tierces personnes sur des sessions ouvertes.

    POST : "commit" les données
    """

    res = {}
    res["content"] = None
    res["csrf_token"] = generate_csrf_token()
    res["success"] = False


    # Confirmer
    form = user.change_password_form(request.form)
    form_confirmed = form.validate()

    # verifier que l'ancien mot de passe est le bon
    password_confirmed = user.confirm_password(current_user.id, form.old_password.data)
    if not password_confirmed:
        app.logger.warning("UPDATE PASS - wrong password for user with id %s", current_user.id)
        form.old_password.errors = ['Ancien mot de passe incorrect']

    # si tout va bien, mettre a jour.
    if form_confirmed and password_confirmed:
        result = user.update_password_by_id(current_user.id, form.old_password.data, form.new_password.data)
        if result:
            app.logger.info("UPDATE PASS - successfully changed password  for user with id %s", current_user.id)
            flash("Mot de passe correctement mis à jour", "success")

            res["success"] = True
            return json.dumps(res)

        else:
            app.logger.error("UPDATE PASS - error changing password  for user with id %s", current_user.id)
            flash("Problème à la mise à jour, contacter l'administrateur", "danger")

    res["content"] = render_template('annuaire/profile/_password.html', password_form = form)


    return json.dumps(res)
コード例 #2
0
def ancien(id_ancien):
    """
    Afficher le profil d'un ancien.

    Si l'ancien est l'ancien associé à l'utilisateur, alors on affiche des formulaires d'update pour :
    - Les infos perso
    - L'adresse perso
    - Les expériences pros
    - Le mot de passe

    On affiche également les fonctionnalités linkedin :
    - Associer / dissocier mon compte
    - Importer des expériences

    :param int id_ancien: L'id de l'ancien étudié
    :return:
    """

    is_this_me =  current_user is not None and current_user.id_ancien == id_ancien

    kwargs = { "actif" : True, "bloque" : False }
    if is_this_me or current_user.admin:
        kwargs = { "actif" : None, "bloque" : None }

    # Chargement de l'ancien
    ancien = annuaire.find_ancien_by_id(id_ancien, **kwargs)


    # Cas 1 : il n'existe pas
    if ancien is None:
        abort(404, "Il semblerait que la page n'existe pas ...")

    # cas 2 : il est bloqué
    # (donc normalement ici c'est l'utilisateur concerné qui consulte la fiche)
    elif is_this_me and ancien['bloque']:
        flash(
            "Ton compte a été désactivé par les administrateurs."
            "Nous t'invitons à les contacter pour le débloquer.",
            "danger"
        )
        return redirect(url_for("annuaire_view"))

    # Cas 3 : cas nominal !
    else:
        ancien_form = user.update_ancien_form()
        adresse_form = user.update_adresse_form()
        adresse_form.set_pays(PAYS)
        experience_forms = {}
        new_experience_form = None
        linkedin_url = None
        import_linkedin_url = None
        password_form = user.change_password_form()


        # get data by id ancien
        adresse = annuaire.find_adresse_by_id_ancien(id_ancien)
        experiences = annuaire.find_experience_by_id_ancien(id_ancien).fetchall()

        for exp in experiences:
            form = user.update_experience_form()
            form.set_pays(PAYS)
            form.load_experience(exp)
            experience_forms[exp['experience_id_experience']] = form

        # Ici on regarde si il s'agit bien de l'utilisateur
        if is_this_me:

            #~~~~~~~~~#
            # ADRESSE #
            #~~~~~~~~~#
            adresse = annuaire.find_adresse_by_id_ancien(current_user.id_ancien)
            if adresse is not None:
                adresse_form.load_adresse(adresse)

            #~~~~~~~~~~~~~#
            # INFOS PERSO #
            #~~~~~~~~~~~~~#
            ancien_form = user.update_ancien_form()
            ancien_form.load_ancien(ancien)

            #~~~~~~~~~~~~~~~~~~#
            # AJOUT EXPERIENCE #
            #~~~~~~~~~~~~~~~~~~#
            new_experience_form = user.update_experience_form()
            new_experience_form.set_pays(PAYS)


            #~~~~~~~~~~~~~~~~~~#
            # Gestion LinkedIn #
            #~~~~~~~~~~~~~~~~~~#
            # Connexion à LinkedIn
            if ancien['url_linkedin'] is None:
                linkedin_url = ("https://www.linkedin.com/uas/oauth2/authorization?"
                                    "response_type=code&"
                                    "client_id=%s&"
                                    "scope=r_basicprofile"
                                    "&state=%s"
                                    "&redirect_uri=%s" %
                                    (app.config['LINKEDIN_KEY'],
                                     #app.config['LINKEDIN_SCOPE'],
                                     generate_csrf_token(),
                                     url_for('linkedin_associer', _external=True)))

            # import des expériences pro linkeding
            import_linkedin_url = ("https://www.linkedin.com/uas/oauth2/authorization?"
                                "response_type=code&"
                                "client_id=%s&"
                                "scope=r_basicprofile"
                                "&state=%s"
                                "&redirect_uri=%s" %
                                (app.config['LINKEDIN_KEY'],
                                 #app.config['LINKEDIN_SCOPE'],
                                 generate_csrf_token(),
                                 url_for('linkedin_importer', _external=True)))

            print import_linkedin_url



        # load page
        return render_template(
            'annuaire/ancien.html',
            admin=current_user.admin,
            ancien=ancien,
            adresse=adresse,
            ancien_form=ancien_form,
            adresse_form=adresse_form,
            experiences=experiences,
            utilisateur=current_user,
            editable=is_this_me,
            experience_forms=experience_forms,
            new_experience_form = new_experience_form,
            linkedin_url = linkedin_url,
            import_linkedin_url= import_linkedin_url,
            password_form = password_form
        )
コード例 #3
0
def update_photo():
    """
    Mettre à jour la photo d'un ancien.

    POST :  on récupère la photo, on la sauvegarde, on vire l'ancienne
            et on re-render les infos persos (+ csrf token)

            Le cas de suppression est géré par un flag ?suppr=true dans
            l'url de la requête (bof bof ...)
    """

    res = {}
    res["content"] = None
    res["csrf_token"] = generate_csrf_token()
    res["success"] = False

    if current_user.id_ancien is None:
        return res
    else:
        ancien = annuaire.find_ancien_by_id(current_user.id_ancien)
        if ancien is None:
            return res
        else:

            # récupérer le file uploadé
            uploaded_file = None
            try:
                uploaded_file = request.files['file']
            except:
                pass

            if request.form.get("suppr"):
                 # supprimer la photo dans la fiche ancien
                app.logger.info(
                    "PHOTO - remove for : %s",
                    ancien['id_ancien'])

                annuaire.update_photo(ancien['id_ancien'], None)

                # supression de l'ancienne photo
                try:
                    os.remove(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(ancien['photo'])))
                    app.logger.info(
                        "PHOTO - ancien : %s, removed file : %s",
                        ancien['id_ancien'],
                        ancien['photo']
                    )
                except:
                    app.logger.info(
                        "PHOTO - failed to remove for : %s",
                        ancien['id_ancien'])
                flash("Photo supprimée", "warning")

            elif uploaded_file and _allowed_file(uploaded_file.filename):

                # upload de l'ancienne photo
                id_photo = user.get_next_photo_id()
                extension = uploaded_file.filename.rsplit('.', 1)[1]
                filename = secure_filename(str(id_photo)+"."+extension)
                uploaded_file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

                # mise à jour de la fiche ancien avec la nouvelle photo
                annuaire.update_photo(ancien['id_ancien'], filename)
                app.logger.info(
                    "PHOTO - succes for user with %s, ancien : %s, photo name : %s, number : %s",
                    current_user.id,
                    ancien['id_ancien'],
                    uploaded_file.filename,
                    id_photo)

                # supression de l'ancienne photo
                try:
                    os.remove(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(ancien['photo'])))
                    app.logger.info(
                        "PHOTO - ancien : %s, removed file : %s",
                        ancien['id_ancien'],
                        ancien['photo'])
                except:
                    app.logger.info(
                        "PHOTO - failed to remove for : %s",
                        ancien['id_ancien'])

                flash('Photo mise à jour', 'success')

            elif uploaded_file and not _allowed_file(uploaded_file.filename):
                app.logger.info(
                    "PHOTO - forbidden for ancien : %s, photo : %s",
                    ancien['id_ancien'],
                    uploaded_file.filename)
                flash("Format de photo invalide", "danger")


            res["content"] = _get_info_perso_template()
            res["success"] = True
    return json.dumps(res)
コード例 #4
0
def update_experience(id_experience = None):
    """
    Page pour mettre à jour / ajouter des expériences pro d'un ancien

    POST : "commit" les données
    """

    id = id_experience

    res = {}
    res["content"] = None
    res["csrf_token"] = generate_csrf_token()
    res["success"] = False

    experience_form_to_render = None

    experience_form = user.update_experience_form()
    experience_form.set_pays(PAYS)


    if current_user.id_ancien is not None:

        experience_form = user.update_experience_form(request.form)
        experience_form.set_pays(PAYS)
        form_confirmed = experience_form.validate()

        if form_confirmed:
            try:
                date_debut = datetime.strptime(experience_form.date_debut.data, '%m/%Y')
            except ValueError:
                date_debut = None
            try:
                date_fin = datetime.strptime(experience_form.date_fin.data, '%m/%Y')
            except ValueError:
                date_fin = None

            success = annuaire.update_experience(
                current_user.id_ancien,
                id_experience,
                experience_form.ville.data,
                experience_form.pays.data,
                experience_form.adresse.data,
                experience_form.code.data,
                experience_form.entreprise.data,
                experience_form.poste.data,
                experience_form.description.data,
                experience_form.mail.data,
                experience_form.site.data,
                experience_form.telephone.data,
                experience_form.mobile.data,
                date_debut,
                date_fin
            )
            if id_experience is not None:
                flash("Expérience professionnelle modifiée", "success")
            else:
                flash("Expérience professionnelle ajoutée", "success")

            res["success"] = True

        else:
            experience_form_to_render = experience_form

        if id_experience is not None:
            res["content"] = _get_experience_template(id, form=experience_form_to_render)
        else:
            res["content"] = _get_new_experience_template(experience_form_to_render)



    return json.dumps(res)
コード例 #5
0
def update_info_perso():
    """
    Page pour mettre à jour les infos perso d'un ancien.
        -> Infos perso
        -> Adresse perso

    Deux fois (adresse+infos) trois étapes :
        1. Valider les données
        2. Le cas échéant, les sauvegarder
        3. Regénérer le template et le renvoyer avec un nouveau csrf token
    """

    res = {}
    res["content"] = None
    res["csrf_token"] = generate_csrf_token()
    res["success"] = False

    form_ancien_to_render = None

    form = user.update_ancien_form()

    info_ok = False

    if current_user is not None:

        #~~~~~~~~~~~~~#
        # INFOS PERSO #
        #~~~~~~~~~~~~~#
        ancien = annuaire.find_ancien_by_id(current_user.id_ancien)

        if ancien is not None:
            form.load_ancien(ancien)

            # Confirmer
            form = user.update_ancien_form(request.form)
            form_confirmed = form.validate()


            # si tout va bien, mettre a jour.
            if form_confirmed:
                success = annuaire.update_fiche_ancien(
                    ancien['id_ancien'],
                    form.telephone.data,
                    form.mobile.data,
                    form.site.data,
                    form.mail_perso.data
                )
                if success:
                    app.logger.info(
                        "UPDATE INFO - successfully update info for user with id %s, id ancien : %s",
                        current_user.id,
                        ancien['id_ancien']
                        )
                    info_ok = True

                else:
                    app.logger.info("UPDATE INFO - failed insert for user with id %s", current_user.id)

            else:
                form_ancien_to_render = form
                app.logger.info("UPDATE INFO - failed insert for user with id %s", current_user.id)


        #~~~~~~~~~#
        # ADRESSE #
        #~~~~~~~~~#
        adresse_form = user.update_adresse_form()
        adresse_form.set_pays(PAYS)

        if current_user.id_ancien is not None:
            adresse = annuaire.find_adresse_by_id_ancien(current_user.id_ancien)
            if adresse is not None:
                adresse_form.load_adresse(adresse)

            # Confirmer
            adresse_form = user.update_adresse_form(request.form)
            adresse_form.set_pays(PAYS)
            form_confirmed = adresse_form.validate()

            # si tout va bien, mettre a jour.
            if form_confirmed:
                annuaire.update_adresse_perso(
                    current_user.id_ancien,
                    adresse_form.ville.data,
                    adresse_form.pays.data,
                    adresse_form.adresse.data,
                    adresse_form.code.data
                )
                if info_ok:
                    flash("Informations personnelles mises à jour", "success")


        res["content"] = _get_info_perso_template(ancien_form=form_ancien_to_render)
        res["success"] = True

    return json.dumps(res)