-
Medien
-
Willkommen im Infoscreen-Management Medien.
-
-);
-export default Medien;
diff --git a/server/alembic/versions/a0f3f9325e05_update_media_type_enum_for_event_media.py b/server/alembic/versions/a0f3f9325e05_update_media_type_enum_for_event_media.py
new file mode 100644
index 0000000..715e3f7
--- /dev/null
+++ b/server/alembic/versions/a0f3f9325e05_update_media_type_enum_for_event_media.py
@@ -0,0 +1,34 @@
+"""Update media_type enum for event_media
+
+Revision ID: a0f3f9325e05
+Revises: bb29b5524f5c
+Create Date: 2025-07-05 07:49:37.696162
+
+"""
+from typing import Sequence, Union
+
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision: str = 'a0f3f9325e05'
+down_revision: Union[str, None] = 'bb29b5524f5c'
+branch_labels: Union[str, Sequence[str], None] = None
+depends_on: Union[str, Sequence[str], None] = None
+
+
+def upgrade():
+ op.execute("""
+ ALTER TABLE event_media MODIFY COLUMN media_type ENUM(
+ 'pdf','ppt','pptx','odp',
+ 'mp4','avi','mkv','mov','wmv','flv','webm','mpg','mpeg','ogv',
+ 'jpg','jpeg','png','gif','bmp','tiff','svg',
+ 'html'
+ ) NOT NULL;
+ """)
+
+
+def downgrade() -> None:
+ """Downgrade schema."""
+ pass
diff --git a/server/models.py b/server/models.py
index f246e39..9b84aab 100644
--- a/server/models.py
+++ b/server/models.py
@@ -116,7 +116,16 @@ class Event(Base):
class EventMedia(Base):
__tablename__ = 'event_media'
id = Column(Integer, primary_key=True, autoincrement=True)
- media_type = Column(Enum(MediaType), nullable=False) # Enum angepasst!
+ media_type = Column(Enum(MediaType), nullable=False)
url = Column(String(255), nullable=False)
file_path = Column(String(255), nullable=True)
message_content = Column(Text, nullable=True)
+
+ def to_dict(self):
+ return {
+ "id": self.id,
+ "media_type": self.media_type.value if self.media_type else None,
+ "url": self.url,
+ "file_path": self.file_path,
+ "message_content": self.message_content,
+ }
diff --git a/server/routes/eventmedia.py b/server/routes/eventmedia.py
new file mode 100644
index 0000000..8620902
--- /dev/null
+++ b/server/routes/eventmedia.py
@@ -0,0 +1,130 @@
+from re import A
+from flask import Blueprint, request, jsonify, send_from_directory
+from database import Session
+from models import EventMedia
+import os
+
+eventmedia_bp = Blueprint('eventmedia', __name__, url_prefix='/api/eventmedia')
+
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
+
+
+def get_param(key, default=None):
+ # Reihenfolge: form > json > args
+ if request.form and key in request.form:
+ return request.form.get(key, default)
+ if request.is_json and request.json and key in request.json:
+ return request.json.get(key, default)
+ return request.args.get(key, default)
+
+# --- FileManager: List, Create Folder, Rename, Delete, Move ---
+
+
+@eventmedia_bp.route('/filemanager/operations', methods=['GET', 'POST'])
+def filemanager_operations():
+ action = get_param('action')
+ path = get_param('path', '/')
+ name = get_param('name')
+ new_name = get_param('newName')
+ target_path = get_param('targetPath')
+
+ full_path = os.path.join(MEDIA_ROOT, path.lstrip('/'))
+
+ print(action, path, name, new_name, target_path, full_path) # Debug-Ausgabe
+
+ if action == 'read':
+ # List files and folders
+ items = []
+ for entry in os.scandir(full_path):
+ items.append({
+ 'name': entry.name,
+ 'isFile': entry.is_file(),
+ 'size': entry.stat().st_size,
+ 'dateModified': entry.stat().st_mtime,
+ 'type': os.path.splitext(entry.name)[1][1:] if entry.is_file() else '',
+ 'hasChild': entry.is_dir()
+ })
+ return jsonify({'files': items, 'cwd': {'name': os.path.basename(full_path), 'path': path}})
+ elif action == 'delete':
+ for item in request.form.getlist('names[]'):
+ item_path = os.path.join(full_path, item)
+ if os.path.isdir(item_path):
+ os.rmdir(item_path)
+ else:
+ os.remove(item_path)
+ return jsonify({'success': True})
+ elif action == 'rename':
+ src = os.path.join(full_path, name)
+ dst = os.path.join(full_path, new_name)
+ os.rename(src, dst)
+ return jsonify({'success': True})
+ elif action == 'move':
+ src = os.path.join(full_path, name)
+ dst = os.path.join(MEDIA_ROOT, target_path.lstrip('/'), name)
+ os.rename(src, dst)
+ return jsonify({'success': True})
+ elif action == 'create':
+ os.makedirs(os.path.join(full_path, name), exist_ok=True)
+ return jsonify({'success': True})
+ else:
+ return jsonify({'error': 'Unknown action'}), 400
+
+# --- FileManager: Upload ---
+
+
+@eventmedia_bp.route('/filemanager/upload', methods=['POST'])
+def filemanager_upload():
+ path = request.args.get('path', '/')
+ upload_path = os.path.join(MEDIA_ROOT, path.lstrip('/'))
+ os.makedirs(upload_path, exist_ok=True)
+ for file in request.files.getlist('uploadFiles'):
+ file.save(os.path.join(upload_path, file.filename))
+ return jsonify({'success': True})
+
+# --- FileManager: Download ---
+
+
+@eventmedia_bp.route('/filemanager/download', methods=['GET'])
+def filemanager_download():
+ path = request.args.get('path', '/')
+ names = request.args.getlist('names[]')
+ # Nur Einzel-Download für Beispiel
+ if names:
+ file_path = os.path.join(MEDIA_ROOT, path.lstrip('/'), names[0])
+ return send_from_directory(os.path.dirname(file_path), os.path.basename(file_path), as_attachment=True)
+ return jsonify({'error': 'No file specified'}), 400
+
+# --- FileManager: Get Image (optional, für Thumbnails) ---
+
+
+@eventmedia_bp.route('/filemanager/get-image', methods=['GET'])
+def filemanager_get_image():
+ path = request.args.get('path', '/')
+ file_path = os.path.join(MEDIA_ROOT, path.lstrip('/'))
+ return send_from_directory(os.path.dirname(file_path), os.path.basename(file_path))
+
+# --- EventMedia-API: Metadaten-Liste (wie gehabt) ---
+
+
+@eventmedia_bp.route('', methods=['GET'])
+def list_media():
+ session = Session()
+ media = session.query(EventMedia).all()
+ return jsonify([m.to_dict() for m in media])
+
+# --- EventMedia-API: Metadaten-Update ---
+
+
+@eventmedia_bp.route('/