43 lines
1.2 KiB
Python
Executable File
43 lines
1.2 KiB
Python
Executable File
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
|