KOK - MANAGER
Edit File: app.py
import os import time import datetime as dt from pytz import timezone from flask import Flask, render_template, request, redirect, url_for, flash from werkzeug.utils import secure_filename from config.config import sheet, dropdown_sheet, REGULAR_FOLDER_ID, KICKSTART_FOLDER_ID, drive_service from fms_frontend.utils.sheet_client import get_client_list, get_employee_email_map, append_main_row_in_order from fms_frontend.utils.validators import is_valid_url app = Flask(__name__) app.secret_key = os.getenv("FLASK_SECRET", "change-me") ALLOWED_EXT = {"m4a", "mp3", "wav"} # ------------------------- # Google Drive Upload (Stream) # ------------------------- def drive_upload_stream(fileobj, filename: str, parent_folder_id: str) -> str: """Uploads file to Google Drive from a file-like object without reading into memory.""" from googleapiclient.http import MediaIoBaseUpload media = MediaIoBaseUpload(fileobj, mimetype="application/octet-stream", resumable=True) file_meta = {"name": filename, "parents": [parent_folder_id]} created = ( drive_service.files() .create(body=file_meta, media_body=media, fields="id", supportsAllDrives=True) .execute() ) return f"https://drive.google.com/file/d/{created['id']}/view" # ------------------------- # Caching Dropdown Data # ------------------------- _last_cache_time = 0 _cache_ttl = 300 # seconds _clients_cache = None _employee_cache = None def get_dropdown_data_cached(): """Caches dropdown data from Google Sheets for speed.""" global _last_cache_time, _clients_cache, _employee_cache if time.time() - _last_cache_time > _cache_ttl or _clients_cache is None: _clients_cache = get_client_list(dropdown_sheet) _employee_cache = get_employee_email_map(dropdown_sheet) _last_cache_time = time.time() return _clients_cache, _employee_cache # ------------------------- # Main Route # ------------------------- @app.route("/", methods=["GET", "POST"]) def index(): try: clients, employee_email = get_dropdown_data_cached() except Exception as e: return f"Failed to load dropdowns from Google Sheet: {e}", 500 if request.method == "POST": submitted_by = request.form.get("submitted_by", "") email_id = employee_email.get(submitted_by, "") meeting_date = request.form.get("meeting_date", "") client_name = request.form.get("client_name", "") meeting_type = request.form.get("meeting_type", "Regular") website_link = request.form.get("website_link", "").strip() # Validate website link if provided if website_link and not is_valid_url(website_link): flash("Please enter a valid Website Link.") return redirect(url_for("index")) # Validate and collect files files = request.files.getlist("audio_files") files = [f for f in files if f and f.filename] if not files: flash("Please upload at least one audio file (.m4a/.mp3/.wav).") return redirect(url_for("index")) # Date formatting ist_today = dt.datetime.now(timezone("Asia/Kolkata")).date() date_str = ( dt.datetime.strptime(meeting_date, "%Y-%m-%d").strftime("%d-%m-%Y") if meeting_date else ist_today.strftime("%d-%m-%Y") ) parent_folder = REGULAR_FOLDER_ID if meeting_type.lower() == "regular" else KICKSTART_FOLDER_ID safe_client = client_name.replace("/", "-").replace("\\", "-").strip() links = [] for idx, f in enumerate(files, start=1): ext = f.filename.rsplit(".", 1)[-1].lower() if ext not in ALLOWED_EXT: flash(f"Unsupported file: {f.filename}") return redirect(url_for("index")) # File naming: ClientName_Date_1.ext, ClientName_Date_2.ext filename = secure_filename( f"{safe_client}_{date_str}_{idx}.{ext}" if len(files) > 1 else f"{safe_client}_{date_str}.{ext}" ) link = drive_upload_stream(f.stream, filename, parent_folder) links.append(link) meeting_audio_links_cell = ", ".join(links) ist = timezone("Asia/Kolkata") timestamp = dt.datetime.now(ist).strftime("%Y-%m-%d %H:%M:%S") # Prepare row for Google Sheet row = [ timestamp, date_str, client_name, meeting_type, submitted_by, email_id, meeting_audio_links_cell, website_link, "", "", "", "", # placeholders for summaries "Processing", ] try: append_main_row_in_order(sheet, row) except Exception as e: return f"Failed to append row to Sheet: {e}", 500 return render_template("success.html", audio_links=links, website_link=website_link) return render_template( "index.html", clients=clients, employee_names=list(employee_email.keys()), employee_email_map=employee_email, ) # ------------------------- # Run App # ------------------------- if __name__ == "__main__": app.run(debug=True)