feat: Vor-/Nachname, geteilte Listen zeigen Eigentuemer
Backend: - User.first_name / User.last_name (nullable, Auto-Migrate fuegt sie an) full_name/display_name als Properties + in to_dict - TaskList.owner-Relationship ergaenzt (fehlte, daher wurden geteilte Listen beim Empfaenger nicht korrekt aufgeloest) - /auth/me GET + PUT (Profil bearbeiten: Vorname, Nachname, E-Mail) - /users/search findet jetzt auch nach Vor-/Nachname und liefert full_name/display_name mit - list_tasklists/list_calendars/list_addressbooks liefern owner_full_name und owner_display_name Frontend: - Sidebars bei Kontakten/Kalender/Aufgaben: "(geteilt von <Voller Name>)" mit Fallback auf Username - User-Search-Popup zeigt vollen Namen neben Username - SettingsView: Vorname/Nachname/E-Mail bearbeiten Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -281,6 +281,31 @@ def create_invite_link():
|
||||
|
||||
# --- User search (for sharing dialogs) ---
|
||||
|
||||
@api_bp.route('/auth/me', methods=['GET'])
|
||||
@token_required
|
||||
def get_me():
|
||||
return jsonify(request.current_user.to_dict(include_email=True)), 200
|
||||
|
||||
|
||||
@api_bp.route('/auth/me', methods=['PUT'])
|
||||
@token_required
|
||||
def update_me():
|
||||
user = request.current_user
|
||||
data = request.get_json() or {}
|
||||
if 'first_name' in data:
|
||||
user.first_name = (data.get('first_name') or '').strip() or None
|
||||
if 'last_name' in data:
|
||||
user.last_name = (data.get('last_name') or '').strip() or None
|
||||
if 'email' in data:
|
||||
email = (data.get('email') or '').strip() or None
|
||||
if email and email != user.email:
|
||||
if User.query.filter(User.email == email, User.id != user.id).first():
|
||||
return jsonify({'error': 'E-Mail ist bereits vergeben'}), 409
|
||||
user.email = email
|
||||
db.session.commit()
|
||||
return jsonify(user.to_dict(include_email=True)), 200
|
||||
|
||||
|
||||
@api_bp.route('/users/search', methods=['GET'])
|
||||
@token_required
|
||||
def search_users():
|
||||
@@ -289,13 +314,19 @@ def search_users():
|
||||
if len(query) < 2:
|
||||
return jsonify([]), 200
|
||||
|
||||
like = f'%{query}%'
|
||||
users = User.query.filter(
|
||||
User.username.ilike(f'%{query}%'),
|
||||
(User.username.ilike(like)) | (User.first_name.ilike(like)) | (User.last_name.ilike(like)),
|
||||
User.id != request.current_user.id,
|
||||
User.is_active == True,
|
||||
).limit(10).all()
|
||||
|
||||
return jsonify([{'id': u.id, 'username': u.username} for u in users]), 200
|
||||
return jsonify([{
|
||||
'id': u.id,
|
||||
'username': u.username,
|
||||
'full_name': u.full_name,
|
||||
'display_name': u.display_name,
|
||||
} for u in users]), 200
|
||||
|
||||
|
||||
# --- Change password (non-admin, own account) ---
|
||||
|
||||
Reference in New Issue
Block a user