From 36c2466e536e11fd103f044df174923885fdcf4f Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Wed, 11 Jun 2025 08:53:07 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9A=20Improved=20blueprint=20structure?= =?UTF-8?q?s=20&=20templates=20for=20better=20organization?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/calendar.cpython-313.pyc | Bin 60720 -> 63561 bytes .../__pycache__/guest.cpython-313.pyc | Bin 50345 -> 50801 bytes .../__pycache__/jobs.cpython-313.pyc | Bin 29988 -> 30522 bytes backend/blueprints/calendar.py | 80 +++++++++++++++++- backend/blueprints/guest.py | 11 ++- backend/blueprints/jobs.py | 11 +++ backend/instance/printer_manager.db-shm | Bin 0 -> 32768 bytes backend/instance/printer_manager.db-wal | Bin 0 -> 4152 bytes backend/templates/base.html | 8 +- backend/templates/calendar.html | 77 ++++++++++++++++- 10 files changed, 181 insertions(+), 6 deletions(-) create mode 100644 backend/instance/printer_manager.db-shm create mode 100644 backend/instance/printer_manager.db-wal diff --git a/backend/blueprints/__pycache__/calendar.cpython-313.pyc b/backend/blueprints/__pycache__/calendar.cpython-313.pyc index 7cf8c8606b50ae0a200727868ea73af1bb0d04a9..6349287bfbc4b5ec9d61453821b6ee5a90425d88 100644 GIT binary patch delta 5601 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 PB`T(xW#cWMzQ_I#QiM0i delta 3667 zcma)8dr*|u760xo`?1Tiu)H7gT3Ce-6k&OYR2)gGf~hF1iyA~kSqKQbdUsKiny87B zYNAy*0;!rQs2OCe<70gk)QL?b5lI3IVbbh$s&@KEqA`W489PpG@44%;)M;kAGyD6_ zIrrRi&+DG=8yJ_Lb;$!CYBYWV`yFX3cy;B3a4v8#R;yvWoc$j@Qwlt!SiCi+7Z3X`HN0vhkkg)`Iu*L5Pq-u8npXehj^3xFnDD7?)69y!u(c?t~P*7CK# z-wuZ%n=(i=`J~|K>{p#A2qv-B9uKLBq0pHapb$-BSu#u{O^fiIEm)K$-w+s*tnYAt@tiag?=NpUa}=Xk^+|0Paziy=Nq6l=810d6zH z7{;|^%w{+{h(+u6aVl1%dbk_{Bp}+yq$*2?yKy0kh`FRJ6a9wH1^$Kp%&NM~;8FHI zml0#6#s4RaXM6O##`P~4A8Zbe{VB5n%$Z!!`Gv?;Wd?i_6`b7`2F{vkG8SX0E)<4q zVth=`lZdjGmqJC8Kij8AeNBKdDqUfWP8ThKCM7seh9;T&mbP_#)NE{O%^X0l@@KGR{#82OKODzdAv|dBpsZY zc@!FEt&&L!7?_m}%Jg*j>+BE7bl8)z1pd{U0{_k^kboUW8xUSWXk_4$H<~T930Vt* zm4OrlcQW;H(~*y7;PPp(uD7{F^A@wkZga^QN8g8JL%M1^TeSr-fV&$b;Eo|G

