Spaces:
Sleeping
Sleeping
from flask import Flask, render_template, request, jsonify | |
import gspread | |
from google.oauth2.credentials import Credentials | |
from google.oauth2.service_account import Credentials | |
from oauth2client.service_account import ServiceAccountCredentials | |
import io | |
import datetime | |
from googleapiclient.discovery import build | |
from googleapiclient.http import MediaIoBaseUpload | |
app = Flask(__name__) | |
# Your Google Sheet and Drive settings | |
SPREADSHEET_ID = '1FfqnS2ThmTo8QDryimD86VHI1zGyET9c3vbaiRAcaPg' | |
FOLDER_ID = '17gS_4w0fjOeyod6Vz6LgDK15KrQqMC-M' # Your Google Drive folder ID | |
# HTML template as a string | |
HTML_TEMPLATE = ''' | |
<!DOCTYPE html> | |
<html> | |
<head> | |
<title>Purchase Record Form</title> | |
<style> | |
body { font-family: Arial, sans-serif; margin: 20px; max-width: 600px; margin: 0 auto; } | |
.form-group { margin-bottom: 15px; } | |
label { display: block; margin-bottom: 5px; } | |
input { width: 100%; padding: 8px; margin-bottom: 10px; border: 1px solid #ddd; border-radius: 4px; } | |
button { background-color: #4CAF50; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; } | |
button:hover { background-color: #45a049; } | |
#status { margin-top: 20px; padding: 10px; display: none; } | |
.success { background-color: #dff0d8; color: #3c763d; } | |
.error { background-color: #f2dede; color: #a94442; } | |
</style> | |
</head> | |
<body> | |
<h2>Purchase Record Form</h2> | |
<form id="purchaseForm"> | |
<div class="form-group"> | |
<label for="name">Name:</label> | |
<input type="text" id="name" name="name" required> | |
</div> | |
<div class="form-group"> | |
<label for="studentId">Student ID (學號):</label> | |
<input type="text" id="studentId" name="studentId" required> | |
</div> | |
<div class="form-group"> | |
<label for="product">Product:</label> | |
<input type="text" id="product" name="product" required> | |
</div> | |
<div class="form-group"> | |
<label for="cost">Cost:</label> | |
<input type="number" id="cost" name="cost" required> | |
</div> | |
<div class="form-group"> | |
<label for="receipt">Receipt (發票):</label> | |
<input type="file" id="receipt" name="receipt" required> | |
</div> | |
<button type="submit">Submit</button> | |
</form> | |
<div id="status"></div> | |
<script> | |
document.getElementById('purchaseForm').addEventListener('submit', async (e) => { | |
e.preventDefault(); | |
const status = document.getElementById('status'); | |
status.style.display = 'block'; | |
status.textContent = 'Submitting...'; | |
status.className = ''; | |
const formData = new FormData(e.target); | |
try { | |
const response = await fetch('/submit', { | |
method: 'POST', | |
body: formData | |
}); | |
const result = await response.json(); | |
if (result.success) { | |
status.className = 'success'; | |
status.textContent = result.message; | |
e.target.reset(); | |
} else { | |
status.className = 'error'; | |
status.textContent = result.message; | |
} | |
} catch (error) { | |
status.className = 'error'; | |
status.textContent = 'Error submitting form'; | |
} | |
}); | |
</script> | |
</body> | |
</html> | |
''' | |
def index(): | |
return HTML_TEMPLATE | |
def submit(): | |
try: | |
# Get form data | |
name = request.form['name'] | |
student_id = request.form['studentId'] | |
product = request.form['product'] | |
cost = request.form['cost'] | |
file = request.files['receipt'] | |
# Initialize gspread client (using your credentials) | |
gc = gspread.service_account(filename='credentials.json') | |
sheet = gc.open_by_key(SPREADSHEET_ID).sheet1 | |
# Upload file to Drive (using your credentials) | |
creds = ServiceAccountCredentials.from_json_keyfile_name('credentials.json') | |
drive_service = build('drive', 'v3', credentials=creds) | |
file_metadata = { | |
'name': file.filename, | |
'parents': [FOLDER_ID] | |
} | |
media = MediaIoBaseUpload( | |
io.BytesIO(file.read()), | |
mimetype=file.content_type, | |
resumable=True | |
) | |
uploaded_file = drive_service.files().create( | |
body=file_metadata, | |
media_body=media, | |
fields='id,webViewLink' | |
).execute() | |
file_url = uploaded_file.get('webViewLink', '') | |
# Append to sheet | |
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') | |
ip_address = request.remote_addr | |
sheet.append_row([name, student_id, product, cost, file_url, timestamp, ip_address]) | |
return jsonify({'success': True, 'message': 'Data submitted successfully!'}) | |
except Exception as e: | |
return jsonify({'success': False, 'message': f'Error: {str(e)}'}) | |
if __name__ == '__main__': | |
app.run(host='0.0.0.0', port=7860) |