Store a DM voice message (plaintext on disk).
(dm_id: int, file_storage)
| 12417 | date_from, date_to = request.args.get("date_from", ""), request.args.get("date_to", "") |
| 12418 | try: |
| 12419 | rel = safe_relpath(rel) |
| 12420 | entries = list_dir_entries(current_user(), rel, sort, order, query, category, size_min_mb * 1024 * 1024, None if size_max_mb is None else size_max_mb * 1024 * 1024, _parse_date_start(date_from), _parse_date_end(date_to)) |
| 12421 | except Exception: |
| 12422 | rel, entries = "", list_dir_entries(current_user(), "", sort, order) |
| 12423 | flash("Could not open that folder.") |
| 12424 | parent = "/".join(rel.split("/")[:-1]) if rel else "" |
| 12425 | return render_template("files.html", entries=entries, relpath=rel, parent_relpath=parent, sort=sort, order=order, query=query, category=category, categories=FILE_CATEGORIES, size_min=size_min_mb or "", size_max="" if size_max_mb is None else size_max_mb, date_from=date_from, date_to=date_to, folder_choices=_all_user_folders(current_user()), storage=_storage_stats(current_user())) |
| 12426 | |
| 12427 | |
| 12428 | @app.route("/mkdir", methods=["POST"]) |
| 12429 | @login_required |
| 12430 | def mkdir(): |
| 12431 | rel = request.form.get("p", "") or "" |
| 12432 | try: |
| 12433 | rel = safe_relpath(rel); name = _validate_entry_name(request.form.get("name", "")); target = os.path.join(abs_user_path(current_user(), rel), name) |
| 12434 | if os.path.exists(target): raise FileExistsError |
| 12435 | os.makedirs(target) |
| 12436 | item_rel = safe_relpath(f"{rel}/{name}" if rel else name) |
| 12437 | _log_file_activity(current_user(), "folder_created", item_rel) |
| 12438 | flash("Folder created.") |
| 12439 | except FileExistsError: flash("Folder already exists.") |
| 12440 | except Exception: flash("Could not create folder.") |
| 12441 | return redirect(url_for("files", p=rel)) |
| 12442 | |
| 12443 | |
| 12444 | @app.route("/upload", methods=["POST"]) |
| 12445 | @login_required |
| 12446 | def upload(): |
| 12447 | rel = request.form.get("p", "") or ""; conflict = (request.form.get("conflict") or "keep").lower() |
| 12448 | uploads = request.files.getlist("files") or request.files.getlist("file") |
| 12449 | successes = 0 |
| 12450 | try: rel = safe_relpath(rel); dest_dir = abs_user_path(current_user(), rel); os.makedirs(dest_dir, exist_ok=True) |
| 12451 | except Exception: flash("Upload failed."); return redirect(url_for("files")) |
| 12452 | for f in uploads: |
| 12453 | if not f or not f.filename: continue |
| 12454 | try: |
| 12455 | name = _validate_vault_upload_filename(f.filename, getattr(f, "mimetype", None)); size = _filestorage_size(f) |
| 12456 | if size is not None and size > FILES_MAX_BYTES: raise ValueError("too_large") |
| 12457 | original = os.path.join(dest_dir, name) |
| 12458 | if os.path.exists(original): |
| 12459 | if conflict == "cancel": continue |
| 12460 | destination = original if conflict == "replace" else _unique_destination(dest_dir, name) |
| 12461 | else: destination = original |
| 12462 | if size is not None and not _disk_allows_upload(dest_dir, size): raise ValueError("storage") |
| 12463 | written = _save_plain_upload(f, destination) |
| 12464 | if written > FILES_MAX_BYTES: os.remove(destination); raise ValueError("too_large") |
| 12465 | item_rel = os.path.relpath(destination, user_root(current_user())).replace(os.sep, "/") |
| 12466 | _log_file_activity(current_user(), "file_uploaded", item_rel, human_size(written)); successes += 1 |
| 12467 | except ValueError as exc: |
| 12468 | if str(exc) == "too_large": flash("File too large (maximum 10 GB).") |
| 12469 | elif str(exc) == "storage": flash("Upload stopped because storage would reach 85% usage.") |
| 12470 | else: flash("Upload failed.") |
| 12471 | except Exception as exc: log.exception("Upload failed: %s", exc); flash("Upload failed.") |
| 12472 | if successes: flash(f"Uploaded {successes} file(s).") |
| 12473 | return redirect(url_for("files", p=rel)) |
| 12474 | |
| 12475 |
nothing calls this directly
no test coverage detected