Skip to content

Commit

Permalink
Upload file via web form
Browse files Browse the repository at this point in the history
  • Loading branch information
s2t2 committed Sep 9, 2024
1 parent 66647a9 commit 0bea266
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 21 deletions.
51 changes: 30 additions & 21 deletions app/drive_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,42 @@
from app.google_apis import GOOGLE_CREDENTIALS_FILEPATH


def get_folder_id(course_id, assignment_id):
# todo: lookup folder id given it's course id and assignment id
return '1OIPp3BkjUwMZSpKMn_PW9RozdpmRqBno'

def upload_file_to_drive(file_path, folder_id, credentials_json=GOOGLE_CREDENTIALS_FILEPATH):
"""
Upload a file to Google Drive.
:param credentials_json: Path to the credentials JSON file.
:param file_path: Path to the local file to be uploaded.
:param folder_id: (Optional) Google Drive folder ID where the file will be uploaded.
If not provided, the file will be uploaded to the root directory.
:return: The file ID of the uploaded file.
"""

def get_drive_service(credentials_json=GOOGLE_CREDENTIALS_FILEPATH):
# need to enable the google drive api from the google cloud console first
credentials = service_account.Credentials.from_service_account_file(
credentials_json, scopes=['https://www.googleapis.com/auth/drive.file']
credentials_json,
scopes=['https://www.googleapis.com/auth/drive.file']
)
# Build the Drive API service
drive_service = build('drive', 'v3', credentials=credentials)
return drive_service

# Define the file metadata
file_metadata = {'name': file_path.split('/')[-1]} # # Extracts the file name from the path


def upload_file_to_drive(file_path, folder_id=None):
"""
Upload a file to Google Drive.
Params:
file_path (str): Path to the local file to be uploaded.
folder_id (str, optional): Google Drive folder ID where the file will be uploaded.
If not provided, the file will be uploaded to the root directory.
Returns:
str: The file ID of the uploaded file.
"""

drive_service = get_drive_service()

file_metadata = {'name': file_path.split('/')[-1]}
if folder_id:
file_metadata['parents'] = [folder_id]

breakpoint()

media = MediaFileUpload(file_path, resumable=True)

