Spaces:
Runtime error
Runtime error
File size: 2,921 Bytes
7de6785 adb221d 7de6785 adb221d 7e993b9 adb221d 7e993b9 9729c7e 7e993b9 9729c7e 7e993b9 7de6785 7e993b9 7de6785 7e993b9 7de6785 7e993b9 7de6785 79ea83b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
import asyncio
import os
from concurrent.futures import ThreadPoolExecutor
from datetime import datetime
import gspread
class GoogleSheetClient:
"""
A client for interacting with Google Sheets using gspread.
Methods
-------
__aenter__():
Asynchronous context manager entry.
__aexit__(exc_type, exc_val, exc_tb):
Asynchronous context manager exit.
_get_content_delivery_data():
Asynchronously retrieves all records from the worksheet.
update_worksheet(data: dict):
Asynchronously updates the worksheet with the provided data.
get_undelivered_content():
Asynchronously retrieves records that have not been marked as delivered.
"""
def __init__(self):
googleSheetClient = gspread.service_account(
filename=os.environ.get("SERVICE_ACCOUNT_CREDENTIAL_FILE_PATH")
)
workbook = googleSheetClient.open_by_key(os.environ.get("SPREAD_SHEET_ID"))
self.worksheet = workbook.worksheet(os.environ.get("WORKSHEET_NAME"))
async def __aenter__(self):
return self
async def __aexit__(self, exc_type, exc_val, exc_tb):
pass
async def _get_content_delivery_data(self):
loop = asyncio.get_event_loop()
with ThreadPoolExecutor() as pool:
records = await loop.run_in_executor(
pool, lambda: self.worksheet.get_all_records()
)
return records
async def update_worksheet(self, data: dict):
loop = asyncio.get_event_loop()
with ThreadPoolExecutor() as pool:
list_of_scheduled_content = await self._get_content_delivery_data()
for item in list_of_scheduled_content:
data_time = datetime.strptime(
f"{data['Date']} {data['Time']}", "%m-%d-%Y %H:%M"
)
item_time = datetime.strptime(
f"{item['Date']} {item['Time']}", "%m-%d-%Y %H:%M"
)
if item["Message"] == data["Message"] and item_time == data_time:
list_of_scheduled_content[list_of_scheduled_content.index(item)][
"Delivered"
] = "TRUE"
values = list(map(lambda x: list(x.values()), list_of_scheduled_content))
header = (
await loop.run_in_executor(pool, lambda: self.worksheet.row_values(1))
if self.worksheet.row_count > 0
else []
)
update_values = [header]
update_values.extend(values)
res = loop.run_in_executor(
pool, lambda: self.worksheet.update(values=update_values, raw=False)
)
return res
async def get_undelivered_content(self):
records = await self._get_content_delivery_data()
return list(filter(lambda x: x["Delivered"] != "TRUE", records))
|