ФУНКЦИИ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: Voice Tasker preview и трейс активности
This commit is contained in:
@@ -2589,66 +2589,145 @@ class VoiceTaskCommitEndpoint(BaseAPIView):
|
||||
)
|
||||
|
||||
if action == "create_task":
|
||||
project = Project.objects.get(id=resolution["project"]["id"], workspace=workspace)
|
||||
payload = build_voice_task_issue_payload(draft, resolution, voice_session.transcript)
|
||||
payload_without_project = {key: value for key, value in payload.items() if key != "project_id"}
|
||||
payload_without_project["external_source"] = VOICE_TASK_EXTERNAL_SOURCE
|
||||
payload_without_project["external_id"] = str(voice_session.id)
|
||||
existing_issue = voice_session.created_task
|
||||
if is_voice_task_issue_available(existing_issue):
|
||||
issue = existing_issue
|
||||
if not can_user_update_voice_task_issue(request.user, workspace, issue):
|
||||
return Response(
|
||||
{
|
||||
"ok": False,
|
||||
"code": "issue_permission_denied",
|
||||
"error": "Voice Task draft could not update the created work item.",
|
||||
},
|
||||
status=status.HTTP_403_FORBIDDEN,
|
||||
)
|
||||
|
||||
serializer = IssueCreateSerializer(
|
||||
data=payload_without_project,
|
||||
context={
|
||||
"project_id": project.id,
|
||||
"workspace_id": workspace.id,
|
||||
"default_assignee_id": project.default_assignee_id,
|
||||
},
|
||||
)
|
||||
if not serializer.is_valid():
|
||||
return Response(
|
||||
{
|
||||
"ok": False,
|
||||
"code": "issue_validation_failed",
|
||||
"error": "Voice Task draft could not be converted to a work item.",
|
||||
"details": serializer.errors,
|
||||
},
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
project = Project.objects.get(id=resolution["project"]["id"], workspace=workspace)
|
||||
payload = build_voice_task_issue_payload(draft, resolution, voice_session.transcript)
|
||||
payload_without_project = {key: value for key, value in payload.items() if key != "project_id"}
|
||||
payload_without_project["external_source"] = VOICE_TASK_EXTERNAL_SOURCE
|
||||
payload_without_project["external_id"] = str(voice_session.id)
|
||||
current_instance = json.dumps(IssueDetailSerializer(issue).data, cls=DjangoJSONEncoder)
|
||||
requested_data = json.dumps(
|
||||
{**payload_without_project, "project_id": str(project.id)},
|
||||
cls=DjangoJSONEncoder,
|
||||
)
|
||||
|
||||
issue = serializer.save(created_by_id=request.user.id)
|
||||
voice_session.created_task = issue
|
||||
voice_session.parsed_json = draft
|
||||
voice_session.save(update_fields=["created_task", "parsed_json", "updated_at"])
|
||||
if issue.project_id != project.id:
|
||||
issue = move_voice_task_issue_to_project(issue, project, resolution["state"], request.user)
|
||||
|
||||
requested_data = json.dumps(payload_without_project, cls=DjangoJSONEncoder)
|
||||
issue_activity.delay(
|
||||
type="issue.activity.created",
|
||||
requested_data=requested_data,
|
||||
actor_id=str(request.user.id),
|
||||
issue_id=str(issue.id),
|
||||
project_id=str(project.id),
|
||||
current_instance=None,
|
||||
epoch=int(timezone.now().timestamp()),
|
||||
notification=True,
|
||||
origin=base_host(request=request, is_app=True),
|
||||
)
|
||||
model_activity.delay(
|
||||
model_name="issue",
|
||||
model_id=str(issue.id),
|
||||
requested_data=payload_without_project,
|
||||
current_instance=None,
|
||||
actor_id=request.user.id,
|
||||
slug=slug,
|
||||
origin=base_host(request=request, is_app=True),
|
||||
)
|
||||
issue_description_version_task.delay(
|
||||
updated_issue=requested_data,
|
||||
issue_id=str(issue.id),
|
||||
user_id=request.user.id,
|
||||
is_creating=True,
|
||||
)
|
||||
serializer = IssueCreateSerializer(
|
||||
issue,
|
||||
data=payload_without_project,
|
||||
partial=True,
|
||||
context={"project_id": project.id},
|
||||
)
|
||||
if not serializer.is_valid():
|
||||
return Response(
|
||||
{
|
||||
"ok": False,
|
||||
"code": "issue_validation_failed",
|
||||
"error": "Voice Task draft could not update the created work item.",
|
||||
"details": serializer.errors,
|
||||
},
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
)
|
||||
|
||||
response_status = status.HTTP_201_CREATED
|
||||
commit_status = "created"
|
||||
serializer.save()
|
||||
issue.refresh_from_db()
|
||||
voice_session.created_task = issue
|
||||
voice_session.parsed_json = draft
|
||||
voice_session.save(update_fields=["created_task", "parsed_json", "updated_at"])
|
||||
|
||||
issue_activity.delay(
|
||||
type="issue.activity.updated",
|
||||
requested_data=requested_data,
|
||||
actor_id=str(request.user.id),
|
||||
issue_id=str(issue.id),
|
||||
project_id=str(project.id),
|
||||
current_instance=current_instance,
|
||||
epoch=int(timezone.now().timestamp()),
|
||||
notification=True,
|
||||
origin=base_host(request=request, is_app=True),
|
||||
)
|
||||
model_activity.delay(
|
||||
model_name="issue",
|
||||
model_id=str(issue.id),
|
||||
requested_data=json.loads(requested_data),
|
||||
current_instance=current_instance,
|
||||
actor_id=request.user.id,
|
||||
slug=slug,
|
||||
origin=base_host(request=request, is_app=True),
|
||||
)
|
||||
issue_description_version_task.delay(
|
||||
updated_issue=current_instance,
|
||||
issue_id=str(issue.id),
|
||||
user_id=request.user.id,
|
||||
)
|
||||
|
||||
response_status = status.HTTP_200_OK
|
||||
commit_status = "updated"
|
||||
else:
|
||||
project = Project.objects.get(id=resolution["project"]["id"], workspace=workspace)
|
||||
payload = build_voice_task_issue_payload(draft, resolution, voice_session.transcript)
|
||||
payload_without_project = {key: value for key, value in payload.items() if key != "project_id"}
|
||||
payload_without_project["external_source"] = VOICE_TASK_EXTERNAL_SOURCE
|
||||
payload_without_project["external_id"] = str(voice_session.id)
|
||||
|
||||
serializer = IssueCreateSerializer(
|
||||
data=payload_without_project,
|
||||
context={
|
||||
"project_id": project.id,
|
||||
"workspace_id": workspace.id,
|
||||
"default_assignee_id": project.default_assignee_id,
|
||||
},
|
||||
)
|
||||
if not serializer.is_valid():
|
||||
return Response(
|
||||
{
|
||||
"ok": False,
|
||||
"code": "issue_validation_failed",
|
||||
"error": "Voice Task draft could not be converted to a work item.",
|
||||
"details": serializer.errors,
|
||||
},
|
||||
status=status.HTTP_400_BAD_REQUEST,
|
||||
)
|
||||
|
||||
issue = serializer.save(created_by_id=request.user.id)
|
||||
voice_session.created_task = issue
|
||||
voice_session.parsed_json = draft
|
||||
voice_session.save(update_fields=["created_task", "parsed_json", "updated_at"])
|
||||
|
||||
requested_data = json.dumps(payload_without_project, cls=DjangoJSONEncoder)
|
||||
issue_activity.delay(
|
||||
type="issue.activity.created",
|
||||
requested_data=requested_data,
|
||||
actor_id=str(request.user.id),
|
||||
issue_id=str(issue.id),
|
||||
project_id=str(project.id),
|
||||
current_instance=None,
|
||||
epoch=int(timezone.now().timestamp()),
|
||||
notification=True,
|
||||
origin=base_host(request=request, is_app=True),
|
||||
)
|
||||
model_activity.delay(
|
||||
model_name="issue",
|
||||
model_id=str(issue.id),
|
||||
requested_data=payload_without_project,
|
||||
current_instance=None,
|
||||
actor_id=request.user.id,
|
||||
slug=slug,
|
||||
origin=base_host(request=request, is_app=True),
|
||||
)
|
||||
issue_description_version_task.delay(
|
||||
updated_issue=requested_data,
|
||||
issue_id=str(issue.id),
|
||||
user_id=request.user.id,
|
||||
is_creating=True,
|
||||
)
|
||||
|
||||
response_status = status.HTTP_201_CREATED
|
||||
commit_status = "created"
|
||||
|
||||
elif action == "update_task":
|
||||
target_task = resolution.get("target_task") or {}
|
||||
|
||||
Reference in New Issue
Block a user