298 lines
10 KiB
Python
298 lines
10 KiB
Python
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/<page>')
|
|
@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/<bloc>/<image>', 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/<bloc>', 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/<bloc>/del/<image>', 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/<blocname>', 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/<bloc>', 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'))
|
|
|