from typing import TYPE_CHECKING from rules import always_deny, predicate from outbo.apps.core.rules import is_agency from outbo.apps.products.rules import can_read_product if TYPE_CHECKING: from outbo.apps.authentication.models import User from outbo.apps.photobriefing.models import Brief, BriefItem # Brief @predicate def _has_readable_product(user: "User", brief: "Brief"): return can_read_product.test(user, brief.product) @predicate def can_edit_brief(user: "User", brief: "Brief"): return brief.editable_for_user(user=user) @predicate def can_publish_brief(user: "User", brief: "Brief"): return brief.publishable_for_user(user=user) @predicate def can_complete_brief(user: "User", brief: "Brief"): return brief.completable_for_user(user=user) @predicate def can_accept_brief(user: "User", brief: "Brief"): return brief.acceptable_for_user(user=user) # CRUD can_create_brief = always_deny can_read_brief = _has_readable_product can_update_brief = ( can_edit_brief | can_publish_brief | can_accept_brief | can_complete_brief ) can_delete_brief = always_deny # BriefItem @predicate def _has_readable_brief(user: "User", brief_item: "BriefItem"): return can_read_brief.test(user, brief_item.brief) @predicate def _has_editable_brief(user: "User", brief_item: "BriefItem"): return can_edit_brief.test(user, brief_item.brief) # CRUD can_create_brief_item = is_agency can_read_brief_item = _has_readable_brief can_update_brief_item = always_deny can_delete_brief_item = _has_editable_brief