This commit is contained in:
2025-09-27 20:49:58 +02:00
commit 767fb638ce
58 changed files with 6724 additions and 0 deletions

92
routes/friends.py Normal file
View File

@@ -0,0 +1,92 @@
from flask import Blueprint, redirect, url_for, flash, render_template
from flask_login import login_required, current_user
from models import db, Notification, Event, User, Friendship, Reward
from flask_babel import gettext as _
friends_bp = Blueprint('friend', __name__)
@friends_bp.route('/add_friend/<int:user_id>', methods=['POST'])
@login_required
def add_friend(user_id):
if user_id == current_user.id:
flash(_('You cannot add yourself as a friend.'), 'warning')
return redirect(url_for('user.users'))
existing = db.session.query(Friendship).filter_by(requester_id=current_user.id, receiver_id=user_id).first()
if existing:
flash(_('Friend request already sent.'), 'info')
else:
friendship = Friendship(requester_id=current_user.id, receiver_id=user_id)
db.session.add(friendship)
db.session.commit()
friend = db.session.get(User, user_id)
event = Event(message=_(f"{current_user.username} sent a friend request to {friend.username}."))
db.session.add(event)
db.session.commit()
notif = Notification(
user_id=user_id,
message=_(f"You have received a friend request from {current_user.username}.")
)
db.session.add(notif)
db.session.commit()
flash(_('Friend request sent!'), 'success')
return redirect(url_for('user.users'))
@friends_bp.route('/accept_friend/<int:friendship_id>', methods=['POST'])
@login_required
def accept_friend(friendship_id):
friendship = db.session.get(Friendship, friendship_id)
if friendship and friendship.receiver_id == current_user.id:
friendship.status = 'accepted'
db.session.commit()
friend = db.session.get(User, friendship.requester_id)
event = Event(message=_(f"{current_user.username} und {friend.username} sind jetzt Freunde."))
db.session.add(event)
db.session.add(Reward(user_id=current_user.id, type='friendship', points=5))
db.session.add(Reward(user_id=friendship.requester_id, type='friendship', points=5))
db.session.commit()
flash(_('Friend request accepted!'), 'success')
else:
flash(_('Invalid friend request.'), 'danger')
return redirect(url_for('friend.friends'))
@friends_bp.route('/reject_friend/<int:friendship_id>', methods=['POST'])
@login_required
def reject_friend(friendship_id):
friendship = db.session.get(Friendship, friendship_id)
if friendship and friendship.receiver_id == current_user.id:
friendship.status = 'rejected'
db.session.commit()
friend = db.session.get(User, friendship.requester_id)
event = Event(message=_(f"{current_user.username} has rejected {friend.username}'s friend request."))
db.session.add(event)
db.session.commit()
flash(_('Friend request rejected.'), 'info')
else:
flash(_('Invalid friend request.'), 'danger')
return redirect(url_for('friend.friends'))
@friends_bp.route('/friends')
@login_required
def friends():
friends = db.session.query(User).join(Friendship, ((Friendship.requester_id == User.id) | (Friendship.receiver_id == User.id)))\
.filter(
((Friendship.requester_id == current_user.id) | (Friendship.receiver_id == current_user.id)),
Friendship.status == 'accepted',
User.id != current_user.id
).all()
requests = db.session.query(Friendship).filter_by(receiver_id=current_user.id, status='pending').all()
return render_template('friends.html', friends=friends, requests=requests)
@friends_bp.route('/remove_friend/<int:user_id>', methods=['POST'])
@login_required
def remove_friend(user_id):
friendship = db.session.query(Friendship).filter(
((Friendship.requester_id == current_user.id) & (Friendship.receiver_id == user_id)) |
((Friendship.requester_id == user_id) & (Friendship.receiver_id == current_user.id)),
Friendship.status == 'accepted'
).first()
if friendship:
db.session.delete(friendship)
db.session.commit()
flash(_('Friendship ended.'), 'info')
return redirect(url_for('friend.friends'))