diff --git a/app/routes.py b/app/routes.py index b4f5e6d..6be9c13 100644 --- a/app/routes.py +++ b/app/routes.py @@ -1,10 +1,11 @@ -from flask import Blueprint, render_template, request, redirect, url_for, flash +from flask import Blueprint, render_template, request, redirect, url_for, flash, Response from app.db import snippets_collection from app.forms import SnippetForm from app.models import make_snippet from bson import ObjectId from app.utils import parse_tags from datetime import datetime +import json as _json main = Blueprint("main", __name__) @@ -56,6 +57,25 @@ def add_snippet(): return render_template("add.html", form=form) +@main.route("/export") +def export_snippets(): + snapshots = list(snippets_collection.find().sort("created_at", -1)) + payload = [] + for snip in snapshots: + snip["_id"] = str(snip.get("_id")) + payload.append({ + "title": snip.get("title"), + "language": snip.get("language"), + "code": snip.get("code"), + "description": snip.get("description") or "", + "tags": snip.get("tags") or [], + }) + filename = f"stashsnip-export-{datetime.utcnow().strftime('%Y%m%d-%H%M%S')}.json" + return Response( + _json.dumps(payload, ensure_ascii=False, indent=2), + mimetype='application/json', + headers={'Content-Disposition': f'attachment; filename="{filename}"'}, + ) @main.route("/snippet/") def view_snippet(id): @@ -101,4 +121,4 @@ def edit_snippet(id): form.description.data = snippet.get("description", "") form.tags.data = ", ".join(snippet.get("tags", [])) - return render_template("edit.html", form=form, snippet=snippet) \ No newline at end of file + return render_template("edit.html", form=form, snippet=snippet) diff --git a/app/templates/base.html b/app/templates/base.html index 874f789..64b9aa1 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -12,6 +12,7 @@
@@ -29,4 +30,4 @@ - \ No newline at end of file +