diff --git a/backend/add_printers.py b/backend/add_printers.py new file mode 100644 index 00000000..b126a9c3 --- /dev/null +++ b/backend/add_printers.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import sqlite3 +import datetime + +def add_printers(): + """ + Fügt die Drucker aus dem Screenshot in die Datenbank ein. + """ + try: + conn = sqlite3.connect('app/database/myp.db') + cursor = conn.cursor() + + # Drucker aus dem Screenshot + printers = [ + ('P115 1', 'P115', 'Labor', '192.168.0.101', '98:25:4A:E1:2D:3C', '192.168.0.101', 'admin', 'admin', 'offline', 1, datetime.datetime.now()), + ('P115 2', 'P115', 'Labor', '192.168.0.103', '98:25:4A:E1:A3:98', '192.168.0.103', 'admin', 'admin', 'offline', 1, datetime.datetime.now()), + ('P115 3', 'P115', 'Labor', '192.168.0.100', '98:25:4A:E1:35:FE', '192.168.0.100', 'admin', 'admin', 'offline', 1, datetime.datetime.now()), + ('P115 4', 'P115', 'Labor', '192.168.0.104', '98:25:4A:E1:2D:A6', '192.168.0.104', 'admin', 'admin', 'offline', 1, datetime.datetime.now()), + ('P115 5', 'P115', 'Labor', '192.168.0.106', '98:25:4A:E1:1D:8E', '192.168.0.106', 'admin', 'admin', 'offline', 1, datetime.datetime.now()), + ('P115 6', 'P115', 'Labor', '192.168.0.102', 'E4:FA:C4:EB:4D:08', '192.168.0.102', 'admin', 'admin', 'offline', 1, datetime.datetime.now()) + ] + + # Drucker einfügen + for printer in printers: + try: + cursor.execute(''' + INSERT INTO printers (name, model, location, ip_address, mac_address, plug_ip, plug_username, plug_password, status, active, created_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ''', printer) + print(f'Drucker {printer[0]} erfolgreich hinzugefügt') + except sqlite3.Error as e: + print(f'Fehler beim Hinzufügen von Drucker {printer[0]}: {e}') + + # Änderungen speichern und Verbindung schließen + conn.commit() + print('Alle Drucker wurden erfolgreich gespeichert') + + # Überprüfen, wie viele Drucker jetzt in der Datenbank sind + cursor.execute('SELECT COUNT(*) FROM printers') + count = cursor.fetchone()[0] + print(f'Anzahl der Drucker in der Datenbank: {count}') + + conn.close() + return True + except Exception as e: + print(f'Fehler: {e}') + return False + +if __name__ == "__main__": + print("Füge Drucker zur Datenbank hinzu...") + success = add_printers() + if success: + print("Vorgang erfolgreich abgeschlossen.") + else: + print("Es gab Probleme beim Hinzufügen der Drucker.") \ No newline at end of file diff --git a/backend/app/database/myp.db b/backend/app/database/myp.db index a2ead9ae..8918552f 100644 Binary files a/backend/app/database/myp.db and b/backend/app/database/myp.db differ diff --git a/backend/app/static/css/admin.css b/backend/app/static/css/admin.css deleted file mode 100644 index b5326499..00000000 --- a/backend/app/static/css/admin.css +++ /dev/null @@ -1,901 +0,0 @@ -/* Admin Panel Styles */ - -/* Core Variables */ -:root { - --primary-color: #4f46e5; - --primary-hover: #4338ca; - --success-color: #10b981; - --success-hover: #059669; - --warning-color: #f59e0b; - --warning-hover: #d97706; - --error-color: #ef4444; - --error-hover: #dc2626; - --info-color: #3b82f6; - --info-hover: #2563eb; -} - -/* Dark Mode Variables */ -.dark { - --bg-color: #0f172a; - --card-bg: #1e293b; - --border-color: #334155; - --text-primary: #f8fafc; - --text-secondary: #e2e8f0; - --hover-bg: #334155; - --input-bg: #1e293b; - --shadow-color: rgba(0, 0, 0, 0.3); - --table-header-bg: #1e293b; - --table-row-hover: #334155; - --dark-btn-hover: #475569; -} - -/* Light Mode Variables */ -:root { - --bg-color: #f8fafc; - --card-bg: #ffffff; - --border-color: #e2e8f0; - --text-primary: #1e293b; - --text-secondary: #64748b; - --hover-bg: #f1f5f9; - --input-bg: #ffffff; - --shadow-color: rgba(0, 0, 0, 0.1); - --table-header-bg: #f8fafc; - --table-row-hover: #f1f5f9; - --dark-btn-hover: #f1f5f9; -} - -/* Korrektur für Dark Mode Hintergrund */ -.dark .bg-white.dark\:bg-dark-card { - background-color: #1e293b !important; -} - -/* Zusätzliche Dark Mode Korrekturen */ -html.dark body .bg-white.dark\:bg-dark-card { - background-color: #1e293b !important; -} - -.dark .bg-slate-50 { - background-color: #0f172a !important; -} - -.dark .bg-slate-800 { - background-color: #0f172a !important; -} - -.dark .printer-card { - background-color: #1e293b !important; -} - -.dark tbody.bg-white.dark\:bg-dark-card { - background-color: #1e293b !important; -} - -/* Spezifischere Selektoren für das Admin-Panel im Dark Mode */ -body.dark .admin-container .bg-white.dark\:bg-dark-card { - background-color: #1e293b !important; -} - -body.dark #users-tab .bg-white.dark\:bg-dark-card, -body.dark #printers-tab .bg-white.dark\:bg-dark-card, -body.dark #scheduler-tab .bg-white.dark\:bg-dark-card, -body.dark #system-tab .bg-white.dark\:bg-dark-card, -body.dark #logs-tab .bg-white.dark\:bg-dark-card { - background-color: #1e293b !important; -} - -body.dark .admin-stats .stat-card { - background-color: #1e293b !important; -} - -body.dark .bg-slate-50.dark\:bg-slate-800 { - background-color: #0f172a !important; -} - -/* Admin Panel Container */ -.admin-container { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; -} - -/* Navigation Tabs */ -.nav-tabs { - display: flex; - border-bottom: 1px solid var(--border-color); - margin-bottom: 1rem; - overflow-x: auto; - scrollbar-width: thin; -} - -.nav-tabs::-webkit-scrollbar { - height: 5px; -} - -.nav-tabs::-webkit-scrollbar-thumb { - background-color: var(--border-color); - border-radius: 5px; -} - -.nav-tab { - padding: 1rem 1.5rem; - color: var(--text-secondary); - border-bottom: 2px solid transparent; - cursor: pointer; - transition: all 0.2s ease; - white-space: nowrap; -} - -.nav-tab:hover { - color: var(--text-primary); - background-color: var(--hover-bg); -} - -.nav-tab.active { - color: var(--primary-color); - border-bottom: 2px solid var(--primary-color); - font-weight: 500; -} - -.nav-tab .icon { - margin-right: 0.5rem; -} - -/* Tab Content */ -.tab-content { - margin-top: 2rem; -} - -.tab-pane { - display: none; -} - -.tab-pane.active { - display: block; -} - -/* Admin Stats */ -.admin-stats { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); - gap: 1rem; - margin-bottom: 2rem; -} - -.stat-card { - background-color: var(--card-bg); - border-radius: 0.75rem; - border: 1px solid var(--border-color); - padding: 1.25rem; - position: relative; - overflow: hidden; - box-shadow: 0 4px 6px -1px var(--shadow-color), 0 2px 4px -1px var(--shadow-color); - transition: transform 0.2s ease, box-shadow 0.2s ease; -} - -.stat-card:hover { - transform: translateY(-2px); - box-shadow: 0 10px 15px -3px var(--shadow-color), 0 4px 6px -2px var(--shadow-color); -} - -.stat-icon { - position: absolute; - top: 1rem; - right: 1rem; - opacity: 0.15; - font-size: 2.5rem; -} - -.stat-title { - font-size: 0.875rem; - color: var(--text-secondary); - margin-bottom: 0.5rem; - font-weight: 500; - text-transform: uppercase; -} - -.stat-value { - font-size: 1.5rem; - font-weight: 600; - color: var(--text-primary); - margin-bottom: 0.25rem; -} - -.stat-desc { - font-size: 0.875rem; - color: var(--text-secondary); -} - -/* Primary Button */ -.btn { - display: inline-flex; - align-items: center; - justify-content: center; - padding: 0.5rem 1rem; - font-weight: 500; - font-size: 0.875rem; - border-radius: 0.375rem; - cursor: pointer; - transition: all 0.2s ease; -} - -.btn-primary { - background-color: var(--primary-color); - color: white; -} - -.btn-primary:hover { - background-color: var(--primary-hover); -} - -.btn-secondary { - background-color: transparent; - color: var(--text-primary); - border: 1px solid var(--border-color); -} - -.btn-secondary:hover { - background-color: var(--hover-bg); -} - -.btn-success { - background-color: var(--success-color); - color: white; -} - -.btn-success:hover { - background-color: var(--success-hover); -} - -.btn-error { - background-color: var(--error-color); - color: white; -} - -.btn-error:hover { - background-color: var(--error-hover); -} - -.btn-warning { - background-color: var(--warning-color); - color: white; -} - -.btn-warning:hover { - background-color: var(--warning-hover); -} - -.btn-info { - background-color: var(--info-color); - color: white; -} - -.btn-info:hover { - background-color: var(--info-hover); -} - -/* Form Elements */ -.form-group { - margin-bottom: 1.5rem; -} - -.form-label { - display: block; - margin-bottom: 0.5rem; - font-weight: 500; - color: var(--text-primary); -} - -.form-input, -.form-select, -.form-textarea { - width: 100%; - padding: 0.625rem; - border: 1px solid var(--border-color); - border-radius: 0.375rem; - background-color: var(--input-bg); - color: var(--text-primary); - transition: border-color 0.2s ease; -} - -.form-input:focus, -.form-select:focus, -.form-textarea:focus { - outline: none; - border-color: var(--primary-color); - box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.2); -} - -/* Modal Styles */ -.modal { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.5); - display: none; - z-index: 50; - align-items: center; - justify-content: center; - overflow-y: auto; - transition: opacity 0.3s ease; - opacity: 0; -} - -.modal.show { - display: flex; - opacity: 1; -} - -.modal-dialog { - background-color: var(--card-bg); - border-radius: 0.5rem; - box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); - width: 100%; - max-width: 500px; - transform: scale(0.9); - transition: transform 0.3s ease; -} - -.modal.show .modal-dialog { - transform: scale(1); -} - -.modal-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 1rem 1.5rem; - border-bottom: 1px solid var(--border-color); -} - -.modal-title { - font-size: 1.25rem; - font-weight: 600; - color: var(--text-primary); - margin: 0; -} - -.modal-close { - background: transparent; - border: none; - color: var(--text-secondary); - padding: 0.25rem; - cursor: pointer; - transition: color 0.2s ease; - display: flex; - align-items: center; - justify-content: center; -} - -.modal-close:hover { - color: var(--error-color); -} - -.modal-body { - padding: 1.5rem; -} - -.modal-footer { - display: flex; - align-items: center; - justify-content: flex-end; - gap: 0.75rem; - padding: 1rem 1.5rem; - border-top: 1px solid var(--border-color); -} - -/* Badge Styles */ -.badge { - display: inline-flex; - align-items: center; - padding: 0.25rem 0.75rem; - border-radius: 9999px; - font-size: 0.75rem; - font-weight: 500; - text-transform: uppercase; - letter-spacing: 0.05em; -} - -.badge-success { - background-color: rgba(16, 185, 129, 0.1); - color: var(--success-color); -} - -.badge-error { - background-color: rgba(239, 68, 68, 0.1); - color: var(--error-color); -} - -.badge-warning { - background-color: rgba(245, 158, 11, 0.1); - color: var(--warning-color); -} - -.badge-info { - background-color: rgba(59, 130, 246, 0.1); - color: var(--info-color); -} - -/* Log Entry Styles */ -.log-entry { - padding: 0.75rem; - border-radius: 0.375rem; - margin-bottom: 0.5rem; - font-size: 0.875rem; - transition: background-color 0.2s ease; -} - -.log-entry:hover { - background-color: var(--hover-bg); -} - -.log-debug { - border-left: 3px solid #9ca3af; - background-color: rgba(156, 163, 175, 0.1); -} - -.log-info { - border-left: 3px solid var(--info-color); - background-color: rgba(59, 130, 246, 0.1); -} - -.log-warning { - border-left: 3px solid var(--warning-color); - background-color: rgba(245, 158, 11, 0.1); -} - -.log-error { - border-left: 3px solid var(--error-color); - background-color: rgba(239, 68, 68, 0.1); -} - -.log-critical { - border-left: 3px solid #7c3aed; - background-color: rgba(124, 58, 237, 0.1); -} - -/* Scheduler Status */ -.scheduler-status { - display: flex; - align-items: center; - padding: 1rem; - background-color: var(--card-bg); - border-radius: 0.5rem; - border: 1px solid var(--border-color); - margin-bottom: 1rem; -} - -.status-indicator { - width: 12px; - height: 12px; - border-radius: 50%; - margin-right: 0.75rem; -} - -.status-running { - background-color: var(--success-color); - animation: pulse 2s infinite; -} - -.status-stopped { - background-color: var(--error-color); -} - -.pulse { - box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.7); - animation: pulse 2s infinite; -} - -@keyframes pulse { - 0% { - box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.7); - } - 70% { - box-shadow: 0 0 0 10px rgba(16, 185, 129, 0); - } - 100% { - box-shadow: 0 0 0 0 rgba(16, 185, 129, 0); - } -} - -.status-text { - font-weight: 500; -} - -.printer-card { - background-color: var(--card-bg); - border-radius: 0.5rem; - border: 1px solid var(--border-color); - padding: 1rem; - transition: all 0.2s ease; -} - -.printer-card:hover { - transform: translateY(-2px); - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); -} - -.printer-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - margin-bottom: 1rem; -} - -.printer-name { - font-weight: 600; - color: var(--text-primary); - margin-bottom: 0.25rem; -} - -.printer-actions { - display: flex; - gap: 0.5rem; -} - -.printer-info { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 0.5rem; - margin-bottom: 1rem; -} - -.printer-status { - display: flex; - align-items: center; - font-size: 0.875rem; - margin-bottom: 0.5rem; -} - -.printer-status .status-indicator { - width: 8px; - height: 8px; -} - -.tasks-table { - width: 100%; - border-collapse: collapse; -} - -.tasks-table th { - padding: 0.75rem 1rem; - text-align: left; - font-size: 0.75rem; - font-weight: 600; - text-transform: uppercase; - color: var(--text-secondary); - border-bottom: 1px solid var(--border-color); -} - -.tasks-table td { - padding: 0.75rem 1rem; - border-bottom: 1px solid var(--border-color); -} - -.tasks-table tr:hover td { - background-color: var(--hover-bg); -} - -@media (max-width: 768px) { - .admin-stats { - grid-template-columns: 1fr; - } - - .modal-dialog { - max-width: 90%; - margin: 1rem; - } -} - -.dark .stat-card { - background-color: var(--card-bg); -} - -.dark .form-input, -.dark .form-select, -.dark .form-textarea { - background-color: var(--input-bg); - border-color: var(--border-color); - color: var(--text-primary); -} - -.dark .form-input:focus, -.dark .form-select:focus, -.dark .form-textarea:focus { - border-color: var(--primary-color); - box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.3); -} - -.dark .modal-dialog { - background-color: var(--card-bg); - border-color: var(--border-color); - box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.4); -} - -.dark .modal-header { - border-bottom-color: var(--border-color); -} - -.dark .modal-footer { - border-top-color: var(--border-color); -} - -.dark .scheduler-status { - background-color: var(--card-bg); - border-color: var(--border-color); -} - -.dark .pulse { - animation: darkPulse 2s infinite; -} - -@keyframes darkPulse { - 0% { - box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.4); - } - 70% { - box-shadow: 0 0 0 10px rgba(16, 185, 129, 0); - } - 100% { - box-shadow: 0 0 0 0 rgba(16, 185, 129, 0); - } -} - -.dark .bg-slate-50 { - background-color: #1e293b; -} - -.dark .bg-slate-800 { - background-color: #0f172a; -} - -.dark .dark-bg-card, -.dark\:bg-dark-card:is(.dark *) { - background-color: var(--card-bg); -} - -.dark .log-entry { - border-color: var(--border-color); - background-color: var(--card-bg); -} - -.dark .log-entry:hover { - background-color: var(--hover-bg); -} - -.dark .badge-success { - background-color: rgba(16, 185, 129, 0.2); - color: #34d399; -} - -.dark .badge-error { - background-color: rgba(239, 68, 68, 0.2); - color: #f87171; -} - -.dark .badge-warning { - background-color: rgba(245, 158, 11, 0.2); - color: #fbbf24; -} - -.dark .badge-info { - background-color: rgba(59, 130, 246, 0.2); - color: #60a5fa; -} - -.dark .printer-card { - background-color: var(--card-bg); - border-color: var(--border-color); - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2); -} - -.dark .printer-card:hover { - box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -2px rgba(0, 0, 0, 0.2); -} - -.dark .status-running { - background-color: #10b981; - box-shadow: 0 0 8px rgba(16, 185, 129, 0.6); -} - -.dark .status-stopped { - background-color: #ef4444; - box-shadow: 0 0 8px rgba(239, 68, 68, 0.6); -} - -.dark .alert { - border-color: var(--border-color); -} - -.dark .alert-success { - background-color: rgba(16, 185, 129, 0.2); - border-left-color: #10b981; -} - -.dark .alert-error { - background-color: rgba(239, 68, 68, 0.2); - border-left-color: #ef4444; -} - -.dark .alert-warning { - background-color: rgba(245, 158, 11, 0.2); - border-left-color: #f59e0b; -} - -.dark .alert-info { - background-color: rgba(59, 130, 246, 0.2); - border-left-color: #3b82f6; -} - -/* Notification Styles */ -.notification { - position: fixed; - bottom: 2rem; - left: 50%; - transform: translateX(-50%) translateY(100%); - background-color: var(--card-bg); - border: 1px solid var(--border-color); - border-radius: 0.5rem; - padding: 1rem 1.5rem; - box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); - z-index: 40; - transition: transform 0.3s ease; - opacity: 0; - max-width: 90%; - width: auto; -} - -.notification.show { - transform: translateX(-50%) translateY(0); - opacity: 1; -} - -.notification-success { - border-left: 4px solid var(--success-color); -} - -.notification-error { - border-left: 4px solid var(--error-color); -} - -.notification-warning { - border-left: 4px solid var(--warning-color); -} - -.notification-info { - border-left: 4px solid var(--info-color); -} - -/* Verbesserte Sichtbarkeit */ -.hidden { - display: none !important; -} - -/* Progress Bar Classes */ -.progress-bar { - width: 100%; - background-color: #e5e7eb; - border-radius: 9999px; - height: 0.625rem; -} - -.dark .progress-bar { - background-color: #374151; -} - -.progress-bar-fill { - height: 0.625rem; - border-radius: 9999px; -} - -.progress-bar-fill-blue { - background-color: #2563eb; -} - -.dark .progress-bar-fill-blue { - background-color: #3b82f6; -} - -.progress-bar-fill-green { - background-color: #16a34a; -} - -.dark .progress-bar-fill-green { - background-color: #22c55e; -} - -.progress-bar-fill-purple { - background-color: #9333ea; -} - -.dark .progress-bar-fill-purple { - background-color: #a855f7; -} - -/* Alert styles for flash messages */ -.alert { - padding: 1rem; - border-radius: 0.5rem; - margin-bottom: 1rem; - font-weight: 500; -} - -.alert-success { - background-color: #d1fae5; - color: #047857; -} - -.dark .alert-success { - background-color: #065f46; - color: #a7f3d0; -} - -.alert-error { - background-color: #fee2e2; - color: #b91c1c; -} - -.dark .alert-error { - background-color: #991b1b; - color: #fecaca; -} - -.alert-warning { - background-color: #fef3c7; - color: #92400e; -} - -.dark .alert-warning { - background-color: #78350f; - color: #fde68a; -} - -.alert-info { - background-color: #dbeafe; - color: #1e40af; -} - -.dark .alert-info { - background-color: #1e3a8a; - color: #bfdbfe; -} - -/* Additional utilities */ -.transition-colors { - transition-property: color, background-color, border-color; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 300ms; -} - -/* Tailwind Dark Mode Overrides */ -html.dark body [class*="dark\:bg-dark-card"] { - background-color: #1e293b !important; -} - -html.dark body [class*="dark\:bg-slate-800"] { - background-color: #0f172a !important; -} - -html.dark body [class*="dark\:bg-slate-700"] { - background-color: #1e293b !important; -} - -html.dark body div[class*="dark\:hover\:bg"] { - background-color: #1e293b !important; -} - -html.dark body tr[class*="dark\:hover\:bg"] { - background-color: #1e293b !important; -} - -html.dark body tr[class*="dark\:hover\:bg"]:hover { - background-color: #334155 !important; -} - -/* Ensure proper transition */ -.transition-colors { - transition-property: color, background-color, border-color; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 300ms; -} \ No newline at end of file