"Refactor app log file path update"
This commit is contained in:
Binary file not shown.
249
app.py
249
app.py
@@ -2026,6 +2026,255 @@ def reload_env():
|
||||
'message': f'Fehler beim Neuladen der Umgebungsvariablen: {str(e)}'
|
||||
}), 500
|
||||
|
||||
# Berechtigungsverwaltung für Mindmaps
|
||||
@app.route('/api/mindmap/<int:mindmap_id>/shares', methods=['GET'])
|
||||
@login_required
|
||||
@handle_api_exception
|
||||
def get_mindmap_shares(mindmap_id):
|
||||
"""Listet alle Benutzer auf, mit denen eine Mindmap geteilt wurde."""
|
||||
# Überprüfen, ob die Mindmap dem Benutzer gehört
|
||||
mindmap = UserMindmap.query.get_or_404(mindmap_id)
|
||||
if mindmap.user_id != current_user.id:
|
||||
return ErrorHandler.api_error("Sie haben keine Berechtigung, die Freigaben dieser Mindmap einzusehen.", 403)
|
||||
|
||||
# Alle Freigaben für diese Mindmap abrufen
|
||||
shares = MindmapShare.query.filter_by(mindmap_id=mindmap_id).all()
|
||||
|
||||
result = []
|
||||
for share in shares:
|
||||
# Benutzerinformationen abrufen
|
||||
shared_with_user = User.query.get(share.shared_with_id)
|
||||
|
||||
if shared_with_user:
|
||||
result.append({
|
||||
'id': share.id,
|
||||
'user_id': shared_with_user.id,
|
||||
'username': shared_with_user.username,
|
||||
'email': shared_with_user.email,
|
||||
'permission': share.permission_type.name,
|
||||
'created_at': share.created_at.isoformat(),
|
||||
'last_accessed': share.last_accessed.isoformat() if share.last_accessed else None
|
||||
})
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'shares': result
|
||||
})
|
||||
|
||||
@app.route('/api/mindmap/<int:mindmap_id>/share', methods=['POST'])
|
||||
@login_required
|
||||
@handle_api_exception
|
||||
def share_mindmap(mindmap_id):
|
||||
"""Teilt eine Mindmap mit einem anderen Benutzer."""
|
||||
# Überprüfen, ob die Mindmap dem Benutzer gehört
|
||||
mindmap = UserMindmap.query.get_or_404(mindmap_id)
|
||||
if mindmap.user_id != current_user.id:
|
||||
return ErrorHandler.api_error("Sie haben keine Berechtigung, diese Mindmap zu teilen.", 403)
|
||||
|
||||
data = request.json
|
||||
if not data or 'email' not in data or 'permission' not in data:
|
||||
return ErrorHandler.api_error("E-Mail-Adresse und Berechtigungstyp sind erforderlich.", 400)
|
||||
|
||||
# Benutzer anhand der E-Mail-Adresse finden
|
||||
user_to_share_with = User.query.filter_by(email=data['email']).first()
|
||||
if not user_to_share_with:
|
||||
return ErrorHandler.api_error("Kein Benutzer mit dieser E-Mail-Adresse gefunden.", 404)
|
||||
|
||||
# Prüfen, ob der Benutzer versucht, mit sich selbst zu teilen
|
||||
if user_to_share_with.id == current_user.id:
|
||||
return ErrorHandler.api_error("Sie können die Mindmap nicht mit sich selbst teilen.", 400)
|
||||
|
||||
# Prüfen, ob die Mindmap bereits mit diesem Benutzer geteilt wurde
|
||||
existing_share = MindmapShare.query.filter_by(
|
||||
mindmap_id=mindmap_id,
|
||||
shared_with_id=user_to_share_with.id
|
||||
).first()
|
||||
|
||||
# Berechtigungstyp validieren und konvertieren
|
||||
try:
|
||||
permission_type = PermissionType[data['permission']]
|
||||
except (KeyError, ValueError):
|
||||
return ErrorHandler.api_error(
|
||||
"Ungültiger Berechtigungstyp. Erlaubte Werte sind: READ, EDIT, ADMIN.",
|
||||
400
|
||||
)
|
||||
|
||||
if existing_share:
|
||||
# Wenn bereits geteilt, aktualisiere die Berechtigungen
|
||||
existing_share.permission_type = permission_type
|
||||
message = "Berechtigungen erfolgreich aktualisiert."
|
||||
else:
|
||||
# Wenn noch nicht geteilt, erstelle eine neue Freigabe
|
||||
new_share = MindmapShare(
|
||||
mindmap_id=mindmap_id,
|
||||
shared_by_id=current_user.id,
|
||||
shared_with_id=user_to_share_with.id,
|
||||
permission_type=permission_type
|
||||
)
|
||||
db.session.add(new_share)
|
||||
message = "Mindmap erfolgreich geteilt."
|
||||
|
||||
# Wenn die Mindmap bisher privat war, mache sie jetzt nicht mehr privat
|
||||
if mindmap.is_private:
|
||||
mindmap.is_private = False
|
||||
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': message
|
||||
})
|
||||
|
||||
@app.route('/api/mindmap/shares/<int:share_id>', methods=['PUT'])
|
||||
@login_required
|
||||
@handle_api_exception
|
||||
def update_mindmap_share(share_id):
|
||||
"""Aktualisiert die Berechtigungen für eine geteilte Mindmap."""
|
||||
# Freigabe finden
|
||||
share = MindmapShare.query.get_or_404(share_id)
|
||||
|
||||
# Prüfen, ob der Benutzer der Eigentümer der Mindmap ist
|
||||
mindmap = UserMindmap.query.get(share.mindmap_id)
|
||||
if not mindmap or mindmap.user_id != current_user.id:
|
||||
return ErrorHandler.api_error("Sie haben keine Berechtigung, diese Freigabe zu ändern.", 403)
|
||||
|
||||
data = request.json
|
||||
if not data or 'permission' not in data:
|
||||
return ErrorHandler.api_error("Berechtigungstyp ist erforderlich.", 400)
|
||||
|
||||
# Berechtigungstyp validieren und konvertieren
|
||||
try:
|
||||
permission_type = PermissionType[data['permission']]
|
||||
except (KeyError, ValueError):
|
||||
return ErrorHandler.api_error(
|
||||
"Ungültiger Berechtigungstyp. Erlaubte Werte sind: READ, EDIT, ADMIN.",
|
||||
400
|
||||
)
|
||||
|
||||
# Berechtigungen aktualisieren
|
||||
share.permission_type = permission_type
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': "Berechtigungen erfolgreich aktualisiert."
|
||||
})
|
||||
|
||||
@app.route('/api/mindmap/shares/<int:share_id>', methods=['DELETE'])
|
||||
@login_required
|
||||
@handle_api_exception
|
||||
def revoke_mindmap_share(share_id):
|
||||
"""Widerruft die Freigabe einer Mindmap für einen Benutzer."""
|
||||
# Freigabe finden
|
||||
share = MindmapShare.query.get_or_404(share_id)
|
||||
|
||||
# Prüfen, ob der Benutzer der Eigentümer der Mindmap ist
|
||||
mindmap = UserMindmap.query.get(share.mindmap_id)
|
||||
if not mindmap or mindmap.user_id != current_user.id:
|
||||
return ErrorHandler.api_error("Sie haben keine Berechtigung, diese Freigabe zu widerrufen.", 403)
|
||||
|
||||
# Freigabe löschen
|
||||
db.session.delete(share)
|
||||
|
||||
# Prüfen, ob dies die letzte Freigabe war und ggf. Mindmap wieder privat setzen
|
||||
remaining_shares = MindmapShare.query.filter_by(mindmap_id=mindmap.id).count()
|
||||
if remaining_shares == 0:
|
||||
mindmap.is_private = True
|
||||
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': "Freigabe erfolgreich widerrufen."
|
||||
})
|
||||
|
||||
@app.route('/api/mindmaps/shared-with-me', methods=['GET'])
|
||||
@login_required
|
||||
@handle_api_exception
|
||||
def get_shared_mindmaps():
|
||||
"""Listet alle Mindmaps auf, die mit dem aktuellen Benutzer geteilt wurden."""
|
||||
shares = MindmapShare.query.filter_by(shared_with_id=current_user.id).all()
|
||||
|
||||
result = []
|
||||
for share in shares:
|
||||
mindmap = UserMindmap.query.get(share.mindmap_id)
|
||||
owner = User.query.get(mindmap.user_id)
|
||||
|
||||
if mindmap and owner:
|
||||
# Zugriffsdatum aktualisieren
|
||||
share.last_accessed = datetime.now(timezone.utc)
|
||||
|
||||
result.append({
|
||||
'id': mindmap.id,
|
||||
'name': mindmap.name,
|
||||
'description': mindmap.description,
|
||||
'owner': {
|
||||
'id': owner.id,
|
||||
'username': owner.username
|
||||
},
|
||||
'created_at': mindmap.created_at.isoformat(),
|
||||
'last_modified': mindmap.last_modified.isoformat(),
|
||||
'permission': share.permission_type.name
|
||||
})
|
||||
|
||||
db.session.commit() # Speichere die aktualisierten Zugriffsdaten
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'mindmaps': result
|
||||
})
|
||||
|
||||
# Hilfsfunktion zur Überprüfung der Berechtigungen
|
||||
def check_mindmap_permission(mindmap_id, permission_type=None):
|
||||
"""
|
||||
Überprüft, ob der aktuelle Benutzer Zugriff auf eine Mindmap hat.
|
||||
|
||||
Args:
|
||||
mindmap_id: ID der Mindmap
|
||||
permission_type: Mindestberechtigung, die erforderlich ist (READ, EDIT, ADMIN)
|
||||
Wenn None, wird nur der Zugriff überprüft.
|
||||
|
||||
Returns:
|
||||
(bool, str): Tupel aus (hat_berechtigung, fehlermeldung)
|
||||
"""
|
||||
mindmap = UserMindmap.query.get(mindmap_id)
|
||||
if not mindmap:
|
||||
return False, "Mindmap nicht gefunden."
|
||||
|
||||
# Wenn der Benutzer der Eigentümer ist, hat er vollen Zugriff
|
||||
if mindmap.user_id == current_user.id:
|
||||
return True, ""
|
||||
|
||||
# Wenn die Mindmap privat ist und der Benutzer nicht der Eigentümer ist
|
||||
if mindmap.is_private:
|
||||
share = MindmapShare.query.filter_by(
|
||||
mindmap_id=mindmap_id,
|
||||
shared_with_id=current_user.id
|
||||
).first()
|
||||
|
||||
if not share:
|
||||
return False, "Sie haben keinen Zugriff auf diese Mindmap."
|
||||
|
||||
# Wenn eine bestimmte Berechtigungsstufe erforderlich ist
|
||||
if permission_type:
|
||||
required_level = PermissionType[permission_type].value
|
||||
user_level = share.permission_type.value
|
||||
|
||||
if required_level not in [p.value for p in PermissionType]:
|
||||
return False, f"Ungültiger Berechtigungstyp: {permission_type}"
|
||||
|
||||
# Berechtigungshierarchie prüfen
|
||||
permission_hierarchy = {
|
||||
PermissionType.READ.name: 1,
|
||||
PermissionType.EDIT.name: 2,
|
||||
PermissionType.ADMIN.name: 3
|
||||
}
|
||||
|
||||
if permission_hierarchy[share.permission_type.name] < permission_hierarchy[permission_type]:
|
||||
return False, f"Sie benötigen {permission_type}-Berechtigungen für diese Aktion."
|
||||
|
||||
return True, ""
|
||||
|
||||
# Flask starten
|
||||
if __name__ == '__main__':
|
||||
with app.app_context():
|
||||
|
||||
@@ -19,3 +19,9 @@
|
||||
2025-05-10 23:15:30,739 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:76]
|
||||
2025-05-10 23:15:32,667 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:76]
|
||||
2025-05-10 23:15:32,667 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:76]
|
||||
2025-05-10 23:16:55,581 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:76]
|
||||
2025-05-10 23:16:57,283 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:76]
|
||||
2025-05-10 23:16:57,283 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:76]
|
||||
2025-05-10 23:17:04,727 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:76]
|
||||
2025-05-10 23:17:06,698 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:76]
|
||||
2025-05-10 23:17:06,698 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:76]
|
||||
|
||||
Reference in New Issue
Block a user