Spaces:
Sleeping
Sleeping
File size: 5,400 Bytes
4da631e af28145 4da631e af28145 260cb3f af28145 9d98a26 260cb3f 9d98a26 af28145 9d98a26 af28145 b145135 af28145 4da631e af28145 b145135 af28145 b145135 4da631e b145135 4da631e b145135 4da631e af28145 4da631e af28145 4da631e af28145 4da631e af28145 4da631e af28145 4da631e af28145 4da631e af28145 4da631e 260cb3f 4da631e 260cb3f 4da631e 260cb3f 4da631e 260cb3f 4da631e 260cb3f 4da631e 260cb3f 4da631e 260cb3f af3499c 4da631e af28145 4da631e af28145 b145135 4da631e b145135 af28145 b145135 4da631e af28145 4da631e af28145 4da631e af28145 4da631e af28145 4da631e af28145 4da631e af28145 4da631e af28145 b145135 4da631e b145135 4da631e af28145 260cb3f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 | from flask import Flask, render_template, request, redirect, url_for, session
import qrcode
from PIL import Image
import os
import pandas as pd
import requests
from io import StringIO
from urllib.parse import quote
app = Flask(__name__)
app.secret_key = "supersecretkey"
# ==============================
# Login Credentials
# ==============================
USERNAME = "admin"
PASSWORD = "123456"
# ==============================
# Folder Setup
# ==============================
UPLOAD_FOLDER = "static/generated"
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
# ==============================
# Google Sheet Configuration
# ==============================
SHEET_ID = "1F90Q1scHpX4U_OIBDA_yZF3BozUGfJtl-1XucV4XBCM"
GID = "0"
GOOGLE_SHEET_CSV = f"https://docs.google.com/spreadsheets/d/{SHEET_ID}/gviz/tq?tqx=out:csv&gid={GID}"
def fetch_sheet():
try:
response = requests.get(GOOGLE_SHEET_CSV)
if response.status_code != 200:
return None
df = pd.read_csv(StringIO(response.text))
df.columns = df.columns.str.strip().str.lower()
if "asset id" not in df.columns:
return None
df.rename(columns={"asset id": "Asset ID"}, inplace=True)
return df
except:
return None
# ==============================
# Home Page
# ==============================
@app.route("/")
def home():
return render_template("index.html")
# ==============================
# Login Page
# ==============================
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == "POST":
username = request.form.get("username")
password = request.form.get("password")
asset_id = request.form.get("asset_id")
if username == USERNAME and password == PASSWORD:
session["logged_in"] = True
return redirect(url_for("show_asset", asset_id=asset_id))
return render_template("login.html", error="Invalid Credentials", asset_id=asset_id)
asset_id = request.args.get("asset_id")
return render_template("login.html", asset_id=asset_id)
# ==============================
# Generate QR
# ==============================
@app.route("/generate", methods=["POST"])
def generate_qr():
asset_id = request.form.get("data").strip()
fill_color = request.form.get("fill_color")
back_color = request.form.get("back_color")
size = int(request.form.get("size"))
logo = request.files.get("logo")
df = fetch_sheet()
if df is None:
return render_template("index.html", error="Sheet Error")
df["Asset ID"] = df["Asset ID"].astype(str).str.strip()
result = df[df["Asset ID"].str.lower() == asset_id.lower()]
if result.empty:
return render_template("index.html", error="Asset Not Found")
row = result.iloc[0]
asset_url = request.url_root + "login?asset_id=" + quote(asset_id)
qr = qrcode.QRCode(
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=size,
border=4,
)
qr.add_data(asset_url)
qr.make(fit=True)
img = qr.make_image(fill_color=fill_color, back_color=back_color).convert("RGB")
# ==============================
# Center Logo (Uploaded OR Default)
# ==============================
try:
if logo and logo.filename != "":
logo_img = Image.open(logo)
else:
logo_img = Image.open("static/default_logo.png")
qr_width, qr_height = img.size
logo_size = qr_width // 4
logo_img = logo_img.resize((logo_size, logo_size))
pos = (
(qr_width - logo_size) // 2,
(qr_height - logo_size) // 2
)
img.paste(logo_img, pos)
except:
pass
qr_path = os.path.join(UPLOAD_FOLDER, "qr.png")
img.save(qr_path)
asset_info = {
"Asset ID": row.get("Asset ID", ""),
"Asset Type": row.get("asset type", ""),
"Asset Name": row.get("asset name", ""),
"Allotted To": row.get("allotted to", ""),
"Department": row.get("department", ""),
"Room Number": row.get("room number", ""),
}
return render_template(
"index.html",
qr_image="generated/qr.png",
asset=asset_info
)
# ==============================
# Asset Details Page
# ==============================
@app.route("/asset/<path:asset_id>")
def show_asset(asset_id):
if not session.get("logged_in"):
return redirect(url_for("login", asset_id=asset_id))
df = fetch_sheet()
if df is None:
return "Sheet Error"
df["Asset ID"] = df["Asset ID"].astype(str).str.strip()
result = df[df["Asset ID"].str.lower() == asset_id.lower()]
if result.empty:
return "Asset Not Found"
row = result.iloc[0]
asset_info = {
"Asset ID": row.get("Asset ID", ""),
"Asset Type": row.get("asset type", ""),
"Asset Name": row.get("asset name", ""),
"Allotted To": row.get("allotted to", ""),
"Department": row.get("department", ""),
"Room Number": row.get("room number", ""),
}
return render_template("asset_card.html", asset=asset_info)
# ==============================
# Logout
# ==============================
@app.route("/logout")
def logout():
session.clear()
return redirect("/")
if __name__ == "__main__":
app.run(host="0.0.0.0", port=7860, debug=True) |