Example #1
0
def linkedin_login():
    """
    Fonction de callback appelée par LinkedIn.

    Log-in un membre à partir de LinkedIn.

    Worfklow :
    - Request un token
    - Faire un appel sur l'API "people" pour obtenir l'id_linkedin
    - Regarder si il existe un ancien avec cet id_linkedin
    - Regarder si il existe un utilisateur pour cet id_ancien
    - Logguer cet utilisateur !

    Notes :
    - On pourrait stocker les tokens pour ne pas avoir la demande systématique, mais ça veut dire modifier le workflow
    - Il faut penser à garder le "remember me", si on décide d'en faire une variable.
    """
    app.logger.info("LINKEDIN - begin login")

    access_token = __get_linkedin_token(url_for('linkedin_login', _external=True))
    api_url = "https://api.linkedin.com/v1/people/~:(id)?oauth2_access_token=%s" % access_token
    api_req =  requests.get(api_url)
    if api_req is not None and api_req.status_code == requests.codes.ok:
        parsed = etree.fromstring(api_req.text.encode("utf-8"))
        if parsed is not None:
            id_linkedin = None
            for e in parsed:
                if e.tag == "id":
                    id_linkedin = e.text
            if id_linkedin is not None:
                app.logger.info("LINKEDIN - search ancien for id id_linkedin : %s", id_linkedin)
                ancien = annuaire.find_ancien_by_id_linkedin(id_linkedin)
                if ancien is not None:
                    app.logger.info("LINKEDIN - found ancien with ID : %s", ancien['id_ancien'])
                    utilisateur = user.find_user_by_id_ancien(ancien['id_ancien'], actif_only=True)
                    if utilisateur is not None :
                        app.logger.info("LOGIN - linkedin login successful, with id %s",  utilisateur.id)
                        login_user(utilisateur, remember=True)
                        flash("Logged in successfully.")
                        return redirect(url_for('annuaire_view'))
                    else:
                        flash("Erreur de connexion : mot de passe incorrect ou utilisateur inconnu", "danger")
                        app.logger.warning("LOGIN - linkedin login failed for id_linkedin %s", id_linkedin)

                else:
                    app.logger.warning("LINKEDIN - no ancien for id_linkedin : %s", id_linkedin)

        else:
            app.logger.error("LINKEDIN - blank API response file")

    elif api_req is None:
        app.logger.error("LINKEDIN - bad people API request, null response")
    else:
        app.logger.error(
            "LINKEDIN - bad people API request ... code : %s, request response : %s",
            api_req.status_code,
            api_req.text
        )

    return redirect(url_for("login"))
Example #2
0
def valider_ancien_api(id_ancien):
    """
    Valider un ancien.

    :param id_ancien: L'id de l'ancien à valider
    """
    if annuaire.update_ancien_valider(id_ancien):
        utilisateur = user.find_user_by_id_ancien(id_ancien)
        helper.send_fiche_activee_mail(utilisateur.mail)
        return json.dumps({ "succes" : True })
    else:
        abort(500, "Oops ! Probleme de mise a jour de l'ancien ...")
Example #3
0
def compte():
    """
    Permet, entre autres, d'associer un utilisateur à un ancien :
    - Si l'utilisateur U n'a pas d'ancien associé
        - Trouver si il y a un ancien A tel que A.mail_asso == U.mail
            - Si oui, vérifier qu'il n'y a pas d'utilisateur U2
            tel que U2.id_ancien == A.id_ancien
                - Si U2 n'existe pas, alors UPDATE U tel que U.id_ancien = A.id_ancien

    """


    # Trouver si l'utilisateur a un ancien associé
    ancien = annuaire.find_ancien_by_id(current_user.id_ancien, actif=None, bloque=None, nouveau=None)

    # Si l'utilisateur n'a pas d'ancien, on va vérifier
    # Via le mail asso, s'il existe un ancien dans la base pour lui
    if ancien is None:
        ancien_temp = annuaire.find_ancien_by_mail_asso(current_user.mail)

        # si il y a effectivement un ancien, vérifier
        # qu'il n'est pas déjà associé à un utilisateur
        if ancien_temp is not None:
            app.logger.info(
                "USER ASSOCIATION - trying to associate user %s with ancien %s",
                current_user.id,
                ancien_temp['id_ancien']
            )
            user_temp = user.find_user_by_id_ancien(ancien_temp['id_ancien'])

            # Si ça n'existe pas, alors faire l'association
            if user_temp is None:
                # On récupère le nouvel utilisateur
                sql_res = user.update_id_ancien(current_user.id, ancien_temp['id_ancien'])

                # Si l'association réussit
                # réucpérer l'ancien
                if sql_res :
                    app.logger.info(
                        "USER ASSOCIATION - Success, associated user %s with ancien %s",
                        current_user.id,
                        ancien_temp['id_ancien']
                    )
                    return redirect(url_for("ancien", id_ancien=ancien_temp['id_ancien']))

                else:
                    app.logger.error(
                        "USER ASSOCIATION - Oops ... update went wrong."
                    )

            else:
                app.logger.warning(
                    "USER ASSOCIATION - user %s already associated with ancien %s",
                    user_temp.id,
                    ancien_temp['id_ancien']
                )
        else:
            # Sinon, on le laisse créer sa fiche !
            return redirect(url_for("create_ancien"))

    elif ancien['nouveau']:
        return redirect(url_for("create_ancien")) # cas spécifique : ancien en cours de création

    else:
        return redirect(url_for("ancien", id_ancien=current_user.id_ancien))