aboutsummaryrefslogtreecommitdiffstats
path: root/hommaexceli_py/sheets_client.py
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2021-02-12 14:52:00 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2021-02-12 14:52:00 +0200
commit6d69d7f19c3014318734e618baff5ba958fe2344 (patch)
tree82051fd081b976d4c78829d343cc7cec93db7616 /hommaexceli_py/sheets_client.py
parentaf5b4941705fd08be5e72ad5c06e8a3ab8b50da7 (diff)
Implement Sheets and Telegram clients
Diffstat (limited to 'hommaexceli_py/sheets_client.py')
-rw-r--r--hommaexceli_py/sheets_client.py71
1 files changed, 71 insertions, 0 deletions
diff --git a/hommaexceli_py/sheets_client.py b/hommaexceli_py/sheets_client.py
new file mode 100644
index 0000000..1dd741c
--- /dev/null
+++ b/hommaexceli_py/sheets_client.py
@@ -0,0 +1,71 @@
+import pickle
+import os.path
+from os import getenv
+from datetime import date
+from dataclasses import dataclass
+from googleapiclient.discovery import build
+from google_auth_oauthlib.flow import InstalledAppFlow
+from google.auth.transport.requests import Request
+
+
+@dataclass
+class SheetsRow:
+ interval: str
+ name: str
+ last_done: str
+
+
+# If modifying these scopes, delete the file token.pickle.
+SCOPES = ["https://www.googleapis.com/auth/spreadsheets.readonly"]
+
+
+def _get_or_default(list, index, default=""):
+ try:
+ return list[index]
+ except IndexError:
+ return default
+
+
+def _row_to_dataclass(values):
+ interval = _get_or_default(values, 0, "")
+ name = _get_or_default(values, 1, "")
+
+ today = date.today()
+ last_done = _get_or_default(values, 2, today.strftime("%Y-%m-%d"))
+ return SheetsRow(interval, name, last_done)
+
+
+def authenticate_and_fetch_sheets_data():
+ creds = None
+ # The file token.pickle stores the user's access and refresh tokens, and is
+ # created automatically when the authorization flow completes for the first
+ # time.
+ if os.path.exists("token.pickle"):
+ with open("token.pickle", "rb") as token:
+ creds = pickle.load(token)
+ # If there are no (valid) credentials available, let the user log in.
+ if not creds or not creds.valid:
+ if creds and creds.expired and creds.refresh_token:
+ creds.refresh(Request())
+ else:
+ flow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES)
+ creds = flow.run_local_server(port=0)
+ # Save the credentials for the next run
+ with open("token.pickle", "wb") as token:
+ pickle.dump(creds, token)
+
+ service = build("sheets", "v4", credentials=creds)
+
+ # Call the Sheets API
+ sheet = service.spreadsheets()
+ result = (
+ sheet.values()
+ .get(
+ spreadsheetId=getenv("SHEETS_SPREADSHEET_ID"),
+ range=getenv("SHEETS_RANGE"),
+ )
+ .execute()
+ )
+
+ rows = result.get("values", [])
+ return map(_row_to_dataclass, rows)