#uploaded_file = drive_service.files().create(body=file_metadata, media_body=media, fields='id').execute()
Expand All @@ -40,20 +49,20 @@ def upload_file_to_drive(file_path, folder_id, credentials_json=GOOGLE_CREDENTIA
fields = ", ".join(["id", "name", "originalFilename", "parents", "quotaBytesUsed", "size", "webContentLink", "webViewLink"])
uploaded_file = drive_service.files().create(body=file_metadata, media_body=media, fields=fields).execute()

# Return the file ID
return uploaded_file.get('id')
return uploaded_file #> {}


# Example usage
if __name__ == '__main__':


import os
from pprint import pprint

filepath = os.path.join(os.path.dirname(__file__), "..", "test", "notebooks", "Spotify_API_Demo_(Summer_2024).ipynb")
assert os.path.isfile(filepath)

# need to share folder > editor access with service account email address
folder_id = '1OIPp3BkjUwMZSpKMn_PW9RozdpmRqBno'

file_id = upload_file_to_drive(filepath=filepath, folder_id=folder_id)
print(f"File uploaded successfully with ID: {file_id}")
uploaded_file = upload_file_to_drive(filepath=filepath, folder_id=folder_id)
pprint(uploaded_file)
2 changes: 2 additions & 0 deletions web_app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from web_app.routes.user_routes import user_routes
from web_app.routes.product_routes import product_routes
from web_app.routes.order_routes import order_routes
from web_app.routes.drive_routes import drive_routes

load_dotenv()

Expand Down Expand Up @@ -70,6 +71,7 @@ def create_app():
app.register_blueprint(user_routes)
app.register_blueprint(product_routes)
app.register_blueprint(order_routes)
app.register_blueprint(drive_routes)

return app

Expand Down
68 changes: 68 additions & 0 deletions web_app/routes/drive_routes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@

from flask import Blueprint, render_template, request, flash, redirect, session #, current_app

from io import BytesIO
from googleapiclient.http import MediaIoBaseUpload #MediaFileUpload

from app.drive_service import get_folder_id, get_drive_service


drive_routes = Blueprint("drive_routes", __name__)


@drive_routes.route("/submissions/form")
def submission_form():
return render_template("deliverable_submission_form.html")


@drive_routes.route("/submissions/upload", methods=["POST"])
def submission_upload():
form_data = dict(request.form)
print("FORM DATA:", form_data)
print("FILES:", request.files)

try:
course_name = form_data["course_name"]
assignment_name = form_data["assignment_name"]

selected_file = request.files["selected_file"]
filename = selected_file.filename
mimetype = selected_file.mimetype
print(selected_file)
print(selected_file.filename)
print(selected_file.mimetype)
print(selected_file.content_type)
print(selected_file.content_length)
#> <FileStorage: 'Rock_Paper_Scissors_(Spring_2024)_SOLUTIONS.ipynb' ('application/octet-stream')>

file_content = BytesIO(selected_file.read())
print(type(file_content))
media = MediaIoBaseUpload(file_content, mimetype=mimetype, resumable=True)
print("MEDIA:", media)

# USER INFO
current_user = session.get("current_user")
email_address = current_user["email"]

# UPLOAD TO DRIVE

drive_service = get_drive_service()

folder_id = get_folder_id(course_name, assignment_name)
#net_id = email_address.split("@")[0]
#filename = filename.lower().split(".ipynb")[0] + " - " + net_id + ".ipynb"
#> 'rock_paper_scissors_(spring_2024)_solutions - first.last.ipynb'
file_metadata = {
'name': filename,
'parents': [folder_id],
}
print("METADATA:", file_metadata)

drive_service.files().create(body=file_metadata, media_body=media, fields='id').execute()

flash("File Uploaded Successfully", "success")
return redirect("/submissions/form")
except Exception as err:
print("OOPS", err)
flash("OOPS, Something went wrong. Please try again.", "warning")
return redirect("/submissions/form")
1 change: 1 addition & 0 deletions web_app/templates/bootstrap_5_layout.html
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
{% set protected_nav = [
('/about', 'about', 'About'),
('/products', 'products', 'Products'),
('/submissions/form', 'deliverable_submission_form', 'Deliverable Submission Form'),
('/user/orders', 'user_orders', 'Orders'),
] -%}

Expand Down
39 changes: 39 additions & 0 deletions web_app/templates/deliverable_submission_form.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{% extends "bootstrap_5_layout.html" %}
{% set page_title = "Deliverable Submission Form" %}
{% set active_page = "submission_form" %}

{% block content %}

<h1>Deliverable Submission Form</h1>

<form action="/submissions/upload" method="POST" enctype="multipart/form-data">

<!--label>Stock Symbol:</label>
<input type="text" name="symbol" placeholder="MSFT" value="MSFT">
<br-->

<label>Course:</label>
<select name="course_name">
<option value="OPAN_2343">OPAN 2343</option>
<option value="EMSE_6574">EMSE 6574</option>
<option value="COSC_1010">COSC 1010</option>
</select>
<br>

<label>Assignment:</label>
<select name="assignment_name">
<option value="RPS">Rock, Paper, Scissors</option>
<option value="CRUNCH_SPOTIFY_TAYLOR">Crunch the Spotify (Taylor's Version)</option>
<option value="STOCKS_DASHBOARD">Stocks Dashboard</option>
<option value="WEB_SCRAPER">Web Scraper</option>
<option value="MARKET_SENTIMENTS">Market Sentiments</option>
</select>
<br>

<input type="file" name="selected_file" required>
<br>

<button class="btn btn-success">Submit</button>
</form>

{% endblock %}

0 comments on commit 0bea266

Please sign in to comment.