From 08a11c240daff0a19521da04654425a8d1aabd62 Mon Sep 17 00:00:00 2001 From: Kobe Date: Sat, 31 May 2025 22:58:31 +0200 Subject: [PATCH] room notifications --- .../__pycache__/room_members.cpython-313.pyc | Bin 9431 -> 10069 bytes routes/__pycache__/rooms.cpython-313.pyc | Bin 19080 -> 20790 bytes routes/room_members.py | 122 ++++++++++-------- routes/rooms.py | 109 +++++++++++----- 4 files changed, 143 insertions(+), 88 deletions(-) diff --git a/routes/__pycache__/room_members.cpython-313.pyc b/routes/__pycache__/room_members.cpython-313.pyc index 70dda33f21b47a265b977dbaf2a60abfd597a2a4..1a7cb40691f23bfea608f40d5c915599485f71e3 100644 GIT binary patch delta 1970 zcmb`HTWs4@7{`6$IB}9D=_O9mI*y$-?dop5Y)x-$OsUqc_gg#zTR>gcwOUy(%&7!J zhzf*+Kw{H$9txAtI)NBG0G$G&lMpN7p_R4=N9~lTiqItb0@9@39uP=_bCS9VQW<-| zlE3pm{=V}+w$J&Uc*lcY+qTteCeZb0{OE-#{Y!}X+bS16S$YjYAWLa&*r$Sj!Zvv3@+vrT8?X#p&(4s z9$n}J>}QLh$7(sys-+~?zuC*AOkrcnAyddO=yaL(UV7gNo$ZplipqM6{l2WQi4=&i zSDQX0Xe!f&+ETCio7EHW5#e?%VI+ov1Tks+kHKAda4(u8Pa7yv;T}!P#yXJJH9%7m z8_-2`JRu?TW}|<%9R;Jrvm{T90?`wtZD)Y-*BvxeJOC>NFMQj60dCok`PU4?Qxg+o z(`%;I*M>)4nI4;(T%(n#@$qv*!xz`c$h0ETuqLdgJ9Ta9A=kXNhWAOUm3Re~98e?4J3ir&W)yUYk zOgSd=j)ySiCtT$Z_uLY`nes$g#jS~(6LW*}&GYBKo4h@#*0ri7CzJfaI3I}d0o7YK zKk&^P@rIsQLyubDt9tr2Ee6K6VoGxTzG~2OCbGXv@X~EpUC(d;B=e4T6>H%H#=LUu9 z|A_GDr!CoA=q@*L&u#85Chry3b#vr>7eM+xN1^z-AA%x3e4Ovqy`YbJ3%&wJ5PcjP zn7Smr44%A&BudsnfpNfY#sYmzK~7e=A45r^JqX7cudS90mutSEiZo-Dc>fhibQL9; zn)GNNR%;cK8KIVT7Mv8=wUSAA*6GAn87TfSi&#ra7Q|I1EohFJR?0zK!4Dh)IGloK z(dls@c=mwZg@=My96V^y5Xl@#_HdJCCQ}+1S%~EBAwo4%DMV14g-9O!+4%z-Mji@2 zT9h^vPAPR*Vt_>se(4J4bRoHBI6pEzGCcwxyK0a3;{rVn12}|mkWdf}iW}=f94c{; zalpS)c@Bk$0R;idZr(hE)XVtMxA0B(bp#Q=3(=u$h>kBz-@Sb2^1{XCJeBQwI*9fo z2ygc-lLhVaq7*>~vj{4wNR-bU`r7)1b#7*UXhDD1cE_eRw5g@-PeS#7BnSc2@>B%< zRs!Wd}uHEEOj6%cqx@JxL8tTR*=L8b>tCTFL~7+1fY7GBy_nroB$ho{9vO+2QT?q graCJpp&aUOoP#(0UUwBJ+Z**F*wmxGas;{l4dr9PzyJUM delta 1243 zcmah|O-vg{7~NU#+Q#-8Z~U{~_1bI0vcx3V5K|@k)n{OYHpROBL&o!^w{Gf5_yGuKuT|^6d;^(s5)axO4Oi^G;iL_ z_w6@7@9pE^THgDd<6IPO?%p>)xEWpao^_%h;d6PgI`4eX20w8M%E0ABlzW3Dk*4z{ z8{`skx`bea6QIxIgi+213q( zz4u*2CsmjhB~W}*&UO2xkEW+5XW^ru| z_OA<93Nl-WICDueY%do9wn8tF2n?h1cDSIgvAGkNn^!3@8><+k WTX4=bNuL zZ~I-ibeQr4{nzq0W=+4k=58~YHsct++ovjY%PNEeG5Qx9%*kI>e+?uN+!YiQB|4`S zoYZJKQ$pqVKNG6hvd8`%b+$x9zaT(5ypD$p(ZXchRnwXt1-oX=C7Beb?Ns=|fcrZi)odiY+q%q8} z7@$K^++&!$PgXubaHX{izLX{pa?j!Y?m52H^Dw)dT{`mHs41L#)jj#wS%(O{-Q>pl zN)79@@3W4gS?b|?LwAN2PF50?(+`Fhht13>GjW=DvEu-byv8DsmWSvUOm$9v!c=c1 zBFO$0zM7GTm6rY>d8oz%8D7GM2#kWiHHk)`uQlr$#|!hg&#*ASpQx_1{)}jkAFj6j z;3mJ9L0-xjhnyz4rZGh%^(kD`J`VLE?YWJjeFRRSO$N_5=MX&8BEh5kLOKrN`Q{iX Q?XmFw$Qarpk%rCx2I~4Spa1{> diff --git a/routes/__pycache__/rooms.cpython-313.pyc b/routes/__pycache__/rooms.cpython-313.pyc index e229609b11fef301382f37db1a5ccd6336d1b7a6..c2ec82d4c78171177488d442f9863484cd829e3d 100644 GIT binary patch delta 5221 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

