"Refactor database connection and templates using shm files for improved performance"

This commit is contained in:
Till Tomczak 2025-05-29 18:21:15 +02:00
parent 629177f0fe
commit e464fb9587
5 changed files with 64 additions and 13 deletions

View File

@ -3168,13 +3168,29 @@ def admin_printer_settings_page(printer_id):
@app.route("/admin/guest-requests")
@login_required
@admin_required
def admin_guest_requests():
"""Admin-Oberfläche für die Verwaltung von Gastanfragen."""
if not current_user.is_admin:
flash("Sie haben keine Berechtigung für den Admin-Bereich.", "error")
return redirect(url_for("index"))
return render_template("admin_guest_requests.html")
"""Admin-Seite für Gastanfragen Verwaltung"""
try:
app_logger.info(f"Admin-Gastanfragen Seite aufgerufen von User {current_user.id}")
return render_template("admin_guest_requests.html")
except Exception as e:
app_logger.error(f"Fehler beim Laden der Admin-Gastanfragen Seite: {str(e)}")
flash("Fehler beim Laden der Gastanfragen-Verwaltung.", "danger")
return redirect(url_for("admin"))
@app.route("/requests/overview")
@login_required
@admin_required
def admin_guest_requests_overview():
"""Admin-Oberfläche für die Verwaltung von Gastanfragen mit direkten Aktionen."""
try:
app_logger.info(f"Admin-Gastanträge Übersicht aufgerufen von User {current_user.id}")
return render_template("admin_guest_requests_overview.html")
except Exception as e:
app_logger.error(f"Fehler beim Laden der Admin-Gastanträge Übersicht: {str(e)}")
flash("Fehler beim Laden der Gastanträge-Übersicht.", "danger")
return redirect(url_for("admin"))
# ===== ADMIN API-ROUTEN FÜR BENUTZER UND DRUCKER =====

Binary file not shown.

Binary file not shown.

View File

@ -769,7 +769,8 @@ class GuestRequest(Base):
name = Column(String(100), nullable=False)
email = Column(String(120))
reason = Column(Text)
duration_min = Column(Integer)
duration_min = Column(Integer) # Bestehend - wird für Backward-Kompatibilität beibehalten
duration_minutes = Column(Integer) # Neu hinzugefügt für API-Kompatibilität
created_at = Column(DateTime, default=datetime.now)
status = Column(String(20), default="pending") # pending|approved|denied
printer_id = Column(Integer, ForeignKey("printers.id"))
@ -778,37 +779,71 @@ class GuestRequest(Base):
author_ip = Column(String(50))
otp_used_at = Column(DateTime, nullable=True) # Zeitpunkt der OTP-Verwendung
# Erweiterte Attribute für Datei-Management
file_name = Column(String(255), nullable=True) # Name der hochgeladenen Datei
file_path = Column(String(500), nullable=True) # Pfad zur hochgeladenen Datei
copies = Column(Integer, default=1) # Anzahl der Kopien
# Neue Felder für Admin-Verwaltung
processed_by = Column(Integer, ForeignKey("users.id"), nullable=True) # Admin der die Anfrage bearbeitet hat
processed_at = Column(DateTime, nullable=True) # Zeitpunkt der Bearbeitung
approval_notes = Column(Text, nullable=True) # Notizen bei Genehmigung
rejection_reason = Column(Text, nullable=True) # Grund bei Ablehnung
updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now) # Automatische Aktualisierung
printer = relationship("Printer")
# Zusätzliche Zeitstempel für bessere Verwaltung
approved_at = Column(DateTime, nullable=True) # Zeitpunkt der Genehmigung
rejected_at = Column(DateTime, nullable=True) # Zeitpunkt der Ablehnung
approved_by = Column(Integer, ForeignKey("users.id"), nullable=True) # Admin der genehmigt hat
rejected_by = Column(Integer, ForeignKey("users.id"), nullable=True) # Admin der abgelehnt hat
# OTP-Verwaltung erweitert
otp_expires_at = Column(DateTime, nullable=True) # Ablaufzeit des OTP-Codes
assigned_printer_id = Column(Integer, ForeignKey("printers.id"), nullable=True) # Zugewiesener Drucker
# Beziehungen
printer = relationship("Printer", foreign_keys=[printer_id])
assigned_printer = relationship("Printer", foreign_keys=[assigned_printer_id])
job = relationship("Job")
processed_by_user = relationship("User", foreign_keys=[processed_by]) # Admin der bearbeitet hat
approved_by_user = relationship("User", foreign_keys=[approved_by]) # Admin der genehmigt hat
rejected_by_user = relationship("User", foreign_keys=[rejected_by]) # Admin der abgelehnt hat
def to_dict(self) -> dict:
"""
Konvertiert die Gastanfrage in ein Dictionary.
"""
return {
"id": self.id,
"name": self.name,
"email": self.email,
"reason": self.reason,
"duration_min": self.duration_min,
"duration_minutes": self.duration_minutes or self.duration_min, # Fallback auf duration_min
"file_name": self.file_name,
"file_path": self.file_path,
"copies": self.copies,
"created_at": self.created_at.isoformat() if self.created_at else None,
"status": self.status,
"printer_id": self.printer_id,
"assigned_printer_id": self.assigned_printer_id,
"otp_code": self.otp_code,
"otp_expires_at": self.otp_expires_at.isoformat() if self.otp_expires_at else None,
"otp_used_at": self.otp_used_at.isoformat() if self.otp_used_at else None,
"job_id": self.job_id,
"author_ip": self.author_ip,
"processed_by": self.processed_by,
"processed_at": self.processed_at.isoformat() if self.processed_at else None,
"approval_notes": self.approval_notes,
"rejection_reason": self.rejection_reason,
"updated_at": self.updated_at.isoformat() if self.updated_at else None,
"approved_at": self.approved_at.isoformat() if self.approved_at else None,
"rejected_at": self.rejected_at.isoformat() if self.rejected_at else None,
"approved_by": self.approved_by,
"rejected_by": self.rejected_by,
"printer": self.printer.to_dict() if self.printer else None,
"assigned_printer": self.assigned_printer.to_dict() if self.assigned_printer else None,
"job": self.job.to_dict() if self.job else None,
"processed_by_user": self.processed_by_user.to_dict() if self.processed_by_user else None
"processed_by_user": self.processed_by_user.to_dict() if self.processed_by_user else None,
"approved_by_user": self.approved_by_user.to_dict() if self.approved_by_user else None,
"rejected_by_user": self.rejected_by_user.to_dict() if self.rejected_by_user else None
}
def generate_otp(self) -> str:

View File

@ -127,7 +127,7 @@
<!-- Brand Text -->
<div class="flex flex-col ml-3">
<span class="text-sm lg:text-base font-bold text-slate-900 dark:text-white transition-colors duration-300 tracking-tight">Mercedes-Benz</span>
<span class="text-xs font-medium text-slate-600 dark:text-slate-400 transition-colors duration-300">MYP 3D-Druck Platform</span>
<span class="text-xs font-medium text-slate-600 dark:text-slate-400 transition-colors duration-300">MYP 3D-Druck Platform -</span>
</div>
</a>
</div>