feat: Upload in freigegebene Ordner + Benachrichtigung

Share-Links fuer Ordner erlauben jetzt auch Uploads:

Backend:
- POST /share/<token>/upload - Datei in freigegebenen Ordner hochladen
- Passwort-Schutz wird bei Upload ebenfalls geprueft
- share_info gibt jetzt upload_allowed zurueck (true bei Ordner-Shares)
- Email-Benachrichtigung an den Ersteller wenn jemand eine Datei
  hochlaedt (Dateiname, Groesse, IP-Adresse)

Frontend (ShareView):
- Ordner-Shares zeigen jetzt eine Upload-Zone (Drag & Drop + Button)
- Fortschrittsbalken beim Upload mit Datei-Zaehler
- Erfolgs-/Fehlermeldung nach Upload
- Passwortgeschuetzte Ordner-Shares: erst entsperren, dann uploaden

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Stefan Hacker
2026-04-11 18:35:10 +02:00
parent e811210977
commit 6a17748552
3 changed files with 199 additions and 12 deletions
+29
View File
@@ -70,6 +70,35 @@ def notify_share_link_accessed(share_link, file_name, accessor_ip):
send_system_email(creator.email, subject, body)
def notify_share_link_upload(share_link, folder_name, filename, filesize, uploader_ip):
"""Notify the share link creator that someone uploaded a file via their shared folder."""
from app.models.user import User
creator = User.query.get(share_link.created_by)
if not creator or not creator.email:
return
def _fmt_size(b):
for u in ['B', 'KB', 'MB', 'GB']:
if b < 1024:
return f'{b:.1f} {u}'
b /= 1024
return f'{b:.1f} TB'
subject = f'Mini-Cloud: Neue Datei in geteiltem Ordner "{folder_name}"'
body = (
f'Hallo {creator.username},\n\n'
f'Jemand hat eine Datei in deinen geteilten Ordner hochgeladen:\n\n'
f' Ordner: {folder_name}\n'
f' Datei: {filename}\n'
f' Groesse: {_fmt_size(filesize)}\n'
f' IP-Adresse: {uploader_ip}\n\n'
f'Melde dich in deiner Mini-Cloud an, um die Datei zu sehen.\n\n'
f'Deine Mini-Cloud'
)
send_system_email(creator.email, subject, body)
def notify_file_shared_with_user(file_name, owner_username, target_user):
"""Notify a user that a file/folder was shared with them."""
if not target_user.email: