Результаты доступны 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)
|
||||
if result is None:
|
||||
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}.*")))
|
||||
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")
|
||||
def download_pdf(share_id):
|
||||
"""Скачать результат в PDF."""
|
||||
result = storage.get_result(share_id)
|
||||
if result is None:
|
||||
return "Результат не найден", 404
|
||||
if storage.is_expired(result["created_at"]):
|
||||
return "Ссылка устарела. Результат доступен в течение 30 минут.", 410
|
||||
try:
|
||||
data = export.generate_pdf(share_id)
|
||||
except ValueError:
|
||||
@@ -431,6 +438,11 @@ def download_pdf(share_id):
|
||||
@app.route("/download/<share_id>/docx")
|
||||
def download_docx(share_id):
|
||||
"""Скачать результат в DOCX."""
|
||||
result = storage.get_result(share_id)
|
||||
if result is None:
|
||||
return "Результат не найден", 404
|
||||
if storage.is_expired(result["created_at"]):
|
||||
return "Ссылка устарела. Результат доступен в течение 30 минут.", 410
|
||||
try:
|
||||
data = export.generate_docx(share_id)
|
||||
except ValueError:
|
||||
@@ -449,6 +461,10 @@ def download_docx(share_id):
|
||||
@app.route("/download/<video_id>/video")
|
||||
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}.*"))
|
||||
if not matches:
|
||||
return "Видео не найдено", 404
|
||||
|
||||
+13
-1
@@ -17,13 +17,25 @@ import json
|
||||
import os
|
||||
import sqlite3
|
||||
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")
|
||||
|
||||
# Первый ID результата
|
||||
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():
|
||||
conn = sqlite3.connect(DB_PATH)
|
||||
|
||||
Reference in new issue
Block a user