from flask import session from app.models import Folder, FolderMember def get_unlocked_folder_ids(): return session.get("unlocked_folders", []) def unlock_folder(folder_id): unlocked = session.get("unlocked_folders", []) if folder_id not in unlocked: unlocked.append(folder_id) session["unlocked_folders"] = unlocked session.modified = True def is_folder_unlocked(folder): if not folder.has_password: return True return folder.id in get_unlocked_folder_ids() def get_folder_member(folder, user): if not user or not user.is_authenticated: return None return FolderMember.query.filter_by(folder_id=folder.id, user_id=user.id).first() def is_folder_owner(folder, user): return user and user.is_authenticated and folder.owner_id == user.id def can_view_folder(folder, user=None): from flask_login import current_user user = user or current_user if is_folder_owner(folder, user): return True if user and user.is_authenticated and user.is_admin: return True member = get_folder_member(folder, user) if member: return True if not folder.is_private and is_folder_unlocked(folder): return True if is_folder_unlocked(folder): return True return False def can_edit_folder(folder, user=None): from flask_login import current_user user = user or current_user if is_folder_owner(folder, user): return True if user and user.is_authenticated and user.is_admin: return True member = get_folder_member(folder, user) return member is not None and member.role == "editor" def can_manage_folder_settings(folder, user=None): from flask_login import current_user user = user or current_user return is_folder_owner(folder, user) or (user and user.is_authenticated and user.is_admin) def process_pending_invites(user): from app import db from app.models import FolderInvite invites = FolderInvite.query.filter_by(email=user.email.lower()).all() accepted = 0 for invite in invites: existing = FolderMember.query.filter_by( folder_id=invite.folder_id, user_id=user.id ).first() if not existing: db.session.add( FolderMember( folder_id=invite.folder_id, user_id=user.id, role=invite.role, added_by_id=invite.invited_by_id, ) ) accepted += 1 db.session.delete(invite) if invites: db.session.commit() return accepted