8* zKtKB3V>1s_z5#|c3Z9hw%+`{u8;`iaFvh>Ur( z1Z;U(>SiJYBsw*^Cyz96E-zW_&)6}I?&+g#1lCk7Ft2C!-+C#3d7kibL1D&nrEp`G z#F+l@B`M33ErSo9#+~edF%*xLYPqXu$3XTo=zxUI2Fq*!Dum_>d5x+2#kQOLiG!lsEbqPHx zT7ygAFf0xxqyrWfEfWu;UYsJNni0AYK7q5v1?oXY64ueS-9E5uWu!y9q)M$li|gkQeuK~gJ52i2 zKQOX{@`!k6c*Am_(tdUV3s-nn zx*=g@xx&f#X2-8qs>E;}d<(9BiNM2djssm~2%N4ABsbt%WsavpPbzcC0L)$+uO6CW zaP?Y)IL7!(#L=?$Q)RR_lir+B)ISfK>(a-y+YsCXd9t6w2dD`=gWMja(l|B!lZyz(@cz6F{x$gw3{X=l1 zwImX91WH=piav@W?vWWOZy`J3UhB^yc@ZZI=2BW|jhR-he+}|rnHEd$Qrhga)?VLa zrq`eYriZCmv$}li%=T)#ow~=<1J*5I4?BhjU_ZH(%{DW&RI@!n@X8^p>~8`L9(q|k zjtVCrrfpucc~LDYqO z5i?00u=+x3Nh5A-Lf}c|4b9%W0{xo7cRXoxkzyKCiX$o9EzJjr*ThM1UdSW>@{2dg z7Wn+)QgQ~OFYOg=XultNF42fdWtZOutEINS#%$SOrT~V^3naH1JIJNBHP_X#VC$_G zo8V0T!Kf*!izLF*GM)KEi=ZaNvhLOK?thm|~vSaeTO7bZd`Q)?U1}lR1 zDDOzTf>H2pcHa$T9SA$wjumth!xG8Yt>NA8ExFqgEEs+@X*<)E2*s%&$>=|NnZU^+V_wek<_N zP9u?OgJ+}V5)M4?gm!7zWv{lI>t3s3*RO_pTjO> zycz@A4iP>YixB&n=$YK{=dqqt*fPC|a0_7&;d2I(|BE+Jg7SM~>Mv2jiO>VN_lt=LJMZTOap@3BXQHo^z`*@( z))t$;&tZk^{yu#MFJzj#kVjF6-&Fnv@!sA}7>|jC$OnaaJh7`#Zv#RDLKi|B9>PbE z9$8)m31u6Roe3=u^xES{oV~R+Z}s<7*?pxv!xO#gS`gUKe8xYVw1JT+-QTb zM{Tq5)03V?z)v9RM8KCey@!Cqn&L>HSWCfd?SJAN&wC|$=)MiN#6{|1CfP-krW;Sf2C=KOS zx>a`0rVGS#lqX(KnMo-A0uqnJwF-^dRbVw5Qz_IbW_sEp^+=zeqLkN2p&lh?p6iKq zRZQz1`^hP{dI4hwQ!0+CGHzTuV|G=MwDVG*8JYHYq=xd)E)TNWbI^6AQk(J2s7z0c zs{)<=K!wiO(?CVEff|gt=!^AAph4OSEn$qt3{bNz0}b0!(7!ebI#7{TQZsY5*?$#q zYuy~K_7ofLPPc$@>(N++F4Hj+6GwUT@%UsUuF?P+sHKdSY5=*} zVpe52*fqD@>uYI*!Em6y+AFlUeNB9Q*w4f2a60Z_qVwQBZY2!+T6oAcT)qIgHC`b! z&lY@{+b-w$=0GDa_?o=_5FZL_vHuT8KK!kFKj#kdzLxr+z&{zI=URe+K#1o8&Az4( zPLTXq25u`4>-m5fswxDa0ChRWH;gJm!Nx{EU)KhkaTu&?^M@PZa$E_%Mc{1$P7I@Q zTfH!V&ja@o)jI@s6Ieow@j?hTgqmA<=*41g0vd2GP92rtqfa$Enn3c_31Od)7X);) zTZfD;W%4iB`BnT_g})h!dX1Wh^@=u^m)<0qQv+@*?cZ@F!`z|+>uwtIZy3sk3}rov zK25JC;`9s~Y7SJ~nQQo7t?85#b%iTvJ;W zRYmlG31DF$-+=k`=T@k(FqlK!28*PQ9Cpy6bLiQ%k&IYui0E0YisUea=SdxnUO@lM{JMK`yIt> z4wf&9*E&oRmTc&c;y?T6Gi(W_DzN~aiUSIC>&OJiN7s*T1&h$iV|!GEBn5tW6nuj~ z5fSsyont|ehboT;*)>>^E?zo*Hx4XDA9s}{Mcc3tw=@Fz=#Q@P+^1zR5p#4qW|wFs zdUV1FOvrfB%-XR%AZ|KYorp7wUy67c8_&KJyMlz}p{r*Fm5tD7nw#Wo(aK8XJl6%X z(d4<#r9TlZ*~{qu!Aj!ZN<=?_4gv*4S4NnXfQE?E6^73*Oq;DRJA!4z@gXvFhkz3u z>MmtB;Gjd|NOvd8)?z9Xw|zALmXfuFkla2b*9OT=Kyn9=OdpadLeelK p$zUydy(bfF5j%S>0)-ENqEz8DmgHzyU4L0xCq-Y;9#iai^GJaNrgd zwzx!m=bz1i#yB>e%k(CU5f>cUWX=dI(Wu0^ACm0HjA6nIiJ#}a$Tk!2kLNz`^SZQy)H zpQ$E&hdrW7=bBU*T$7@)0`__m1AD_KwPwbI)YH)wqyZK>G?3xjs-bT%9>sHo13ri079;)a6Qkz@j(eF~QnX2*`U1QuCZU;kZ*=zGSK1)dQZw)Y zvpksRwQ|yS2A8&I5Vw`5dbPskR4Zbknn_nkI^$RDGIzQQSTG|8GtO+ruO?&SYKGgz zf@{eZkAc7T$YV(?m{nnB)}ZmK#96D|D~Pit3Z~BqB2(saR00NCjn|@_GYPD8&LX2# zQ*RgMHs#e@g?Te!eBLV7+ok88j2Fb)?3-^&1FdH?mSsj45@@h1(1F|A9u4m5j_i)o z6{rXW#Xnj0SLtl%uG0E97HXm$kzK*|-GQDUtz`nOM&My8k}oRRz7|TWk#A!N2lG)X zYMJn~RMq2DD|C#~c<9}4)0>d$5yr7M3C8w+t|f9FK?lA450ODFJ`iMLV9z^sTQ{|`lB>GoGXa= zjOwM|j-F8xJ-qk!5^=!M6Z=R3#E!gb%0>$|7#ux_kb_|soE+&USzsRR7Au%wmJW~J zRFXp2GghXTf1?P?k`Np)IkxEdKbOszmWLLHd2MptFmo!CY=)mtxx{Lg?~pc~_Uo8) z-?&7akbAyOQHE_;yoTUJ ztqhqPAyp0$vf%iIf|UC!+~0!jShxzeFZ2)(?3^qT{j46O6O*H&*vzOxa)0(EDZy(+ zai}N`48=*Hc={BNjp9jAJOhfmPjMG1{xC%|+6+%jr;)G}p1w#7&k&+t7C7EbmU!e# KWm3WAV*VcjAZYyn diff --git a/backend/blueprints/__pycache__/jobs.cpython-313.pyc b/backend/blueprints/__pycache__/jobs.cpython-313.pyc index 05ad204476282a6f79b2e09cef88c2faac6f6224..e1c6aa21f2c292188802bc0f323f7bc0d8c690ec 100644 GIT binary patch delta 1056 zcmY*XL2MgE6rJ(LPVKCn5GSmgIQ7I$nnZ2WrqonbQ|eTK#G$!(979(goMwZD2lszIN@x77oiDFN$-1!%a}i9YrzD zWXtfRJjnrgs~8kq$$juaC^#&}T)VmURQu>oh>Cj=N|W6KO77>({r(gRAUW`i5W_ne zg5=JWtLkm>(nGKr2*XbmzrUw-mvSXX;g&n-KlsGWA+9HNoy3RPB~y?d<#2KWrd|kl zKem$JwF19)_J!o9wmoz|>49~Kv6?=Yu?MCu4hjSz&V}(az3|2*-*9hg&r#g6JcI^O z`q@^yc9frCL-D2wG|n7>&$>Fm7x%xN_W48UQ!P@;3*+&K#qKa@8r(CEoQM2MscdBicLxPoFpv2MqGKG+GH818ie0{s3zm;E%WkB#?rwBeKIrWKQIs~s$eI{wL?`R# z>$8n%twBonMI9byPWM0PkhTfoH8I?X#8$MGi}h?{;M{$29&-99%x9OzXAhuTlama; zIyp7Mwyy`L+t_yJfG=@ExN~$eaZFe}gju|L%$+zdf eg090X9l*cTH2N>b6OgxiJQG;PTN+%oKl%@KxgEIx delta 574 zcmdn>j&aE=M!wIyyj%=GaDRqvhFwgu3?*N!#^}3s9Fj zkRdhMBTt!I1124$J$a#oFgs5u10O>$?_~dIab3PpRs%*;Mu-X(21SNw9hho%hD3J; zhCH@txcLClgxe3S3XNKBp|t2Ft4tjgr> z6xqqo3WO&6#_>*ODwLMtEG|hbDv8g^PbxYB)N>Z-o8tXIqJiN9*JP{0Vika;M(DWaSo6n^LvoIc;tdv>Hczp7LOcmDCKyj(bXH$|UYiC_&Jh_=U zdp}UY=EM1EjI8H?ayFaw3Kf_IK#nT{nNbANP;_o`T!}2>?aehMzZe= start_date, + PlugStatusLog.timestamp <= end_date + ) + + if printer_id: + plug_query = plug_query.filter(PlugStatusLog.printer_id == printer_id) + + plug_logs = plug_query.order_by(PlugStatusLog.timestamp.desc()).all() + + # Steckdosen-Events gruppieren (nur Statuswechsel anzeigen) + for i, log in enumerate(plug_logs): + # Prüfen ob es eine Statusänderung ist (nicht einfach ein Status-Check) + if i < len(plug_logs) - 1: + prev_log = plug_logs[i + 1] + if prev_log.status == log.status and prev_log.printer_id == log.printer_id: + continue # Gleicher Status, überspringen + + # Drucker-Name für den Event + printer = db_session.query(Printer).filter_by(id=log.printer_id).first() + printer_name = printer.name if printer else f"Drucker {log.printer_id}" + + # Event-Farbe basierend auf Status + plug_color = "#FF6B35" # Orange für Steckdosen-Events + if log.status == "on": + plug_color = "#4ECDC4" # Türkis für eingeschaltet + elif log.status == "off": + plug_color = "#FFD23F" # Gelb für ausgeschaltet + elif log.status == "disconnected": + plug_color = "#EE6C4D" # Rot für nicht erreichbar + + # Status-Text übersetzen + status_text = { + "on": "Eingeschaltet", + "off": "Ausgeschaltet", + "connected": "Verbunden", + "disconnected": "Offline" + }.get(log.status, log.status) + + # Quelle anzeigen + source_text = { + "system": "System", + "manual": "Manuell", + "api": "API", + "scheduler": "Scheduler" + }.get(log.source, log.source) + + plug_event = { + "id": f"plug_{log.id}", + "title": f"🔌 {printer_name}: {status_text}", + "start": log.timestamp.isoformat(), + "end": log.timestamp.isoformat(), # Punktereignis + "color": plug_color, + "display": "list-item", # Als kleines Item anzeigen + "extendedProps": { + "eventType": "plug_status", + "status": log.status, + "printerId": log.printer_id, + "printerName": printer_name, + "source": source_text, + "powerConsumption": log.power_consumption, + "voltage": log.voltage, + "current": log.current, + "responseTime": log.response_time_ms, + "notes": log.notes, + "errorMessage": log.error_message + } + } + + events.append(plug_event) + logger.info(f"📅 Kalender-Events abgerufen: {len(events)} Einträge für Zeitraum {start_date} bis {end_date}") return jsonify(events) diff --git a/backend/blueprints/guest.py b/backend/blueprints/guest.py index f940b9a38..1e9404c67 100644 --- a/backend/blueprints/guest.py +++ b/backend/blueprints/guest.py @@ -446,11 +446,16 @@ def api_start_job_with_code(): # OTP als verwendet markieren matching_request.otp_used_at = now - # Drucker einschalten (falls implementiert) + # Drucker einschalten über Tapo-Steckdose if job.printer and job.printer.plug_ip: try: - from utils.job_scheduler import toggle_plug - toggle_plug(job.printer_id, True) + from utils.job_scheduler import BackgroundTaskScheduler + scheduler = BackgroundTaskScheduler() + plug_success = scheduler.toggle_printer_plug(job.printer_id, True) + if plug_success: + logger.info(f"🔌 Drucker für Gast-Job {job.id} eingeschaltet") + else: + logger.warning(f"⚠️ Steckdose für Gast-Job {job.id} konnte nicht eingeschaltet werden") except Exception as e: logger.warning(f"Fehler beim Einschalten des Druckers: {str(e)}") diff --git a/backend/blueprints/jobs.py b/backend/blueprints/jobs.py index ac9312b2e..14820b988 100644 --- a/backend/blueprints/jobs.py +++ b/backend/blueprints/jobs.py @@ -483,6 +483,14 @@ def start_job(job_id): db_session.close() return jsonify({"error": "Drucker ist nicht online"}), 400 + # Drucker einschalten über Tapo-Steckdose + from utils.job_scheduler import BackgroundTaskScheduler + scheduler = BackgroundTaskScheduler() + plug_success = scheduler.toggle_printer_plug(job.printer_id, True) + + if not plug_success: + jobs_logger.warning(f"⚠️ Steckdose für Job {job_id} konnte nicht eingeschaltet werden") + # Job als laufend markieren job.status = "running" job.start_at = datetime.now() @@ -490,6 +498,9 @@ def start_job(job_id): db_session.commit() + if plug_success: + jobs_logger.info(f"🔌 Drucker für Job {job_id} eingeschaltet") + # Job-Objekt für die Antwort serialisieren job_dict = job.to_dict() db_session.close() diff --git a/backend/instance/printer_manager.db-shm b/backend/instance/printer_manager.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..ee0d50ee50f3dbb89f6cda68f7ed63dd47cb8d26 GIT binary patch literal 32768 zcmeI)y$J#_6ae6yzh@`dTrZZQjg^g++zKvW=>YbQ;3n>(f*?49y(WiO0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0(B9{LSFs*QkQ=8k^aePhE`~Y zPUzwwK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs T0RjXF5FkK+009C7{#4)zgX<++ literal 0 HcmV?d00001 diff --git a/backend/instance/printer_manager.db-wal b/backend/instance/printer_manager.db-wal new file mode 100644 index 0000000000000000000000000000000000000000..02b72234ef6734292b94fa36c85410a7903d22d3 GIT binary patch literal 4152 zcmXr7XKP~6eI&uaAiw|uTU5VHjm*1Qm33R=_}n>pM}b02Kr8_hKfqV%vTMo>ZC;=t zBR>-Z5RHP-5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c#v#yH%_z-aE#Ang zF3#!b=*Zv*@~fyIC#N(ACnHB`z$M$= z5oB&=aY<2PNq!O7G$R8eQ(XfyT>}#ZBV#LLQ!5h#Jxc>qV`D>@jG>`|frXWck(H6D wo`IRUrHKWqjH!{8u{lr%D2^rr)MIR^XJKh>U}BJ1T9Tgv^h{b}X- {% if current_user.is_authenticated and current_user.is_admin %} -

