"Refactor database connection and templates using shm files for improved performance"
This commit is contained in:
parent
629177f0fe
commit
e464fb9587
@ -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.
@ -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:
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user