Function to upload site in ftp or sftp
This commit is contained in:
@@ -4,6 +4,8 @@ from werkzeug.utils import secure_filename
|
||||
from app.forms import *
|
||||
from PIL import Image
|
||||
from pathlib import Path, PurePath, PurePosixPath
|
||||
from shutil import rmtree, copytree
|
||||
import subprocess
|
||||
|
||||
class DataSite:
|
||||
user_folder = None
|
||||
@@ -170,12 +172,40 @@ class DataSite:
|
||||
print(f"Error removing directory (might not be empty): {e}")
|
||||
|
||||
|
||||
def writeHTML(self, pageName :str, htmlExport :str):
|
||||
public_folder = Path(PurePosixPath(self.user_folder).joinpath('public'))
|
||||
pageName = pageName+'.html'
|
||||
page = Path(PurePosixPath(self.user_folder).joinpath('public', pageName))
|
||||
page.write_text(htmlExport)
|
||||
def writeHTML(self, theme:str, pageName :str, htmlExport :str):
|
||||
publicFolder = Path(PurePosixPath(self.user_folder).joinpath('public'))
|
||||
themesFolder = Path(PurePosixPath('app').joinpath('templates','themes', self.datas['config']['theme'],'static'))
|
||||
publicStaticFolder = Path(PurePosixPath(self.user_folder).joinpath('public', 'static'))
|
||||
|
||||
if pageName == '/':
|
||||
pageIndex = publicFolder / 'index.html'
|
||||
pageIndex.write_text(htmlExport)
|
||||
else:
|
||||
pageFolder = Path(PurePosixPath(self.user_folder).joinpath('public', pageName))
|
||||
pageFolder.mkdir(exist_ok=True)
|
||||
pageIndex = pageFolder / 'index.html'
|
||||
pageIndex.write_text(htmlExport)
|
||||
rmtree (publicStaticFolder, ignore_errors=True)
|
||||
copytree(themesFolder, publicStaticFolder)
|
||||
|
||||
|
||||
def publish(self, user:str, password:str, serverAddress:str, serverPort:int, folder:str):
|
||||
remote_directory = "/remote/dir"
|
||||
userDir = Path(PurePosixPath(self.user_folder))
|
||||
|
||||
|
||||
command = "lftp -u \"{}\",\"{}\" -p {} {} -e ' mirror -R public {}; bye;'".format(user,
|
||||
password,
|
||||
serverPort,
|
||||
serverAddress,
|
||||
folder)
|
||||
print(command)
|
||||
try:
|
||||
subprocess.call(command, shell=True, cwd=str(userDir))
|
||||
except ChildProcessError:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def emptyTrash(self):
|
||||
for file in self.trash:
|
||||
|
||||
@@ -21,7 +21,7 @@ csrf = CSRFProtect(app)
|
||||
app.secret_key = 'your_secret_key'
|
||||
app.config.from_pyfile('config.py')
|
||||
|
||||
THEMES_FOLDER = './themes/'
|
||||
THEMES_FOLDER = './templates/themes/'
|
||||
USERS_FOLDER = app.config['USERS_FOLDER']
|
||||
bcrypt = Bcrypt(app)
|
||||
|
||||
@@ -108,8 +108,7 @@ def editPhoto(page, image, bloc):
|
||||
else:
|
||||
return redirect ('/#'+bloc)
|
||||
else:
|
||||
return render_template(THEMES_FOLDER+theme+'/blocs/edit/_image-edit'+'.html', form=form, image=myblocs[bloc][image], bloc=myblocs[bloc])
|
||||
|
||||
return render_template(THEMES_FOLDER+theme+'/blocs/edit/_image-edit'+'.html', form=form, image=myblocs[bloc][image], bloc=myblocs[bloc])
|
||||
|
||||
@app.route('/upload-gallery/<bloc>', methods=['POST'], defaults={'page': ''})
|
||||
@app.route('/<page>/upload-gallery/<bloc>', methods=['POST'])
|
||||
@@ -169,7 +168,6 @@ def delImage(page, bloc, image):
|
||||
|
||||
return make_response(('Image removed', 200))
|
||||
|
||||
|
||||
@app.route('/imgs_list/<blocname>', methods=['GET'], defaults={'page': ''})
|
||||
@app.route('/<page>/imgs_list/<blocname>', methods=['GET'])
|
||||
@login_required
|
||||
@@ -186,7 +184,6 @@ def imagesList(page, blocname):
|
||||
return render_template(THEMES_FOLDER+theme+'/blocs/edit/images_list.html',page=page,
|
||||
bloc=bloc)
|
||||
|
||||
|
||||
@app.route('/edit/<blocname>', methods=['GET', 'POST'], defaults={'page': ''})
|
||||
@app.route('/<page>/edit/<blocname>', methods=['GET', 'POST'])
|
||||
@login_required
|
||||
@@ -298,7 +295,6 @@ def addBloc(page):
|
||||
else:
|
||||
return redirect(url_for('edit'))
|
||||
|
||||
|
||||
@app.route('/addPage', methods=['POST'])
|
||||
@login_required
|
||||
def addPage():
|
||||
@@ -340,10 +336,6 @@ def rmPage(pageName):
|
||||
|
||||
|
||||
return redirect(url_for('edit'))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@app.route('/sortblocs', methods=['POST'], defaults={'page': ''})
|
||||
@app.route('/<page>/sortblocs', methods=['POST'])
|
||||
@@ -393,14 +385,14 @@ def editMenu():
|
||||
flash (u'Le menu a bien été modifier', 'success');
|
||||
return redirect(url_for('edit'))
|
||||
|
||||
@app.route('/public/img/<filename>')
|
||||
@app.route('/img/<filename>')
|
||||
@login_required
|
||||
def myimgs(filename):
|
||||
user = '%s' % escape(session['username'])
|
||||
return send_from_directory(
|
||||
os.path.join(USERS_FOLDER, user, 'public', 'img'), filename )
|
||||
|
||||
@app.route('/public/img/thumbnails/<filename>')
|
||||
@app.route('/img/thumbnails/<filename>')
|
||||
@login_required
|
||||
def mythumbnails(filename):
|
||||
user = '%s' % escape(session['username'])
|
||||
@@ -414,7 +406,7 @@ def favicon():
|
||||
|
||||
|
||||
|
||||
@app.route('/publish', methods=['GET'])
|
||||
@app.route('/publish', methods=['POST'])
|
||||
@login_required
|
||||
def publish():
|
||||
user = '%s' % escape(session['username'])
|
||||
@@ -422,6 +414,15 @@ def publish():
|
||||
listPages = db.getPages()
|
||||
theme = db.datas['config']['theme']
|
||||
menu = db.datas['menu']
|
||||
test_alphanum = "^[A-Za-z0-9/_-]*$"
|
||||
|
||||
|
||||
serverAddress = str(request.form['serverAddress'])
|
||||
serverPort = str(request.form['serverPort'])
|
||||
username = str(request.form['username'])
|
||||
password = str(request.form['password'])
|
||||
folder = str(request.form['folder'])
|
||||
|
||||
|
||||
for page in listPages:
|
||||
myblocs = db.getBlocs(page)['blocs']
|
||||
@@ -442,6 +443,23 @@ def publish():
|
||||
page='/',
|
||||
myblocs=myblocs)
|
||||
|
||||
db.writeHTML(theme, 'index', htmlExport)
|
||||
db.writeHTML(theme, '/', htmlExport)
|
||||
|
||||
|
||||
if serverPort == '' or serverPort.isdigit() == False :
|
||||
serverPort = '22'
|
||||
|
||||
|
||||
|
||||
if folder == '' :
|
||||
folder = '/'
|
||||
elif(bool(re.match(test_alphanum, folder)) == False):
|
||||
folder = '/'
|
||||
|
||||
|
||||
if db.publish(username, password, serverAddress, serverPort, folder) == False:
|
||||
return make_response(('Impossible de publier le site ', 500))
|
||||
|
||||
|
||||
return redirect(url_for('edit'))
|
||||
|
||||
|
||||
70
app/templates/admin/_publish.html
Normal file
70
app/templates/admin/_publish.html
Normal file
@@ -0,0 +1,70 @@
|
||||
<div class="publish" id="publish">
|
||||
<form action="/publish" id="publish" method="POST" class="" >
|
||||
<input id="csrf_token" name="csrf_token" type="hidden" value="{{ csrf_token() }}">
|
||||
<h3>Publier mon site </h3>
|
||||
<p> Rentrez ici les identifiants de connexions fourni par votre hébergeur. </p>
|
||||
<br/>
|
||||
<label for="ServerAddress"> Adresse du serveur : </label>
|
||||
<div class="input-group">
|
||||
<input type="text"
|
||||
name="serverAddress"
|
||||
class="form-control"
|
||||
id="serverAddress"
|
||||
placeholder="sftp://mon_serveur.com, ou ftp://mon_serveur.com"
|
||||
required>
|
||||
<dd<div class="invalid-feedback">
|
||||
L'upload a rencontrer n'a pas pu se faire.
|
||||
</div>
|
||||
</div>
|
||||
<br/>
|
||||
<label for="serverPort"> port </label>
|
||||
<br/>
|
||||
<input type="number"
|
||||
name="serverPort"
|
||||
min="0"
|
||||
max="65536"
|
||||
class="form-control"
|
||||
id="serverPort"
|
||||
placeholder="Si vous ne savez pas ne mettez rien">
|
||||
|
||||
<br/>
|
||||
|
||||
<label for="serverPort"> Dossier </label>
|
||||
<br/>
|
||||
<input type="text"
|
||||
name="folder"
|
||||
class="form-control"
|
||||
id="folder"
|
||||
placeholder="Spécifier un dossier sinon ne mettez rien">
|
||||
|
||||
<br/>
|
||||
|
||||
<label for="User"> Nom d'utilisateur </label>
|
||||
<br/>
|
||||
<input type="text"
|
||||
name="username"
|
||||
class="form-control"
|
||||
id="username"
|
||||
placeholder="Nom d'utilisateur fourni par votre hébergeur"
|
||||
required>
|
||||
|
||||
<br/>
|
||||
|
||||
<label for="Password"> Mot de passe </label>
|
||||
<br/>
|
||||
<input type="password"
|
||||
name="password"
|
||||
class="form-control"
|
||||
id="password"
|
||||
placeholder="Mot de passe fourni par votre hébergeur"
|
||||
required>
|
||||
|
||||
<br/>
|
||||
|
||||
|
||||
|
||||
<button type="submit" class="btn btn-success"
|
||||
onclick="valid_nameBloc()"> Publier le site </button>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
{% for image in bloc.values() %}
|
||||
{% if image.file %}
|
||||
<div class="col-lg-4 col-sm-6 text-center">
|
||||
<a class="portfolio-box" href="/public/img/{{ image.file }}"
|
||||
<a class="portfolio-box" href="/img/{{ image.file }}"
|
||||
alt="{{ image.description }}">
|
||||
<img class="img-fluid" src="/public/img/thumbnails/{{ image.file }}"
|
||||
<img class="img-fluid" src="/img/thumbnails/{{ image.file }}"
|
||||
alt="{{ image.description }}">
|
||||
<div class="portfolio-box-caption">
|
||||
<div class="portfolio-box-caption-content">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<header class="article-img text-center text-white d-flex" style="{% include '_print_colors.css' %} background-image: url('/public/img/{{ bloc.bg_img }}');" id="{{ bloc.name }}" >
|
||||
<header class="article-img text-center text-white d-flex" style="{% include '_print_colors.css' %} background-image: url('/img/{{ bloc.bg_img }}');" id="{{ bloc.name }}" >
|
||||
<div class="container my-auto">
|
||||
<div class="row" style="mix-blend-mode: hard-light;background-color: rgba(0,0,0,0.3);">
|
||||
<div class="col-lg-10 mx-auto">
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<header class="masthead text-center text-white d-flex" style="{% include '_print_colors.css' %} background-image: url('/public/img/{{ bloc.bg_img }}');" id="{{ bloc.name }}" >
|
||||
<header class="masthead text-center text-white d-flex" style="{% include '_print_colors.css' %} background-image: url('/img/{{ bloc.bg_img }}');" id="{{ bloc.name }}" >
|
||||
<div class="container my-auto">
|
||||
<div class="row" style="mix-blend-mode: hard-light;background-color: rgba(0,0,0,0.3);">
|
||||
<div class="col-lg-10 mx-auto">
|
||||
|
||||
Reference in New Issue
Block a user