GVAmaresh
ini
c87f53a
import pickle
import os
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from google.auth.transport.requests import Request
import json
from googleapiclient.http import MediaFileUpload, MediaIoBaseUpload
from datetime import datetime, timedelta
import gdown
from token_operation.driveToken import Create_Drive_Token
global API_VERSION, CLIENT_FILE_NAME, API_DRIVE, SCOPES
CLIENT_FILE_NAME = "./client_secret.json"
API_DRIVE = "drive"
API_VERSION = "v3"
SCOPES = ["https://www.googleapis.com/auth/drive"]
file_metadata = {
"name": "Token_Folder",
"mimeType": "application/vnd.google-apps.folder",
}
# ///////////////////////// CHECK THE PATH OF TOKEN FOLDER /////////////////////////////////
def Check_Token_Folder(service, path="root", Folder_Name="Token"):
resource = service.files()
result = resource.list(
q=f"mimeType = 'application/vnd.google-apps.folder' and '{path}' in parents",
fields="nextPageToken, files(id, name)",
).execute()
list_folders = result.get("files")
token_folder_id = None
for folder in list_folders:
if folder["name"] == Folder_Name:
token_folder_id = folder["id"]
break
if not token_folder_id:
token_folder = service.files().create(body=file_metadata, fields="id").execute()
token_folder_id= token_folder["id"]
result_folder = (
service.files()
.create(
body={
"name": Folder_Name,
"mimeType": "application/vnd.google-apps.folder",
"parents": [token_folder_id],
"type": "anyone",
"role": "reader",
},
fields="id",
)
.execute()
)
token_folder_id = result_folder["id"]
return token_folder_id
def Check_Token_Main_Folder(path="root",Folder_Name="Token_Folder"):
service = Create_Drive_Token()
resource = service.files()
result = resource.list(
q=f"mimeType = 'application/vnd.google-apps.folder' and '{path}' in parents",
fields="nextPageToken, files(id, name)",
).execute()
list_folders = result.get("files")
token_main_folder_id = None
token_folder_id = None
for folder in list_folders:
if folder["name"] == Folder_Name:
token_main_folder_id = folder["id"]
token_folder_id = Check_Token_Folder(service, path=token_main_folder_id, Folder_Name="Token")
break
if not token_main_folder_id:
token_main_folder = service.files().create(body=file_metadata, fields="id").execute()
token_main_folder_id= token_main_folder["id"]
result_folder = (
service.files()
.create(
body={
"name": "Token",
"mimeType": "application/vnd.google-apps.folder",
"parents": [token_main_folder_id],
"type": "anyone",
"role": "reader",
},
fields="id",
)
.execute()
)
token_folder_id = result_folder["id"]
permission = {
'type': 'anyone',
'role': 'reader'
}
service.permissions().create(fileId=token_folder_id, body=permission).execute()
return token_main_folder_id, token_folder_id
def Create_Token(name):
CLIENT_SECRET_FILE = CLIENT_FILE_NAME
API_SERVICE_NAME = API_DRIVE
# API_VERSION = API_VERSION
# SCOPES = SCOPES
cred = None
pickle_file = f'{name}.pickle'
if os.path.exists(pickle_file):
with open(pickle_file, 'rb') as token:
cred = pickle.load(token)
if not cred or not cred.valid:
if cred and cred.expired and cred.refresh_token:
cred.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRET_FILE, SCOPES)
cred = flow.run_local_server()
with open(pickle_file, 'wb') as token:
pickle.dump(cred, token)
try:
# service = build(API_SERVICE_NAME, API_VERSION, credentials=cred)
return cred
except Exception as e:
print('Unable to connect.')
print(e)
return None
# ///////////////////////////// FROM HERE IT STARTS //////////////////////////////////
def Create_Token_Drive(name="current"):
service = Create_Drive_Token()
token_main_folder_id, token_folder_id = Check_Token_Main_Folder()
try:
response = (
service.files()
.list(
q=f"'{token_main_folder_id}' in parents and name contains 'token_json'",
spaces="drive",
fields="files(id, name)",
)
.execute()
)
list_all_files = response.get("files", [])
is_selected = False
file_name = ""
for list_files in list_all_files:
print("List Files = ", list_files["name"])
if list_files["name"].startswith("token_json"):
latest_file_id = str(list_files["id"])
existing_data = service.files().get_media(fileId=latest_file_id).execute()
if existing_data:
existing_details = json.loads(existing_data.decode("utf-8"))
with open(list_files["name"], "w", encoding="utf-8") as json_file:
json.dump(existing_details, json_file, ensure_ascii=False)
if existing_details.get(name):
is_selected = True
token_id = existing_details[name]["token_file_id"]
url = f"https://drive.google.com/file/d/{token_id}/view?usp=sharing"
output = "current_token.pickle"
gdown.download(url=url, output=output, fuzzy=True)
with open(output, "rb") as cred:
creds = pickle.load(cred)
service = build(API_DRIVE, API_VERSION, credentials=creds)
os.remove(output)
return service, existing_details[name]["token_name"]
else:
is_selected = True
token_file = Create_Token(name)
token_file_path = f'{name}.pickle'
file_metadata = {"name": name, "parents": [token_folder_id]}
media = MediaFileUpload(token_file_path, mimetype="application/pdf")
newFile = (
service.files()
.create(body=file_metadata, media_body=media, fields="id")
.execute()
)
token_id = newFile.get("id")
expiry_time = datetime.now() + timedelta(hours=24)
existing_details[name]={
"token_name": name,
"token_file_id": token_id,
"expires_at": expiry_time.strftime("%Y-%m-%dT%H:%M:%SZ")
}
file_name = list_files["name"]
with open(file_name, "w", encoding="utf-8") as json_file:
json.dump(existing_details, json_file)
json_file.close()
file_metadata = {"name": file_name, "parents": [token_main_folder_id]}
media = MediaFileUpload(file_name, mimetype="application/json")
service.files().update(fileId=latest_file_id, media_body=media).execute()
token_id = existing_details[name]["token_file_id"]
url = f"https://drive.google.com/file/d/{token_id}/view?usp=sharing"
output = "current_token.pickle"
gdown.download(url=url, output=output, fuzzy=True)
with open(output, "rb") as cred:
creds = pickle.load(cred)
service = build(API_DRIVE, API_VERSION, credentials=creds)
os.remove(output)
os.remove(token_file_path)
return service, existing_details[name]["token_name"]
if not is_selected:
token_file = Create_Token(name)
file_metadata = {"name": name, "parents": [token_folder_id]}
token_file_path = f'{name}.pickle'
media = MediaFileUpload(token_file_path, mimetype="application/pdf")
# media = MediaFileUpload(token_file, mimetype="application/pdf")
newFile = (
service.files()
.create(body=file_metadata, media_body=media, fields="id")
.execute()
)
token_id = newFile.get("id")
expiry_time = datetime.now() + timedelta(hours=24)
existing_details = {}
existing_details[name]={
"token_name": name,
"token_file_id": token_id,
"expires_at": expiry_time.strftime("%Y-%m-%dT%H:%M:%SZ")
}
file_name = f"token_json.json"
json_data = json.dumps(existing_details)
with open(file_name, "w") as f:
f.write(json_data)
file_metadata = {"name": file_name, "parents": [token_main_folder_id]}
media = MediaFileUpload(
file_name, mimetype="application/json", resumable=True
)
service.files().create(
body=file_metadata, media_body=media, fields="id"
).execute()
token_id = existing_details[name]["token_file_id"]
url = f"https://drive.google.com/file/d/{token_id}/view?usp=sharing"
output = "current_token.pickle"
gdown.download(url=url, output=output, fuzzy=True)
with open(output, "rb") as cred:
service = build(API_DRIVE, API_VERSION, credentials=cred)
os.remove(output)
os.remove(file_name)
return service, existing_details[name]["token_name"]
except Exception as e:
print(f"An error occurred here: {str(e)}")
def Expire_Token_File():
service = Create_Drive_Token()
token_main_folder_id, token_folder_id = Check_Token_Main_Folder()
try:
response = (
service.files()
.list(
q=f"'{token_main_folder_id}' in parents and name contains 'token_json'",
spaces="drive",
fields="files(id, name)",
)
.execute()
)
list_all_files = response.get("files", [])
for list_files in list_all_files:
if list_files["name"].startswith("token_json"):
latest_file_id = str(list_files["id"])
existing_data = service.files().get_media(fileId=latest_file_id).execute()
if existing_data:
existing_details = json.loads(existing_data.decode("utf-8"))
with open(list_files["name"], "w", encoding="utf-8") as json_file:
json.dump(existing_details, json_file, ensure_ascii=False)
for details in existing_details:
if datetime.strptime(details["expires_at"], "%Y-%m-%dT%H:%M:%SZ") < datetime.now():
drive_id = details["token_file_id"]
service.files().delete(fileId=details["token_file_id"]).execute()
del existing_details[details["token_name"]]
service.files().delete(fileId=drive_id).execute()
return True
return False
except Exception as e:
print(f"An error occurred here: {str(e)}")
def Delete_Token_File(name):
service = Create_Drive_Token()
token_main_folder_id, token_folder_id = Check_Token_Main_Folder()
try:
response = (
service.files()
.list(
q=f"'{token_main_folder_id}' in parents and name contains 'token_json'",
spaces="drive",
fields="files(id, name)",
)
.execute()
)
list_all_files = response.get("files", [])
for list_files in list_all_files:
if list_files["name"].startswith("token_json"):
latest_file_id = str(list_files["id"])
existing_data = service.files().get_media(fileId=latest_file_id).execute()
if existing_data:
existing_details = json.loads(existing_data.decode("utf-8"))
with open(list_files["name"], "w", encoding="utf-8") as json_file:
json.dump(existing_details, json_file, ensure_ascii=False)
for details in existing_details:
if details[name] == name:
drive_id = details["token_file_id"]
service.files().delete(fileId=details["token_file_id"]).execute()
del existing_details[details["token_name"]]
service.files().delete(fileId=drive_id).execute()
return True
return False
except Exception as e:
print(f"An error occurred here: {str(e)}")