from enum import StrEnum class ApprovalStatus(StrEnum): PENDING = "pending" APPROVED = "approved" REJECTED = "rejected" USED = "used" class ApprovalActionValue(StrEnum): CREATE = "create" UPDATE = "update" class ApprovalErrorDetail(StrEnum): NOT_FOUND = "Approval ticket not found" ALREADY_DECIDED = "Approval ticket already decided" SELF_APPROVAL = "Approval applicant cannot approve their own ticket" NOT_APPROVED = "Approval ticket is not approved for this change" PAYLOAD_MISMATCH = "Approval ticket payload does not match this change" class ApprovalPayloadKey(StrEnum): TICKET_ID = "ticket_id" STATUS = "status" COMMENT = "comment" RECORD_ID = "record_id" USED_BY = "used_by" USED_AT = "used_at" APPROVAL_ACTION_SEPARATOR = ":" def approval_action(action: ApprovalActionValue | str, domain: str) -> str: return f"{action}{APPROVAL_ACTION_SEPARATOR}{domain}"