ФУНКЦИИ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: администрирование воркспейсов и feature-gates в God Mode
This commit is contained in:
@@ -51,6 +51,7 @@ from plane.db.models import (
|
||||
Workspace,
|
||||
WorkspaceAICredential,
|
||||
WorkspaceAISettings,
|
||||
WorkspaceFeatureEntitlement,
|
||||
WorkspaceMember,
|
||||
)
|
||||
from plane.license.utils.encryption import decrypt_data
|
||||
@@ -288,10 +289,12 @@ def get_request_project_id(request):
|
||||
def get_voice_task_preflight(workspace, user, project_id=None):
|
||||
ai_settings = WorkspaceAISettings.objects.filter(workspace=workspace).first()
|
||||
workspace_member = WorkspaceMember.objects.filter(workspace=workspace, member=user, is_active=True).first()
|
||||
entitlement_enabled = is_voice_tasker_entitled(workspace)
|
||||
|
||||
response = {
|
||||
"available": False,
|
||||
"reason": "not_configured",
|
||||
"entitlement_enabled": entitlement_enabled,
|
||||
"max_audio_duration_seconds": 120,
|
||||
"accepted_mime_types": VOICE_TASK_ACCEPTED_AUDIO_TYPES,
|
||||
"access_mode": "all_workspace_members",
|
||||
@@ -299,6 +302,10 @@ def get_voice_task_preflight(workspace, user, project_id=None):
|
||||
"enabled_member_ids": [],
|
||||
}
|
||||
|
||||
if not entitlement_enabled:
|
||||
response["reason"] = "disabled"
|
||||
return response
|
||||
|
||||
if not ai_settings:
|
||||
return response
|
||||
|
||||
@@ -343,6 +350,14 @@ def get_voice_task_preflight(workspace, user, project_id=None):
|
||||
return response
|
||||
|
||||
|
||||
def is_voice_tasker_entitled(workspace):
|
||||
return WorkspaceFeatureEntitlement.objects.filter(
|
||||
workspace=workspace,
|
||||
feature_key=WorkspaceFeatureEntitlement.FeatureKey.VOICE_TASKER,
|
||||
is_enabled=True,
|
||||
).exists()
|
||||
|
||||
|
||||
def get_voice_task_quota_project(workspace, project_id=None, ai_settings=None):
|
||||
if project_id:
|
||||
project = Project.objects.filter(
|
||||
@@ -3390,11 +3405,23 @@ class WorkspaceAISettingsEndpoint(BaseAPIView):
|
||||
def get(self, request, slug):
|
||||
workspace, ai_settings = self.get_settings(slug)
|
||||
serializer = WorkspaceAISettingsSerializer(ai_settings, context={"workspace": workspace})
|
||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||
data = serializer.data
|
||||
data["feature_entitlement_enabled"] = is_voice_tasker_entitled(workspace)
|
||||
return Response(data, status=status.HTTP_200_OK)
|
||||
|
||||
@allow_permission(allowed_roles=[ROLE.ADMIN], level="WORKSPACE")
|
||||
def patch(self, request, slug):
|
||||
workspace, ai_settings = self.get_settings(slug)
|
||||
requested_enabled = request.data.get("voice_tasker_enabled")
|
||||
if requested_enabled in [True, "true", "True", "1", 1] and not is_voice_tasker_entitled(workspace):
|
||||
return Response(
|
||||
{
|
||||
"error": "Voice Tasker is not enabled for this workspace by the instance administrator.",
|
||||
"code": "feature_not_entitled",
|
||||
},
|
||||
status=status.HTTP_403_FORBIDDEN,
|
||||
)
|
||||
|
||||
serializer = WorkspaceAISettingsSerializer(
|
||||
ai_settings,
|
||||
data=request.data,
|
||||
|
||||
Reference in New Issue
Block a user