diff --git a/backend/templates/calendar.html b/backend/templates/calendar.html index 999238089..ca1ea7420 100644 --- a/backend/templates/calendar.html +++ b/backend/templates/calendar.html @@ -885,6 +885,32 @@ + +
+ +
+ +
+ + +
+
+
+
@@ -1178,7 +1204,32 @@ document.addEventListener('DOMContentLoaded', function() { startTime: '08:00', endTime: '18:00' }, - events: '/api/calendar/events', + events: function(info, successCallback, failureCallback) { + const params = new URLSearchParams({ + start: info.start.toISOString(), + end: info.end.toISOString() + }); + + // Drucker-Filter hinzufügen + const printerFilter = document.getElementById('printerFilter'); + if (printerFilter && printerFilter.value) { + params.append('printer_id', printerFilter.value); + } + + // Steckdosen-Events hinzufügen falls aktiviert + const showPlugEvents = document.getElementById('showPlugEvents'); + if (showPlugEvents && showPlugEvents.checked) { + params.append('show_plug_events', 'true'); + } + + fetch(`/api/calendar/events?${params.toString()}`) + .then(response => response.json()) + .then(data => successCallback(data)) + .catch(error => { + console.error('Fehler beim Laden der Events:', error); + failureCallback(error); + }); + }, editable: canEdit, selectable: canEdit, selectMirror: true, @@ -1223,6 +1274,30 @@ document.addEventListener('DOMContentLoaded', function() { calendar.refetchEvents(); }); + // Steckdosen-Events Toggle Handler + const showPlugEventsToggle = document.getElementById('showPlugEvents'); + if (showPlugEventsToggle) { + showPlugEventsToggle.addEventListener('change', function() { + // Toggle-Animation + const toggleElement = this.nextElementSibling; + const dot = toggleElement.querySelector('.dot'); + const toggleBg = toggleElement.querySelector('div'); + + if (this.checked) { + dot.classList.add('translate-x-5'); + toggleBg.classList.remove('bg-gray-200', 'dark:bg-gray-700'); + toggleBg.classList.add('bg-green-500', 'dark:bg-green-600'); + } else { + dot.classList.remove('translate-x-5'); + toggleBg.classList.remove('bg-green-500', 'dark:bg-green-600'); + toggleBg.classList.add('bg-gray-200', 'dark:bg-gray-700'); + } + + // Kalender neu laden + calendar.refetchEvents(); + }); + } + // Form Submit Handler document.getElementById('eventForm').addEventListener('submit', async function(e) { e.preventDefault();