Add folders with password sharing and email invites
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
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
|
||||
Reference in New Issue
Block a user