"Refactor database connection and templates using shm files for improved performance"
This commit is contained in:
@@ -3168,13 +3168,29 @@ def admin_printer_settings_page(printer_id):
|
|||||||
|
|
||||||
@app.route("/admin/guest-requests")
|
@app.route("/admin/guest-requests")
|
||||||
@login_required
|
@login_required
|
||||||
|
@admin_required
|
||||||
def admin_guest_requests():
|
def admin_guest_requests():
|
||||||
"""Admin-Oberfläche für die Verwaltung von Gastanfragen."""
|
"""Admin-Seite für Gastanfragen Verwaltung"""
|
||||||
if not current_user.is_admin:
|
try:
|
||||||
flash("Sie haben keine Berechtigung für den Admin-Bereich.", "error")
|
app_logger.info(f"Admin-Gastanfragen Seite aufgerufen von User {current_user.id}")
|
||||||
return redirect(url_for("index"))
|
|
||||||
|
|
||||||
return render_template("admin_guest_requests.html")
|
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 =====
|
# ===== 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)
|
name = Column(String(100), nullable=False)
|
||||||
email = Column(String(120))
|
email = Column(String(120))
|
||||||
reason = Column(Text)
|
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)
|
created_at = Column(DateTime, default=datetime.now)
|
||||||
status = Column(String(20), default="pending") # pending|approved|denied
|
status = Column(String(20), default="pending") # pending|approved|denied
|
||||||
printer_id = Column(Integer, ForeignKey("printers.id"))
|
printer_id = Column(Integer, ForeignKey("printers.id"))
|
||||||
@@ -778,37 +779,71 @@ class GuestRequest(Base):
|
|||||||
author_ip = Column(String(50))
|
author_ip = Column(String(50))
|
||||||
otp_used_at = Column(DateTime, nullable=True) # Zeitpunkt der OTP-Verwendung
|
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
|
# Neue Felder für Admin-Verwaltung
|
||||||
processed_by = Column(Integer, ForeignKey("users.id"), nullable=True) # Admin der die Anfrage bearbeitet hat
|
processed_by = Column(Integer, ForeignKey("users.id"), nullable=True) # Admin der die Anfrage bearbeitet hat
|
||||||
processed_at = Column(DateTime, nullable=True) # Zeitpunkt der Bearbeitung
|
processed_at = Column(DateTime, nullable=True) # Zeitpunkt der Bearbeitung
|
||||||
approval_notes = Column(Text, nullable=True) # Notizen bei Genehmigung
|
approval_notes = Column(Text, nullable=True) # Notizen bei Genehmigung
|
||||||
rejection_reason = Column(Text, nullable=True) # Grund bei Ablehnung
|
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")
|
job = relationship("Job")
|
||||||
processed_by_user = relationship("User", foreign_keys=[processed_by]) # Admin der bearbeitet hat
|
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:
|
def to_dict(self) -> dict:
|
||||||
"""
|
|
||||||
Konvertiert die Gastanfrage in ein Dictionary.
|
|
||||||
"""
|
|
||||||
return {
|
return {
|
||||||
"id": self.id,
|
"id": self.id,
|
||||||
"name": self.name,
|
"name": self.name,
|
||||||
"email": self.email,
|
"email": self.email,
|
||||||
"reason": self.reason,
|
"reason": self.reason,
|
||||||
"duration_min": self.duration_min,
|
"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,
|
"created_at": self.created_at.isoformat() if self.created_at else None,
|
||||||
"status": self.status,
|
"status": self.status,
|
||||||
"printer_id": self.printer_id,
|
"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,
|
"job_id": self.job_id,
|
||||||
|
"author_ip": self.author_ip,
|
||||||
"processed_by": self.processed_by,
|
"processed_by": self.processed_by,
|
||||||
"processed_at": self.processed_at.isoformat() if self.processed_at else None,
|
"processed_at": self.processed_at.isoformat() if self.processed_at else None,
|
||||||
"approval_notes": self.approval_notes,
|
"approval_notes": self.approval_notes,
|
||||||
"rejection_reason": self.rejection_reason,
|
"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,
|
"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,
|
"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:
|
def generate_otp(self) -> str:
|
||||||
|
@@ -127,7 +127,7 @@
|
|||||||
<!-- Brand Text -->
|
<!-- Brand Text -->
|
||||||
<div class="flex flex-col ml-3">
|
<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-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>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
Reference in New Issue
Block a user