from typing import TYPE_CHECKING from rules import predicate, always_deny from outbo.apps.core.rules import is_supplier, is_agency, is_client if TYPE_CHECKING: from outbo.apps.projects.models import Project, Member @predicate def _project_published(_, project: "Project"): return project.published can_publish_project = is_supplier & ~_project_published can_create_project = is_supplier can_read_project = is_supplier | is_agency | (is_client & _project_published) can_update_project = can_publish_project can_delete_project = always_deny @predicate def _can_remove_this_member(user: "User", member: "Member"): project = member.project all_memberships = project.members current_user_membership = all_memberships.filter(user=user).first() if current_user_membership is None: return False current_role_memberships = all_memberships.filter(role=current_user_membership.role) return ( member.role == current_user_membership.role and current_role_memberships.count() > 1 ) can_create_project_member = is_supplier can_read_project_member = always_deny can_update_project_member = always_deny can_delete_project_member = _can_remove_this_member