| |
|
| | import os
|
| | import io
|
| | import hashlib
|
| | from datetime import datetime
|
| | from typing import Optional
|
| | from reportlab.pdfgen import canvas
|
| | from reportlab.lib.pagesizes import A4
|
| | from reportlab.lib.units import cm
|
| | from reportlab.lib import colors
|
| | import streamlit as st
|
| |
|
| |
|
| | ADMIN_USER = os.environ.get("ADMIN_USER", "admin")
|
| |
|
| | _admin_pass_default = os.environ.get("ADMIN_PASS", "admin")
|
| | ADMIN_PASS_HASH = hashlib.sha256(_admin_pass_default.encode()).hexdigest()
|
| |
|
| | def ensure_dirs():
|
| | os.makedirs("data", exist_ok=True)
|
| | os.makedirs("data/videos", exist_ok=True)
|
| | os.makedirs("data/pdfs", exist_ok=True)
|
| | os.makedirs("data/certificates", exist_ok=True)
|
| |
|
| | def save_uploaded_file(file, base_dir="data") -> str:
|
| | ensure_dirs()
|
| | filename = file.name
|
| | safe_name = f"{int(datetime.utcnow().timestamp())}_{filename}"
|
| | out_path = os.path.join(base_dir, safe_name)
|
| | with open(out_path, "wb") as f:
|
| | f.write(file.getbuffer())
|
| | return out_path
|
| |
|
| | def human_dt(dt: Optional[datetime]) -> str:
|
| | if not dt:
|
| | return "—"
|
| | return dt.strftime("%d/%m/%Y %H:%M")
|
| |
|
| | def generate_certificate_pdf(student_name: str, course_title: str) -> str:
|
| | ensure_dirs()
|
| | fname = f"cert_{int(datetime.utcnow().timestamp())}.pdf"
|
| | out_path = os.path.join("data/certificates", fname)
|
| |
|
| | c = canvas.Canvas(out_path, pagesize=A4)
|
| | w, h = A4
|
| |
|
| |
|
| | c.setStrokeColor(colors.HexColor("#2c3e50"))
|
| | c.setLineWidth(6)
|
| | c.rect(1*cm, 1*cm, w-2*cm, h-2*cm)
|
| |
|
| |
|
| | c.setFillColor(colors.HexColor("#2c3e50"))
|
| | c.setFont("Helvetica-Bold", 28)
|
| | c.drawCentredString(w/2, h-5*cm, "CERTIFICADO DE CONCLUSÃO")
|
| |
|
| |
|
| | c.setFillColor(colors.black)
|
| | c.setFont("Helvetica", 14)
|
| | text = (
|
| | f"Certificamos que {student_name} concluiu com êxito o curso '{course_title}'."
|
| | )
|
| | c.drawCentredString(w/2, h-8*cm, text)
|
| |
|
| |
|
| | c.setFont("Helvetica-Oblique", 12)
|
| | c.drawCentredString(w/2, h-10*cm, datetime.now().strftime("Emitido em %d/%m/%Y"))
|
| |
|
| |
|
| | c.line(w/2-5*cm, 4*cm, w/2+5*cm, 4*cm)
|
| | c.setFont("Helvetica", 10)
|
| | c.drawCentredString(w/2, 3.5*cm, "Coordenação — ARM Logística")
|
| |
|
| | c.showPage()
|
| | c.save()
|
| | return out_path |