from app import app from flask import render_template, url_for, request, flash, redirect, session, make_response import json from markupsafe import escape from werkzeug.utils import secure_filename import os from app.forms import ImageForm, ImageUpload from app.models.sites import DataSite from app.models.blocs import MyBlocs from PIL import Image from flask_bcrypt import Bcrypt from copy import deepcopy from app.forms import Login from functools import wraps from app.utils import login_required from flask_wtf.csrf import CSRFProtect csrf = CSRFProtect(app) app.secret_key = 'your_secret_key' app.config.from_pyfile('config.py') USERS_FOLDER = app.config['USERS_FOLDER'] bcrypt = Bcrypt(app) EXT_IMG = {'.jpg', '.JPG', '.png', '.PNG', '.gif', '.GIF', '.bmp', '.BMP', '.jpeg', '.JPEG' } @app.route('/', methods=['GET', 'POST']) @app.route('/index.html', methods=['GET', 'POST']) @app.route('/login', methods=['GET', 'POST']) def login(): form = Login() if 'username' in session : resp = redirect(url_for('edit', _external=True)) else : resp = redirect(url_for('login', _external=True)) if request.method == 'POST' : login = str(request.form['login']) password = str(request.form['passwd']) if login in os.listdir(USERS_FOLDER): db = DataSite(login, USERS_FOLDER) passwd_bcrypt = db.datas['config']['passwd'] if bcrypt.check_password_hash(passwd_bcrypt, password) is True: session['username'] = login resp = redirect(url_for('edit', _external=True)) else: flash(u'Mauvais mot de passe', 'error') else: resp = render_template('/admin/login.html', form=form) return resp @app.route( '/logout/', methods=['GET'] ) @login_required def logout(): session.pop('username', None) # Supprimer username de la session s'il s'y trouve session.clear() return redirect(url_for('login')) @app.route('/edit/save') @login_required def savefile(): user = '%s'% escape(session['username']) db = DataSite(user, USERS_FOLDER) db.saveJson(TMP.datas) db.emptyTrash() return redirect(url_for('edit')) @app.route('/edit') @login_required def edit(): user = '%s'% escape(session['username']) db = DataSite(user, USERS_FOLDER) theme = db.datas['config']['theme'] menu = db.datas['menu'] myblocs = db.datas['blocs'] return render_template('/edit.html.tpl', blocEdit="", config=db.datas['config'], menu=menu, theme=theme, myblocs=myblocs ) @app.route('/edit/') @login_required def edit(page): user = '%s'% escape(session['username']) db = DataSite(user, USERS_FOLDER) blocs_page = db.getpage() theme = db.datas['config']['theme'] menu = db.datas['menu'] myblocs = db.datas['blocs'] return render_template('/edit.html.tpl', blocEdit="", config=db.datas['config'], menu=menu, theme=theme, myblocs=myblocs ) @app.route('/edit/images//', methods=['GET', 'POST']) @login_required def editPhoto(image, bloc): user = '%s'% escape(session['username']) db = DataSite(user, USERS_FOLDER) theme = db.datas['config']['theme'] form = ImageForm() mesimages = db.datas['blocs'][bloc] if form.validate_on_submit(): if request.method == 'POST': db.updateImg(bloc, mesimages[image], form) db.saveJson() form = MyBlocs.makeForm(db.datas['blocs'][bloc]) if "hx-request" in request.headers: return render_template(theme+'/blocs/edit/images_list.html', theme=theme, bloc=mesimages, form=form) else: return redirect ('/edit#'+bloc) else: return render_template(theme+'/blocs/edit/_image-edit'+'.html', form=form, image=mesimages[image], bloc=mesimages) @app.route('/upload-gallery/', methods=['POST']) @login_required def drop_upload(bloc): user = '%s'% escape(session['username']) db = DataSite(user, USERS_FOLDER) file = request.files['file'] filename = secure_filename(file.filename) ext = os.path.splitext(filename)[-1] save_path = "./app/static/img/portfolio" if ext not in EXT_IMG : return make_response(('Le fichier n\'est pas une image', 400)) current_chunk = int(request.form['dzchunkindex']) print (current_chunk) if (os.path.isfile(os.path.join(save_path, 'fullsize', filename ))) and current_chunk == 0: return make_response(('Un fichier avec le même nom existe déjà', 400)) try: with open(os.path.join(save_path, 'fullsize', filename ), 'ab') as f: f.seek(int(request.form['dzchunkbyteoffset'])) f.write(file.stream.read()) except OSError: return make_response(("Une erreur est survenue," " Impossible d'écrire le fichier sur le disque", 500)) total_chunks = int(request.form['dztotalchunkcount']) if current_chunk + 1 == total_chunks: # This was the last chunk, the file should be complete and the size we expect if os.path.getsize(os.path.join(save_path, 'fullsize', filename )) != int(request.form['dztotalfilesize']): return make_response(('La taille du fichier source est différentes', 500)) else: with Image.open(os.path.join(save_path, 'fullsize', filename )) as img : img.thumbnail((300,300)) img.save(os.path.join(save_path, 'thumbnails', filename ) ) db.addImg(bloc, filename) db.saveJson() return make_response(('Chunk upload succesfull', 200)) @app.route('/edit/images//del/', methods=['GET']) @login_required def delImage(bloc, image): user = '%s'% escape(session['username']) db = DataSite(user, USERS_FOLDER) db.delImg(image) db.saveJson() return redirect ('/edit#'+bloc) @app.route('/edit/', methods=['GET', 'POST']) @login_required def editBloc(blocname): user = '%s'% escape(session['username']) db = DataSite(user, USERS_FOLDER) theme = db.datas['config']['theme'] bloc = db.datas['blocs'][blocname] form = MyBlocs.makeForm(bloc) if request.method == 'POST': if form.validate_on_submit(): print(form.name.data) db.datas['blocs'][form.name.data]=DataSite.updateBloc(bloc, form) db.saveJson() flash(u'Vos changements on été pris en compte et enregistré', 'success') else: print(form.errors) if "hx-request" in request.headers: return render_template(theme+'/blocs/_'+bloc['type']+'.html', theme=theme, bloc=db.datas['blocs'][blocname]) else: return redirect(url_for('edit')) else: if "hx-request" in request.headers: return render_template(theme+'/blocs/edit/_'+bloc['type']+'.html', theme=theme, bloc=bloc, form=form) else: return render_template('/edit.html.tpl', config=db.datas['config'], menu=db.datas['menu'], myblocs=db.datas['blocs'], theme=theme, blocEdit=bloc['name'], form=form) @app.route('/view/', methods=['GET']) @login_required def viewBloc(bloc): user = '%s'% escape(session['username']) db = DataSite(user, USERS_FOLDER) theme = db.datas['config']['theme'] myblocs = db.datas['blocs'] form = MyBlocs.makeForm(db.datas['blocs'][bloc]) bloc = db.datas['blocs'][bloc] return render_template(theme+'/blocs/_'+bloc['type']+'.html', bloc=bloc) @app.route('/addBloc', methods=['POST']) @login_required def addBloc(): user = '%s'% escape(session['username']) db = DataSite(user, USERS_FOLDER) for key in request.form: print (key +':'+ request.form[key]) blocName = request.form['blocName'] blocType = request.form['blocType'] bloc = MyBlocs.new(blocName, blocType) if bloc != None: db.datas['blocs'][blocName] = { 'name': blocName, 'type': blocType} flash (u'Bloc ajouté avec succès', 'succes'); else: return make_response(('Invalid type of bloc ', 500)) db.saveJson() if "hx-request" in request.headers: return render_template('/admin/_blocs-list.html', myblocs=db.datas['blocs']) else: return redirect(url_for('edit')) @app.route('/sortblocs', methods=['POST']) @login_required def sortblocs(): user = '%s'% escape(session['username']) db = DataSite(user, USERS_FOLDER) config = db.datas['config'] menu = db.datas['menu'] myblocs = deepcopy(TMP.datas['blocs']) db.datas['blocs']=dict() for bloc in request.form: if bloc != 'csrf_token': bloc_name = bloc.replace("bloc-", "", 2) db.datas['blocs'][bloc_name] = myblocs[bloc_name] flash (u'Les blocs ont été réagencés', 'succes'); db.saveJson() return redirect(url_for('edit')) @app.route('/editmenu', methods=['POST']) @login_required def editMenu(): user = '%s'% escape(session['username']) db = DataSite(user, USERS_FOLDER) db.datas['menu']=dict() for menu in request.form: if '§§' in menu: submenu = menu.split("§§") if submenu[0] in db.datas['menu'].keys(): db.datas['menu'][submenu[0]] = db.datas['menu'][submenu[0]] | {submenu[1]: str(request.form[menu])} else: db.datas['menu'][submenu[0]] = {submenu[1]: str(request.form[menu])} elif menu == 'csrf_token': pass else: db.datas['menu'][menu] = str(request.form[menu]) db.saveJson() flash (u'Le menu a bien été modifier', 'success'); return redirect(url_for('edit'))