notionhive-ai commited on
Commit
3af2c8f
·
verified ·
1 Parent(s): 5ec9640

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +19 -45
main.py CHANGED
@@ -1,30 +1,23 @@
1
- import requests
 
2
  from datetime import datetime
3
  import pytz
4
  from dotenv import load_dotenv
5
- import os
6
 
7
  load_dotenv()
8
 
9
- # === CONFIG ===
 
10
  clickup_api = os.getenv('CLICKUP_API_KEY')
11
  telegram_bot_token = os.getenv('TELEGRAM_BOT_TOKEN')
12
  telegram_chat_id = os.getenv('TELEGRAM_CHAT_ID')
13
  TIMEZONE = 'Asia/Dhaka'
14
 
15
- # === LISTS TO PROCESS ===
16
  LISTS = [
17
- {
18
- "id": '901800830748',
19
- "title": "*Developer Task Board:*"
20
- },
21
- {
22
- "id": '901800835985',
23
- "title": "*Designer Task Board:*"
24
- }
25
  ]
26
 
27
- # === FETCH TODAY'S TASKS FROM CLICKUP LIST ===
28
  def get_tasks(list_id):
29
  headers = {"Authorization": clickup_api}
30
  url = f"https://api.clickup.com/api/v2/list/{list_id}/task"
@@ -40,22 +33,16 @@ def get_tasks(list_id):
40
  due_ts = task.get("due_date")
41
  status = task.get("status", {}).get("status", "").lower()
42
 
43
- # Optional: skip completed tasks
44
  if status in ["done", "complete", "completed"]:
45
  continue
46
 
47
- # Show tasks due today or later, OR with no due date
48
  if due_ts:
49
  due_dt = datetime.fromtimestamp(int(due_ts) / 1000, tz).date()
50
  if due_dt >= today:
51
  filtered_tasks.append(task)
52
- # else:
53
- # # No due date? Still include it
54
- # filtered_tasks.append(task)
55
 
56
  return filtered_tasks
57
 
58
- # === SEND TO TELEGRAM ===
59
  def send_to_telegram(message):
60
  url = f"https://api.telegram.org/bot{telegram_bot_token}/sendMessage"
61
  payload = {
@@ -63,15 +50,12 @@ def send_to_telegram(message):
63
  "text": message,
64
  "parse_mode": "Markdown"
65
  }
66
- resp = requests.post(url, data=payload)
67
- print("Telegram response:", resp.text)
68
 
69
- # === FORMAT AND SEND FOR EACH LIST ===
70
- def daily_task_summary(list_id, board_title):
71
  tasks = get_tasks(list_id)
72
  if not tasks:
73
- send_to_telegram(f"{board_title}\nNo tasks due today!")
74
- return
75
 
76
  tz = pytz.timezone(TIMEZONE)
77
  task_map = {}
@@ -83,33 +67,23 @@ def daily_task_summary(list_id, board_title):
83
  due_ts = task.get("due_date")
84
  status = task.get("status", {}).get("status", "Unknown")
85
 
86
- # Format due time
87
- if due_ts:
88
- due_dt = datetime.fromtimestamp(int(due_ts) / 1000, tz)
89
- due_str = due_dt.strftime("%B %d, %Y")
90
- else:
91
- due_str = "No due time"
92
-
93
- # Assignees
94
- assignees = task.get("assignees", [])
95
- if not assignees:
96
- assignees = [{"name": "Unassigned"}]
97
 
98
  for a in assignees:
99
  name = a.get("name") or a.get("username") or a.get("email") or "Unassigned"
100
- if name not in task_map:
101
- task_map[name] = []
102
- task_map[name].append(f"- [{task_name}]({task_url}) ({due_str}) - *{status}*")
103
 
104
- # Compose final message
105
  msg = f"{board_title} ({today_str})\n"
106
  for name, items in task_map.items():
107
  msg += f"\n*{name}* is assigned at:\n" + "\n".join(items) + "\n"
108
 
109
- send_to_telegram(msg + "\n")
110
 
111
- # === MAIN ===
112
- if __name__ == "__main__":
113
- print("Sending today's task summaries...")
114
  for board in LISTS:
115
- daily_task_summary(board["id"], board["title"])
 
 
 
1
+ from fastapi import FastAPI
2
+ import os, requests
3
  from datetime import datetime
4
  import pytz
5
  from dotenv import load_dotenv
 
6
 
7
  load_dotenv()
8
 
9
+ app = FastAPI()
10
+
11
  clickup_api = os.getenv('CLICKUP_API_KEY')
12
  telegram_bot_token = os.getenv('TELEGRAM_BOT_TOKEN')
13
  telegram_chat_id = os.getenv('TELEGRAM_CHAT_ID')
14
  TIMEZONE = 'Asia/Dhaka'
15
 
 
16
  LISTS = [
17
+ {"id": '901800830748', "title": "*Developer Task Board:*"},
18
+ {"id": '901800835985', "title": "*Designer Task Board:*"}
 
 
 
 
 
 
19
  ]
20
 
 
21
  def get_tasks(list_id):
22
  headers = {"Authorization": clickup_api}
23
  url = f"https://api.clickup.com/api/v2/list/{list_id}/task"
 
33
  due_ts = task.get("due_date")
34
  status = task.get("status", {}).get("status", "").lower()
35
 
 
36
  if status in ["done", "complete", "completed"]:
37
  continue
38
 
 
39
  if due_ts:
40
  due_dt = datetime.fromtimestamp(int(due_ts) / 1000, tz).date()
41
  if due_dt >= today:
42
  filtered_tasks.append(task)
 
 
 
43
 
44
  return filtered_tasks
45
 
 
46
  def send_to_telegram(message):
47
  url = f"https://api.telegram.org/bot{telegram_bot_token}/sendMessage"
48
  payload = {
 
50
  "text": message,
51
  "parse_mode": "Markdown"
52
  }
53
+ return requests.post(url, data=payload)
 
54
 
55
+ def format_and_send(list_id, board_title):
 
56
  tasks = get_tasks(list_id)
57
  if not tasks:
58
+ return send_to_telegram(f"{board_title}\nNo tasks due today!")
 
59
 
60
  tz = pytz.timezone(TIMEZONE)
61
  task_map = {}
 
67
  due_ts = task.get("due_date")
68
  status = task.get("status", {}).get("status", "Unknown")
69
 
70
+ due_str = datetime.fromtimestamp(int(due_ts) / 1000, tz).strftime("%B %d, %Y") if due_ts else "No due time"
71
+ assignees = task.get("assignees", []) or [{"name": "Unassigned"}]
 
 
 
 
 
 
 
 
 
72
 
73
  for a in assignees:
74
  name = a.get("name") or a.get("username") or a.get("email") or "Unassigned"
75
+ task_map.setdefault(name, []).append(f"- [{task_name}]({task_url}) ({due_str}) - *{status}*")
 
 
76
 
 
77
  msg = f"{board_title} ({today_str})\n"
78
  for name, items in task_map.items():
79
  msg += f"\n*{name}* is assigned at:\n" + "\n".join(items) + "\n"
80
 
81
+ return send_to_telegram(msg + "\n")
82
 
83
+ @app.get("/")
84
+ def run_notifier():
85
+ results = []
86
  for board in LISTS:
87
+ resp = format_and_send(board["id"], board["title"])
88
+ results.append(resp.json())
89
+ return {"status": "sent", "results": results}