Результаты доступны 30 минут, затем становятся недоступными (не удаляются)

This commit is contained in:
apuc committed 2026-09-21 15:08:09 +03:00
1 parent 6ea71e1864
commit d81d5a4672
2 files changed
+29 -1

No files matched your search

+16
View File
@@ -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
View File
@@ -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)