mirror of
https://github.com/run-llama/llama-hub.git
synced 2025-09-03 13:27:50 +00:00
90 lines
2.6 KiB
Python
90 lines
2.6 KiB
Python
"""monday.com reader."""
|
|
from typing import Dict, List
|
|
|
|
from llama_index.readers.base import BaseReader
|
|
from llama_index.readers.schema.base import Document
|
|
import json
|
|
import requests
|
|
|
|
class MondayReader(BaseReader):
|
|
"""monday.com reader. Reads board's data by a GraphQL query.
|
|
|
|
Args:
|
|
api_key (str): monday.com API key.
|
|
"""
|
|
|
|
def __init__(self, api_key: str) -> None:
|
|
"""Initialize monday.com reader."""
|
|
|
|
self.api_key = api_key
|
|
self.api_url = "https://api.monday.com/v2"
|
|
|
|
def _parse_item_values(self, cv) -> Dict[str, str]:
|
|
data = {}
|
|
data["title"]= cv["title"]
|
|
data["value"]= cv["text"]
|
|
|
|
return data
|
|
|
|
def _parse_data(self, item) -> Dict[str, str]:
|
|
data = {}
|
|
data["id"] = item["id"]
|
|
data["name"] = item["name"]
|
|
data["values"] = list(map(self._parse_item_values, list(item["column_values"])))
|
|
|
|
return data
|
|
|
|
def _perform_request(self,board_id) -> Dict[str, str]:
|
|
headers = {"Authorization" : self.api_key}
|
|
query = """
|
|
query{
|
|
boards(ids: [%d]){
|
|
name,
|
|
items{
|
|
id,
|
|
name,
|
|
column_values{
|
|
title,
|
|
text
|
|
}
|
|
}
|
|
}
|
|
} """ % (board_id)
|
|
data = {'query' : query}
|
|
|
|
response = requests.post(url=self.api_url, json=data, headers=headers)
|
|
return response.json()
|
|
|
|
def load_data(self, board_id: int) -> List[Document]:
|
|
"""Load board data by board_id
|
|
|
|
Args:
|
|
board_id (int): monday.com board id.
|
|
Returns:
|
|
List[Document]: List of items as documents.
|
|
[{id, name, values: [{title, value}]}]
|
|
"""
|
|
|
|
json_response = self._perform_request(board_id)
|
|
board_data = json_response['data']['boards'][0]
|
|
|
|
board_name = board_data["name"]
|
|
items_array = list(board_data["items"])
|
|
parsed_items = list(map(self._parse_data, list(items_array)))
|
|
result = []
|
|
for item in parsed_items:
|
|
text = f"name: {item['name']}"
|
|
for item_value in item["values"]:
|
|
if item_value['value']:
|
|
text += f", {item_value['title']}: {item_value['value']}"
|
|
result.append(Document(text, extra_info={"board_id": board_id, "item_id": item["id"]}))
|
|
|
|
return result
|
|
|
|
|
|
if __name__ == "__main__":
|
|
reader = MondayReader('api_key')
|
|
print(
|
|
reader.load_data(12345)
|
|
)
|