From 6d69d7f19c3014318734e618baff5ba958fe2344 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Fri, 12 Feb 2021 14:52:00 +0200 Subject: Implement Sheets and Telegram clients --- hommaexceli_py/sheets_client.py | 71 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 hommaexceli_py/sheets_client.py (limited to 'hommaexceli_py/sheets_client.py') 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) -- cgit v1.3