First version of media manager
This commit is contained in:
@@ -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
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
130
server/routes/eventmedia.py
Normal file
130
server/routes/eventmedia.py
Normal file
@@ -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('/<int:media_id>', methods=['PUT'])
|
||||
def update_media(media_id):
|
||||
session = Session()
|
||||
media = session.query(EventMedia).get(media_id)
|
||||
if not media:
|
||||
return jsonify({'error': 'Not found'}), 404
|
||||
data = request.json
|
||||
media.url = data.get('title', media.url)
|
||||
media.message_content = data.get('description', media.message_content)
|
||||
# Event-Zuordnung ggf. ergänzen
|
||||
session.commit()
|
||||
return jsonify(media.to_dict())
|
||||
@@ -1,21 +1,23 @@
|
||||
# server/wsgi.py
|
||||
from routes.eventmedia import eventmedia_bp
|
||||
from routes.events import events_bp
|
||||
from routes.groups import groups_bp
|
||||
from routes.clients import clients_bp
|
||||
from database import Session, engine
|
||||
from flask import Flask, jsonify, send_from_directory, request
|
||||
import glob
|
||||
import os
|
||||
import sys
|
||||
sys.path.append('/workspace')
|
||||
from flask import Flask, jsonify, send_from_directory, request
|
||||
from database import Session, engine
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
# Blueprints importieren und registrieren
|
||||
from routes.clients import clients_bp
|
||||
from routes.groups import groups_bp
|
||||
from routes.events import events_bp
|
||||
|
||||
app.register_blueprint(clients_bp)
|
||||
app.register_blueprint(groups_bp)
|
||||
app.register_blueprint(events_bp)
|
||||
app.register_blueprint(eventmedia_bp)
|
||||
|
||||
|
||||
@app.route("/health")
|
||||
|
||||
Reference in New Issue
Block a user