From f0591d493955d9c126e7dee6d1a06917c48bbbd2 Mon Sep 17 00:00:00 2001 From: retoor Date: Sat, 10 May 2025 15:03:50 +0200 Subject: [PATCH] UPdate. --- src/snek/app.py | 4 +- src/snek/static/file-manager.js | 5 +- src/snek/templates/app.html | 1 + src/snek/templates/drive.html | 9 ++++ .../settings/repositories/create.html | 43 ++-------------- .../settings/repositories/delete.html | 29 +---------- .../templates/settings/repositories/form.html | 28 +++++++++++ .../settings/repositories/update.html | 24 +-------- src/snek/view/drive.py | 49 ++++++++----------- 9 files changed, 72 insertions(+), 120 deletions(-) create mode 100644 src/snek/templates/drive.html create mode 100644 src/snek/templates/settings/repositories/form.html diff --git a/src/snek/app.py b/src/snek/app.py index 3e4ad5e..362d519 100644 --- a/src/snek/app.py +++ b/src/snek/app.py @@ -33,6 +33,7 @@ from snek.view.about import AboutHTMLView, AboutMDView from snek.view.avatar import AvatarView from snek.view.docs import DocsHTMLView, DocsMDView from snek.view.drive import DriveView +from snek.view.drive import DriveApiView from snek.view.index import IndexView from snek.view.login import LoginView from snek.view.logout import LogoutView @@ -178,7 +179,8 @@ class Application(BaseApplication): self.router.add_view("/threads.html", ThreadsView) self.router.add_view("/terminal.ws", TerminalSocketView) self.router.add_view("/terminal.html", TerminalView) - self.router.add_view("/drive.json", DriveView) + self.router.add_view("/drive.json", DriveApiView) + self.router.add_view("/drive.html", DriveView) self.router.add_view("/drive/{drive}.json", DriveView) self.router.add_view("/stats.json", StatsView) self.router.add_view("/user/{user}.html", UserView) diff --git a/src/snek/static/file-manager.js b/src/snek/static/file-manager.js index 55dbac6..b0d9765 100644 --- a/src/snek/static/file-manager.js +++ b/src/snek/static/file-manager.js @@ -9,6 +9,7 @@ class FileBrowser extends HTMLElement { } connectedCallback() { + this.path = this.getAttribute("path") || ""; this.renderShell(); this.load(); } @@ -19,11 +20,11 @@ class FileBrowser extends HTMLElement { - - +{% include 'settings/repositories/form.html' %}
@@ -52,8 +16,9 @@ button, a.button { Private
- - + + +
{% endblock %} diff --git a/src/snek/templates/settings/repositories/delete.html b/src/snek/templates/settings/repositories/delete.html index 5ba6c5b..d06003b 100644 --- a/src/snek/templates/settings/repositories/delete.html +++ b/src/snek/templates/settings/repositories/delete.html @@ -3,33 +3,8 @@ {% block header_text %}

Delete Repository

{% endblock %} {% block main %} - - -
+ {% include "settings/repositories/form.html" %} +

Are you sure you want to delete the following repository?

{{ repository.name }}
diff --git a/src/snek/templates/settings/repositories/form.html b/src/snek/templates/settings/repositories/form.html new file mode 100644 index 0000000..8785cc6 --- /dev/null +++ b/src/snek/templates/settings/repositories/form.html @@ -0,0 +1,28 @@ + + + + diff --git a/src/snek/templates/settings/repositories/update.html b/src/snek/templates/settings/repositories/update.html index 5168c92..93c9f72 100644 --- a/src/snek/templates/settings/repositories/update.html +++ b/src/snek/templates/settings/repositories/update.html @@ -3,28 +3,8 @@ {% block header_text %}

Update Repository

{% endblock %} {% block main %} - - -
+{% include "settings/repositories/form.html" %} +
diff --git a/src/snek/view/drive.py b/src/snek/view/drive.py index e3c3343..d6de50f 100644 --- a/src/snek/view/drive.py +++ b/src/snek/view/drive.py @@ -11,47 +11,42 @@ from datetime import datetime -"""Run with: python server.py (Python ≥ 3.9) -Visit http://localhost:8080 to try the demo. -""" from aiohttp import web from pathlib import Path import mimetypes, urllib.parse -# ---------- Configuration -------------------------------------------------- -BASE_DIR = Path(__file__).parent.resolve() -ROOT_DIR = (BASE_DIR / "storage").resolve() # files shown to the outside world -ASSETS_DIR = (BASE_DIR / "assets").resolve() # JS & demo HTML -ROOT_DIR.mkdir(exist_ok=True) -ASSETS_DIR.mkdir(exist_ok=True) - -# ---------- Helpers -------------------------------------------------------- - -def safe_resolve_path(rel: str) -> Path: - """Return *absolute* path inside ROOT_DIR or raise FileNotFoundError.""" - target = (ROOT_DIR / rel.lstrip("/")).resolve() - if target == ROOT_DIR or ROOT_DIR in target.parents: - return target - raise FileNotFoundError("Unsafe path") - -# ---------- API view ------------------------------------------------------- - class DriveView(BaseView): + async def get(self): + target = await self.services.user.get_home_folder(self.session.get("uid")) + rel_path = self.request.match_info.get("rel_path", "") + if rel_path: + target = target.joinpath(rel_path) + + if not target.exists(): + return web.HTTPNotFound(reason="Path not found") + + if target.is_dir(): + return await self.render_template("drive.html",{"path": rel_path}) + if target.is_file(): + return web.FileResponse(target) + + +class DriveApiView(BaseView): + async def get(self): + target = await self.services.user.get_home_folder(self.session.get("uid")) rel = self.request.query.get("path", "") offset = int(self.request.query.get("offset", 0)) limit = int(self.request.query.get("limit", 20)) - target = await self.services.user.get_home_folder(self.session.get("uid")) + if rel: - target.joinpath(rel) + target = target.joinpath(rel) if not target.exists(): return web.json_response({"error": "Not found"}, status=404) - # ---- Directory listing ------------------------------------------- if target.is_dir(): entries = [] - # Directories first, then files – both alphabetical (case‑insensitive) for p in sorted(target.iterdir(), key=lambda p: (p.is_file(), p.name.lower())): item_path = (Path(rel) / p.name).as_posix() mime = mimetypes.guess_type(p.name)[0] if p.is_file() else "inode/directory" @@ -73,10 +68,6 @@ class DriveView(BaseView): "pagination": {"offset": offset, "limit": limit, "total": total} }) - with open(target, "rb") as f: - content = f.read() - return web.Response(body=content, content_type=mimetypes.guess_type(target.name)[0]) - # ---- Single file metadata ---------------------------------------- url = self.request.url.with_path(f"/drive/{urllib.parse.quote(rel)}") return web.json_response({ "name": target.name,