Skip to content

Commit

Permalink
feat: API changes for listing logs with file / level based filter sup…
Browse files Browse the repository at this point in the history
…port (#1083)

* v2 API for listing logs with file / level based filter support

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Commented code removed

* Minor pre-commit fix and markdown text changes

* refactor: Removed v2 API support for execution logs, using filters instead

* Fixed org middleware behaviour for whitelisted paths

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Rahul Johny <[email protected]>
  • Loading branch information
3 people authored Jan 28, 2025
1 parent 77c8472 commit d5a342d
Show file tree
Hide file tree
Showing 10 changed files with 32 additions and 23 deletions.
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ repos:
--settings-path=pyproject.toml,
]
- repo: https://github.com/hadialqattan/pycln
rev: v2.4.0
rev: v2.5.0
hooks:
- id: pycln
args: [--config=pyproject.toml]
Expand Down
3 changes: 0 additions & 3 deletions backend/backend/public_urls_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,6 @@
from django.conf.urls.static import static
from django.urls import include, path

path_prefix = settings.PATH_PREFIX
api_path_prefix = settings.API_DEPLOYMENT_PATH_PREFIX

urlpatterns = [
path("", include("account_v2.urls")),
# Connector OAuth
Expand Down
7 changes: 6 additions & 1 deletion backend/backend/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ def get_required_setting(
"middleware.cache_control.CacheControlMiddleware",
]

TENANT_SUBFOLDER_PREFIX = f"/{PATH_PREFIX}/unstract"
TENANT_SUBFOLDER_PREFIX = f"{PATH_PREFIX}/unstract"
SHOW_PUBLIC_IF_NO_TENANT_FOUND = True

TEMPLATES = [
Expand Down Expand Up @@ -435,6 +435,11 @@ def get_required_setting(
"django_filters.rest_framework.DjangoFilterBackend",
"rest_framework.filters.OrderingFilter",
],
# For API versioning
"DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.URLPathVersioning",
"DEFAULT_VERSION": "v1",
"ALLOWED_VERSIONS": ["v1"],
"VERSION_PARAM": "version",
}

# These paths will work without authentication
Expand Down
6 changes: 0 additions & 6 deletions backend/file_management/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,3 @@ class FileInformationKey:
FILE_UPLOAD_MAX_SIZE = 100 * 1024 * 1024
FILE_UPLOAD_ALLOWED_EXT = ["pdf"]
FILE_UPLOAD_ALLOWED_MIME = ["application/pdf"]


class FileViewTypes:
ORIGINAL = "ORIGINAL"
EXTRACT = "EXTRACT"
SUMMARIZE = "SUMMARIZE"
7 changes: 3 additions & 4 deletions backend/middleware/organization_middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@

class OrganizationMiddleware(MiddlewareMixin):
def process_request(self, request):
tenant_prefix = settings.TENANT_SUBFOLDER_PREFIX.rstrip("/") + "/"
pattern = rf"^{tenant_prefix}(?P<org_id>[^/]+)/"
pattern = r"^/api/(?P<version>v[12])/unstract/(?P<org_id>[^/]+)/"

# Check if the URL matches the pattern with organization ID
match = re.match(pattern, request.path)
Expand All @@ -17,12 +16,12 @@ def process_request(self, request):
re.match(path, request.path)
for path in settings.ORGANIZATION_MIDDLEWARE_WHITELISTED_PATHS
):
request.path_info = "/" + request.path_info
return

org_id = match.group("org_id")
version = match.group("version")
request.organization_id = org_id
new_path = re.sub(pattern, "/" + tenant_prefix, request.path_info)
new_path = re.sub(pattern, f"/api/{version}/unstract/", request.path_info)
request.path_info = new_path
else:
request.organization_id = None
7 changes: 4 additions & 3 deletions backend/workflow_manager/endpoint_v2/source.py
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ def publish_input_output_list_file_logs(
return None

folders_list = "\n".join(f"- `{folder.strip()}`" for folder in folders)
input_log = f"##Folders to process:\n\n{folders_list}\n\n"
input_log = f"## Folders to process:\n\n{folders_list}\n\n"
self.execution_service.publish_update_log(
state=LogState.INPUT_UPDATE, message=input_log
)
Expand All @@ -256,9 +256,10 @@ def publish_input_output_list_file_logs(
def publish_input_file_content(self, input_file_path: str, input_text: str) -> None:
if not self.execution_service:
return None
output_log_message = f"##Input text:\n\n```text\n{input_text}\n```\n\n"
output_log_message = f"## Input text:\n\n```text\n{input_text}\n```\n\n"
input_log_message = (
"##Input file:\n\n```text\n" f"{os.path.basename(input_file_path)}\n```\n\n"
"## Input file:\n\n```text\n"
f"{os.path.basename(input_file_path)}\n```\n\n"
)
self.execution_service.publish_update_log(
state=LogState.INPUT_UPDATE, message=input_log_message
Expand Down
2 changes: 1 addition & 1 deletion backend/workflow_manager/urls.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from django.urls import include, path
from workflow_manager.endpoint_v2 import urls as endpoint_urls
from workflow_manager.workflow_v2 import urls as workflow_urls
from workflow_manager.workflow_v2.urls import workflow as workflow_urls

urlpatterns = [
path("endpoint/", include(endpoint_urls)),
Expand Down
21 changes: 17 additions & 4 deletions backend/workflow_manager/workflow_v2/execution_log_view.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import logging

from django.db.models.query import QuerySet
from permissions.permission import IsOwner
from rest_framework import viewsets
from rest_framework.versioning import URLPathVersioning
Expand All @@ -16,12 +17,24 @@ class WorkflowExecutionLogViewSet(viewsets.ModelViewSet):
serializer_class = WorkflowExecutionLogSerializer
pagination_class = CustomPagination

EVENT_TIME_FELID_ASC = "event_time"
EVENT_TIME_FIELD_ASC = "event_time"

def get_queryset(self):
def get_queryset(self) -> QuerySet:
# Get the execution_id:pk from the URL path
execution_id = self.kwargs.get("pk")
queryset = ExecutionLog.objects.filter(execution_id=execution_id).order_by(
self.EVENT_TIME_FELID_ASC
filter_param = {"execution_id": execution_id}

file_execution_id = self.request.query_params.get("file_execution_id")
if file_execution_id and file_execution_id == "null":
filter_param["file_execution_id"] = None
elif file_execution_id:
filter_param["file_execution_id"] = file_execution_id

log_level = self.request.query_params.get("log_level")
if log_level:
filter_param["data__level"] = log_level.upper()

queryset = ExecutionLog.objects.filter(**filter_param).order_by(
self.EVENT_TIME_FIELD_ASC
)
return queryset
Empty file.

0 comments on commit d5a342d

Please sign in to comment.