sessions archive uploading handling

This commit is contained in:
Анатолий Богомолов 2024-02-11 22:22:18 +10:00
parent 986341722f
commit ac79aefa36
4 changed files with 57 additions and 16 deletions

1
.gitignore vendored
View File

@ -164,3 +164,4 @@ cython_debug/
*.session *.session
.vscode/settings.json .vscode/settings.json
*session_journal *session_journal
uploads

View File

@ -1,16 +1,23 @@
from flask import Blueprint, Response, jsonify, request import os
from flask import Blueprint, jsonify, request, current_app, redirect
from werkzeug.utils import secure_filename
from app.extensions import db from app.extensions import db
from app.models.session import Session from app.models.session import Session
from app.models.task import Task
from paper.errors import NeedPasswordException from paper.errors import NeedPasswordException
from paper.parser import PaperParser from paper.parser import PaperParser
sessions = Blueprint("sessions", __name__, url_prefix="/sessions") sessions = Blueprint("sessions", __name__, url_prefix="/sessions")
@sessions.route("/", methods=["POST"]) ALLOWED_EXTENSIONS = ['zip']
async def create_session(**kwargs):
data = kwargs or request.json or request.form def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
async def create_session_form():
data = request.json
data["name"] = data["name"].replace("/", "").replace("\\", "") data["name"] = data["name"].replace("/", "").replace("\\", "")
session = Session.query.filter_by(name=data.get("name")).first() session = Session.query.filter_by(name=data.get("name")).first()
@ -57,6 +64,36 @@ async def create_session(**kwargs):
return jsonify(response) return jsonify(response)
def create_session_from_file():
archive = request.files['archive']
if archive.filename == '':
return 'Not Found', 404
if not allowed_file(archive.filename):
return 'File Extension Not Allowed', 406
session_upload_path = os.path.join(current_app.config['UPLOAD_DIR'], "sessions")
if not os.path.exists(session_upload_path):
os.makedirs(session_upload_path)
filename = secure_filename(archive.filename)
file_path = os.path.join(session_upload_path, filename)
archive.save(file_path)
return 'Ok', 200
# return redirect('/')
@sessions.route("/", methods=["POST"])
async def create_session():
files = request.files
if not 'archive' in files:
return await create_session_form()
else:
return create_session_from_file()
@sessions.route("/", methods=["GET"]) @sessions.route("/", methods=["GET"])
def get_sessions(**kwargs): def get_sessions(**kwargs):
return Session.query.filter_by(authorized=True).all() return Session.query.filter_by(authorized=True).all()
@ -72,10 +109,11 @@ async def remove_session(id: int):
try: try:
await parser.client.log_out() await parser.client.log_out()
db.session.delete(session)
db.session.commit()
except Exception as e: except Exception as e:
return Response(e, 500) return str(e), 500
db.session.delete(session) return 'ok', 200
db.session.commit()
return Response('ok', status=200)

View File

@ -91,10 +91,11 @@ PaperParser: Вход в аккаунт
<button type="submit" class="btn btn-primary">Отправить код</button> <button type="submit" class="btn btn-primary">Отправить код</button>
</form> </form>
<hr> <hr>
<form action="/api/sessions/file" method="POST"> <form hx-post="/api/sessions" hx-encoding='multipart/form-data' hx-swap="none">
<label for="open-file-btn" class="form-label">Архив с аккаунтом (или .session файл)</label> <label for="open-file-btn" class="form-label">Архив с аккаунтом</label>
<div class="mb-3"> <div class="input-group mb-3">
<button id="open-file-btn" type="submit" class="btn btn-secondary mt-3 disabled">Открыть файл</button> <input class="form-control" type="file" name="archive" accept=".zip">
<button class="btn btn-primary" type="submit">Отправить</button>
</div> </div>
</form> </form>
</div> </div>

View File

@ -13,8 +13,9 @@ class ProductionConfig:
) )
class DebugConfig: class DebugConfig:
SQLALCHEMY_DATABASE_URI = f"postgresql://postgres:123456789@localhost:5432/paper" SQLALCHEMY_DATABASE_URI = f"postgresql://paper:123456789@localhost:5432/paper"
SQLALCHEMY_TRACK_MODIFICATIONS = False SQLALCHEMY_TRACK_MODIFICATIONS = False
UPLOAD_DIR = 'uploads'
CELERY = dict( CELERY = dict(
broker_url="redis://localhost:6379/0", broker_url="redis://localhost:6379/0",
result_backend="redis://localhost:6379/0", result_backend="redis://localhost:6379/0",