From 23f2057868e3a1b48a4eb6d8cdfaed17b8ad79ea Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Mon, 29 Apr 2024 23:10:40 +0530 Subject: [PATCH] Allow creating automations from automation settings section in web ui - Create new POST API endpoint to create automations - Use it in the settings page on the web interface to create new automations This simplified managing automations from the setting page by allowing both delete and create from the same page --- src/khoj/interface/web/config.html | 26 +++++++++++++++++-- src/khoj/routers/api.py | 40 ++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/khoj/interface/web/config.html b/src/khoj/interface/web/config.html index e9c24d06..ceb09ff1 100644 --- a/src/khoj/interface/web/config.html +++ b/src/khoj/interface/web/config.html @@ -295,8 +295,8 @@
-
@@ -700,6 +700,28 @@ }); } + async function createAutomation() { + const scheduling_request = window.prompt("Describe the automation you want to create"); + if (!scheduling_request) return; + + const ip_response = await fetch("https://ipapi.co/json"); + const ip_data = await ip_response.json(); + + const query_string = `q=${scheduling_request}&city=${ip_data.city}®ion=${ip_data.region}&country=${ip_data.country_name}&timezone=${ip_data.timezone}`; + const automation_response = await fetch(`/api/automation?${query_string}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }); + if (!automation_response.ok) { + throw new Error(`Failed to create automation: ${automation_response.status}`); + } + + listAutomations(); + } + document.getElementById("create-automation").addEventListener("click", async () => { await createAutomation(); }); + function getIndexedDataSize() { document.getElementById("indexed-data-size").innerHTML = "Calculating..."; fetch('/api/config/index/size') diff --git a/src/khoj/routers/api.py b/src/khoj/routers/api.py index 88148d78..663dc99a 100644 --- a/src/khoj/routers/api.py +++ b/src/khoj/routers/api.py @@ -32,6 +32,7 @@ from khoj.routers.helpers import ( ApiUserRateLimiter, CommonQueryParams, ConversationCommandRateLimiter, + create_automation, update_telemetry_state, ) from khoj.search_filter.date_filter import DateFilter @@ -447,3 +448,42 @@ def delete_automation(request: Request, automation_id: str) -> Response: # Return deleted automation information as a JSON response return Response(content=json.dumps(automation_info), media_type="application/json", status_code=200) + + +@api.post("/automation", response_class=Response) +@requires(["authenticated"]) +async def make_automation( + request: Request, + q: str, + city: Optional[str] = None, + region: Optional[str] = None, + country: Optional[str] = None, + timezone: Optional[str] = None, +) -> Response: + user: KhojUser = request.user.object + if city or region or country: + location = LocationData(city=city, region=region, country=country) + + # Create automation with scheduling query and location data + try: + automation, crontime, query_to_run, subject = await create_automation(q, location, timezone, user, request.url) + except Exception as e: + logger.error(f"Error creating automation {q} for {user.email}: {e}") + return Response( + content=f"Unable to create automation. Ensure the automation doesn't already exist.", + media_type="text/plain", + status_code=500, + ) + + # Collate info about the created user automation + schedule = f'{cron_descriptor.get_description(crontime)} {automation.next_run_time.strftime("%Z")}' + automation_info = { + "id": automation.id, + "subject": subject, + "query_to_run": query_to_run, + "scheduling_request": crontime, + "schedule": schedule, + "next": automation.next_run_time.strftime("%Y-%m-%d %I:%M %p %Z"), + } + # Return information about the created automation as a JSON response + return Response(content=json.dumps(automation_info), media_type="application/json", status_code=200)