Результаты доступны 30 минут, затем становятся недоступными (не удаляются)
This commit is contained in:
1 parent
6ea71e1864
commit
d81d5a4672
2 files changed
+29
-1
No files matched your search
@@ -405,6 +405,8 @@ def shared_result(share_id):
|
|||||||
result = storage.get_result(share_id)
|
result = storage.get_result(share_id)
|
||||||
if result is None:
|
if result is None:
|
||||||
return render_template("result.html", result=None, error="Результат не найден", video_exists=False, base_url=BASE_URL), 404
|
return render_template("result.html", result=None, error="Результат не найден", video_exists=False, base_url=BASE_URL), 404
|
||||||
|
if storage.is_expired(result["created_at"]):
|
||||||
|
return render_template("result.html", result=None, error="Ссылка устарела. Результат доступен в течение 30 минут после сканирования.", video_exists=False, base_url=BASE_URL), 410
|
||||||
|
|
||||||
video_exists = bool(glob.glob(os.path.join(VIDEO_DIR, f"{share_id}.*")))
|
video_exists = bool(glob.glob(os.path.join(VIDEO_DIR, f"{share_id}.*")))
|
||||||
return render_template("result.html", result=result, error=None, video_exists=video_exists, base_url=BASE_URL)
|
return render_template("result.html", result=result, error=None, video_exists=video_exists, base_url=BASE_URL)
|
||||||
@@ -413,6 +415,11 @@ def shared_result(share_id):
|
|||||||
@app.route("/download/<share_id>/pdf")
|
@app.route("/download/<share_id>/pdf")
|
||||||
def download_pdf(share_id):
|
def download_pdf(share_id):
|
||||||
"""Скачать результат в PDF."""
|
"""Скачать результат в PDF."""
|
||||||
|
result = storage.get_result(share_id)
|
||||||
|
if result is None:
|
||||||
|
return "Результат не найден", 404
|
||||||
|
if storage.is_expired(result["created_at"]):
|
||||||
|
return "Ссылка устарела. Результат доступен в течение 30 минут.", 410
|
||||||
try:
|
try:
|
||||||
data = export.generate_pdf(share_id)
|
data = export.generate_pdf(share_id)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
@@ -431,6 +438,11 @@ def download_pdf(share_id):
|
|||||||
@app.route("/download/<share_id>/docx")
|
@app.route("/download/<share_id>/docx")
|
||||||
def download_docx(share_id):
|
def download_docx(share_id):
|
||||||
"""Скачать результат в DOCX."""
|
"""Скачать результат в DOCX."""
|
||||||
|
result = storage.get_result(share_id)
|
||||||
|
if result is None:
|
||||||
|
return "Результат не найден", 404
|
||||||
|
if storage.is_expired(result["created_at"]):
|
||||||
|
return "Ссылка устарела. Результат доступен в течение 30 минут.", 410
|
||||||
try:
|
try:
|
||||||
data = export.generate_docx(share_id)
|
data = export.generate_docx(share_id)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
@@ -449,6 +461,10 @@ def download_docx(share_id):
|
|||||||
@app.route("/download/<video_id>/video")
|
@app.route("/download/<video_id>/video")
|
||||||
def download_video(video_id):
|
def download_video(video_id):
|
||||||
"""Скачать видео, записанное при сканировании (то, что было в кружке)."""
|
"""Скачать видео, записанное при сканировании (то, что было в кружке)."""
|
||||||
|
# Если video_id соответствует результату в БД — проверяем срок действия.
|
||||||
|
result = storage.get_result(video_id)
|
||||||
|
if result is not None and storage.is_expired(result["created_at"]):
|
||||||
|
return "Ссылка устарела. Результат доступен в течение 30 минут.", 410
|
||||||
matches = glob.glob(os.path.join(VIDEO_DIR, f"{video_id}.*"))
|
matches = glob.glob(os.path.join(VIDEO_DIR, f"{video_id}.*"))
|
||||||
if not matches:
|
if not matches:
|
||||||
return "Видео не найдено", 404
|
return "Видео не найдено", 404
|
||||||
|
|||||||
+13
-1
@@ -17,13 +17,25 @@ import json
|
|||||||
import os
|
import os
|
||||||
import sqlite3
|
import sqlite3
|
||||||
import uuid
|
import uuid
|
||||||
from datetime import datetime
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
DB_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "results.db")
|
DB_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "results.db")
|
||||||
|
|
||||||
# Первый ID результата
|
# Первый ID результата
|
||||||
FIRST_ID = 10005
|
FIRST_ID = 10005
|
||||||
|
|
||||||
|
# Срок жизни результата: доступен 30 минут, затем становится недоступным (не удаляется).
|
||||||
|
RESULT_TTL = timedelta(minutes=30)
|
||||||
|
|
||||||
|
|
||||||
|
def is_expired(created_at: str) -> bool:
|
||||||
|
"""True, если результат старше RESULT_TTL (30 минут)."""
|
||||||
|
try:
|
||||||
|
created = datetime.fromisoformat(created_at)
|
||||||
|
except (ValueError, TypeError):
|
||||||
|
return False
|
||||||
|
return datetime.now() - created > RESULT_TTL
|
||||||
|
|
||||||
|
|
||||||
def _connect():
|
def _connect():
|
||||||
conn = sqlite3.connect(DB_PATH)
|
conn = sqlite3.connect(DB_PATH)
|
||||||
|
|||||||
Reference in new issue
Block a user