QGq6pW^cc>T=2_9IY5-|Pr0 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 diff --git a/routes/room_members.py b/routes/room_members.py index 7a10312..bbeec56 100644 --- a/routes/room_members.py +++ b/routes/room_members.py @@ -69,36 +69,39 @@ def add_room_member(room_id): permission.can_move = permissions.get('can_move', False) permission.can_share = permissions.get('can_share', False) - db.session.commit() + try: + # Create notification for the invited user + create_notification( + notif_type='room_invite', + user_id=user_id, + sender_id=current_user.id, + details={ + 'message': f'You have been invited to join room "{room.name}"', + 'room_id': room_id, + 'room_name': room.name, + 'invited_by': f"{current_user.username} {current_user.last_name}", + 'permissions': permissions, + 'timestamp': datetime.utcnow().isoformat() + } + ) + + log_event( + event_type='room_member_add', + details={ + 'room_id': room_id, + 'room_name': room.name, + 'added_user_id': user_id, + 'added_user_name': f"{user.username} {user.last_name}", + 'added_by': f"{current_user.username} {current_user.last_name}" + }, + user_id=current_user.id + ) - # Create notification for the invited user - create_notification( - notif_type='room_invite', - user_id=user_id, - sender_id=current_user.id, - details={ - 'message': f'You have been invited to join room "{room.name}"', - 'room_id': room_id, - 'room_name': room.name, - 'invited_by': f"{current_user.username} {current_user.last_name}", - 'permissions': permissions, - 'timestamp': datetime.utcnow().isoformat() - } - ) - - log_event( - event_type='room_member_add', - details={ - 'room_id': room_id, - 'room_name': room.name, - 'added_user_id': user_id, - 'added_user_name': f"{user.username} {user.last_name}", - 'added_by': f"{current_user.username} {current_user.last_name}" - }, - user_id=current_user.id - ) - - return jsonify({'success': True}) + db.session.commit() + return jsonify({'success': True}) + except Exception as e: + db.session.rollback() + return jsonify({'error': str(e)}), 500 @room_members_bp.route('//members/', methods=['DELETE']) @login_required @@ -118,35 +121,38 @@ def remove_room_member(room_id, user_id): if permission: db.session.delete(permission) - db.session.commit() + try: + # Create notification for the removed user + create_notification( + notif_type='room_invite_removed', + user_id=user_id, + sender_id=current_user.id, + details={ + 'message': f'You have been removed from room "{room.name}"', + 'room_id': room_id, + 'room_name': room.name, + 'removed_by': f"{current_user.username} {current_user.last_name}", + 'timestamp': datetime.utcnow().isoformat() + } + ) + + log_event( + event_type='room_member_remove', + details={ + 'room_id': room_id, + 'room_name': room.name, + 'removed_user_id': user_id, + 'removed_user_name': f"{user.username} {user.last_name}", + 'removed_by': f"{current_user.username} {current_user.last_name}" + }, + user_id=current_user.id + ) - # Create notification for the removed user - create_notification( - notif_type='room_invite_removed', - user_id=user_id, - sender_id=current_user.id, - details={ - 'message': f'You have been removed from room "{room.name}"', - 'room_id': room_id, - 'room_name': room.name, - 'removed_by': f"{current_user.username} {current_user.last_name}", - 'timestamp': datetime.utcnow().isoformat() - } - ) - - log_event( - event_type='room_member_remove', - details={ - 'room_id': room_id, - 'room_name': room.name, - 'removed_user_id': user_id, - 'removed_user_name': f"{user.username} {user.last_name}", - 'removed_by': f"{current_user.username} {current_user.last_name}" - }, - user_id=current_user.id - ) - - return jsonify({'success': True}) + db.session.commit() + return jsonify({'success': True}) + except Exception as e: + db.session.rollback() + return jsonify({'error': str(e)}), 500 @room_members_bp.route('//members//permissions', methods=['PUT']) @login_required @@ -193,5 +199,7 @@ def update_member_permissions(room_id, user_id): }, user_id=current_user.id ) + + db.session.commit() return jsonify({'success': True}) \ No newline at end of file diff --git a/routes/rooms.py b/routes/rooms.py index e4793e1..42c799b 100644 --- a/routes/rooms.py +++ b/routes/rooms.py @@ -4,9 +4,10 @@ from models import db, Room, User, RoomMemberPermission, RoomFile from forms import RoomForm from routes.room_files import user_has_permission from routes.auth import require_password_change -from utils import log_event +from utils import log_event, create_notification import os import shutil +from datetime import datetime rooms_bp = Blueprint('rooms', __name__, url_prefix='/rooms') @@ -148,21 +149,49 @@ def add_member(room_id): # Ensure user is added to the room.members relationship if user not in room.members: room.members.append(user) - db.session.commit() - log_event( - event_type='room_member_add', - details={ - 'room_id': room_id, - 'room_name': room.name, - 'added_user': f"{user.username} {user.last_name}", - 'added_by': f"{current_user.username} {current_user.last_name}" - }, - user_id=current_user.id - ) - db.session.commit() - - flash(f'{user.username} has been added to the room.', 'success') + try: + # Create notification for the invited user + create_notification( + notif_type='room_invite', + user_id=user.id, + sender_id=current_user.id, + details={ + 'message': f'You have been invited to join room "{room.name}"', + 'room_id': room_id, + 'room_name': room.name, + 'invited_by': f"{current_user.username} {current_user.last_name}", + 'permissions': { + 'can_view': True, + 'can_download': False, + 'can_upload': False, + 'can_delete': False, + 'can_rename': False, + 'can_move': False, + 'can_share': False + }, + 'timestamp': datetime.utcnow().isoformat() + } + ) + + log_event( + event_type='room_member_add', + details={ + 'room_id': room_id, + 'room_name': room.name, + 'added_user': f"{user.username} {user.last_name}", + 'added_by': f"{current_user.username} {current_user.last_name}" + }, + user_id=current_user.id + ) + + db.session.commit() + flash(f'{user.username} has been added to the room.', 'success') + except Exception as e: + db.session.rollback() + flash('An error occurred while adding the member.', 'error') + print(f"Error adding member: {str(e)}") + return redirect(url_for('rooms.room_members', room_id=room_id)) @rooms_bp.route('//members//remove', methods=['POST']) @@ -186,22 +215,40 @@ def remove_member(room_id, user_id): flash('User is not a member of this room.', 'error') else: user = User.query.get(user_id) - db.session.delete(perm) - db.session.commit() - - log_event( - event_type='room_member_remove', - details={ - 'room_id': room_id, - 'room_name': room.name, - 'removed_user': f"{user.username} {user.last_name}", - 'removed_by': f"{current_user.username} {current_user.last_name}" - }, - user_id=current_user.id - ) - db.session.commit() - - flash('User has been removed from the room.', 'success') + try: + # Create notification for the removed user + create_notification( + notif_type='room_invite_removed', + user_id=user_id, + sender_id=current_user.id, + details={ + 'message': f'You have been removed from room "{room.name}"', + 'room_id': room_id, + 'room_name': room.name, + 'removed_by': f"{current_user.username} {current_user.last_name}", + 'timestamp': datetime.utcnow().isoformat() + } + ) + + log_event( + event_type='room_member_remove', + details={ + 'room_id': room_id, + 'room_name': room.name, + 'removed_user': f"{user.username} {user.last_name}", + 'removed_by': f"{current_user.username} {current_user.last_name}" + }, + user_id=current_user.id + ) + + db.session.delete(perm) + db.session.commit() + flash('User has been removed from the room.', 'success') + except Exception as e: + db.session.rollback() + flash('An error occurred while removing the member.', 'error') + print(f"Error removing member: {str(e)}") + return redirect(url_for('rooms.room_members', room_id=room_id)) @rooms_bp.route('//members//permissions', methods=['POST'])