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)
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 )
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)
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)
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)