diff --git a/.gitignore b/.gitignore index 8904f6e..a75302b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ .venv users/ backup/ +Archiv/ diff --git a/__pycache__/zeiterfassung.cpython-38.pyc b/__pycache__/zeiterfassung.cpython-38.pyc deleted file mode 100644 index 1dcae1d..0000000 Binary files a/__pycache__/zeiterfassung.cpython-38.pyc and /dev/null differ diff --git a/lib/settings.json b/lib/settings.json deleted file mode 100644 index fe1226a..0000000 --- a/lib/settings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "admin_user": "admin", - "admin_password": "8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918", - "port": "8090", - "secret": "ftgzuhjikg,mt5jn46uzer8sfi9okrmtzjhndfierko5zltjhdgise", - "times_on_touchscreen": true, - "photos_on_touchscreen": true, - "touchscreen": true, - "picure_height": 200, - "button_height": 300, - "user_notes": true, - "holidays": {} -} \ No newline at end of file diff --git a/playgound.py b/playgound.py deleted file mode 100644 index 8d8184f..0000000 --- a/playgound.py +++ /dev/null @@ -1,23 +0,0 @@ -import json -import urllib.request - -from nicegui import ui, app - - -import segno - -@app.get("/data") -async def deliver_data(): - with open("settings.json") as json_file: - data = json.load(json_file) - return data - -string = "" -for i in range(1000): - string += str(i) - -qr_code = segno.make_qr(string).svg_data_uri() -#qr_code.save("qr_code.png", scale=5, border=0) -ui.image(qr_code) - -ui.run(language="de-DE", port=9000) \ No newline at end of file diff --git a/qr_scanner.py b/qr_scanner.py deleted file mode 100644 index 3f4a21e..0000000 --- a/qr_scanner.py +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/env python3 -import base64 -import signal -import time -import argparse -import requests - -import cv2 -import numpy as np -from fastapi import Response -from playsound3 import playsound -from definitions import app_title, app_version - -from nicegui import Client, app, core, run, ui - -class Commandline_Header: - message_string = f"{app_title} {app_version}" - underline = "" - for i in range(len(message_string)): - underline += "-" - print(message_string) - print(underline) - -def visual_interface(port=9000): - # In case you don't have a webcam, this will provide a black placeholder image. - black_1px = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdjYGBg+A8AAQQBAHAgZQsAAAAASUVORK5CYII=' - placeholder = Response(content=base64.b64decode(black_1px.encode('ascii')), media_type='image/png') - - global convert - def convert(frame: np.ndarray) -> bytes: - """Converts a frame from OpenCV to a JPEG image. - - This is a free function (not in a class or inner-function), - to allow run.cpu_bound to pickle it and send it to a separate process. - """ - _, imencode_image = cv2.imencode('.jpg', frame) - return imencode_image.tobytes() - - global setup - def setup() -> None: - - url_string = "" - for i in list(app.urls): - url_string += f"{i}, " - url_string = url_string[0:-2] - print("Weboberfläche erreichbar unter: " + url_string) - - # OpenCV is used to access the webcam. - video_capture = cv2.VideoCapture(0) - detector = cv2.QRCodeDetector() - - blocker = False - blockset = 0 - - - @app.get('/video/frame') - # Thanks to FastAPI's `app.get` it is easy to create a web route which always provides the latest image from OpenCV. - async def grab_video_frame() -> Response: - nonlocal blocker - if time.time() - blockset > 5: - blocker = False - - if not video_capture.isOpened(): - return placeholder - # The `video_capture.read` call is a blocking function. - # So we run it in a separate thread (default executor) to avoid blocking the event loop. - _, frame = await run.io_bound(video_capture.read) - if frame is None: - return placeholder - # `convert` is a CPU-intensive function, so we run it in a separate process to avoid blocking the event loop and GIL. - jpeg = await run.cpu_bound(convert, frame) - - # QR-Handling - - def function_call(): - r = requests.get(str(a)) - print(r.content()) - print("Inside Function_call") - #b = webbrowser.open(str(a)) - if r.status_code == 200: - print('Erkannt') - if r.json()["stampstatus"]: - playsound('ui-on.mp3') - elif not r.json()["stampstatus"]: - playsound('ui-off.mp3') - else: - playsound('ui-sound.mp3') - nonlocal blocker - nonlocal blockset - blocker = True - blockset = time.time() - - if not blocker: - _, img = video_capture.read() - # detect and decode - data, bbox, _ = detector.detectAndDecode(img) - # check if there is a QRCode in the image - if data: - a = data - function_call() - # cv2.imshow("QRCODEscanner", img) - if cv2.waitKey(1) == ord("q"): - function_call() - - return Response(content=jpeg, media_type='image/jpeg') - - # For non-flickering image updates and automatic bandwidth adaptation an interactive image is much better than `ui.image()`. - video_image = ui.interactive_image().classes('w-full h-full') - # A timer constantly updates the source of the image. - # Because data from same paths is cached by the browser, - # we must force an update by adding the current timestamp to the source. - - ui.timer(interval=0.1, callback=lambda: video_image.set_source(f'/video/frame?{time.time()}')) - - async def disconnect() -> None: - """Disconnect all clients from current running server.""" - for client_id in Client.instances: - await core.sio.disconnect(client_id) - - def handle_sigint(signum, frame) -> None: - # `disconnect` is async, so it must be called from the event loop; we use `ui.timer` to do so. - ui.timer(0.1, disconnect, once=True) - # Delay the default handler to allow the disconnect to complete. - ui.timer(1, lambda: signal.default_int_handler(signum, frame), once=True) - - async def cleanup() -> None: - # This prevents ugly stack traces when auto-reloading on code change, - # because otherwise disconnected clients try to reconnect to the newly started server. - await disconnect() - # Release the webcam hardware so it can be used by other applications again. - video_capture.release() - - app.on_shutdown(cleanup) - # We also need to disconnect clients when the app is stopped with Ctrl+C, - # because otherwise they will keep requesting images which lead to unfinished subprocesses blocking the shutdown. - signal.signal(signal.SIGINT, handle_sigint) - - - # All the setup is only done when the server starts. This avoids the webcam being accessed - # by the auto-reload main process (see https://github.com/zauberzeug/nicegui/discussions/2321). - app.on_startup(setup) - ui.run(favicon="favicon.svg", port=port, language='de-DE', show_welcome_message=False) - -if __name__ in ("__main__", "__mp_main__"): - parser = argparse.ArgumentParser(description=f'{app_title}-QR-Scanner {app_version}') - parser.add_argument('--webgui', help='Web-GUI starten', action="store_true") - parser.add_argument('-p', help="Port, über den die Weboberfläche erreichbar ist") - args = parser.parse_args() - - Commandline_Header() - print("QR-Scanner") - - if args.webgui: - try: - port = int(args.p) - except: - port = False - if not port == False: - visual_interface(port) - else: - print("Ungültiger Port") - print("Beende") - quit() diff --git a/qr_scanner_example.py b/qr_scanner_example.py deleted file mode 100644 index a641a08..0000000 --- a/qr_scanner_example.py +++ /dev/null @@ -1,22 +0,0 @@ -import cv2 -import webbrowser - -cap = cv2.VideoCapture(0) -# initialize the cv2 QRCode detector -detector = cv2.QRCodeDetector() - -while True: - _, img = cap.read() - # detect and decode - data, bbox, _ = detector.detectAndDecode(img) - # check if there is a QRCode in the image - if data: - a = data - break - cv2.imshow("QRCODEscanner", img) - if cv2.waitKey(1) == ord("q"): - break - -b = webbrowser.open(str(a)) -cap.release() -cv2.destroyAllWindows() \ No newline at end of file diff --git a/settings.json_bak b/settings.json_bak deleted file mode 100644 index b1a23bc..0000000 --- a/settings.json_bak +++ /dev/null @@ -1,12 +0,0 @@ -{ - "admin_user": "admin", - "admin_password": "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92", - "port": "8090", - "secret": "ftgzuhjikg,mt5jn46uzer8sfi9okrmtzjhndfierko5zltjhdgise", - "holidays": { - "2024-05-01": "Tag der Arbeit", - "2024-12-25": "1. Weihnachtsfeiertag", - "2025-01-01": "Neujahr", - "2025-05-01": "Tag der Arbeit" - } -} \ No newline at end of file diff --git a/sounds/3beeps.mp3 b/sounds/3beeps.mp3 deleted file mode 100644 index c14243e..0000000 Binary files a/sounds/3beeps.mp3 and /dev/null differ diff --git a/sounds/beep.mp3 b/sounds/beep.mp3 deleted file mode 100644 index 0d1f255..0000000 Binary files a/sounds/beep.mp3 and /dev/null differ diff --git a/sounds/power-on.mp3 b/sounds/power-on.mp3 deleted file mode 100644 index c659616..0000000 Binary files a/sounds/power-on.mp3 and /dev/null differ diff --git a/sounds/store_beep.mp3 b/sounds/store_beep.mp3 deleted file mode 100644 index ac50b9c..0000000 Binary files a/sounds/store_beep.mp3 and /dev/null differ diff --git a/sounds/success.mp3 b/sounds/success.mp3 deleted file mode 100644 index c86f6c6..0000000 Binary files a/sounds/success.mp3 and /dev/null differ diff --git a/sounds/ui-off.mp3 b/sounds/ui-off.mp3 deleted file mode 100644 index 1b8ccb7..0000000 Binary files a/sounds/ui-off.mp3 and /dev/null differ diff --git a/sounds/ui-on.mp3 b/sounds/ui-on.mp3 deleted file mode 100644 index 834f291..0000000 Binary files a/sounds/ui-on.mp3 and /dev/null differ diff --git a/sounds/ui-sound.mp3 b/sounds/ui-sound.mp3 deleted file mode 100644 index 1da7ff3..0000000 Binary files a/sounds/ui-sound.mp3 and /dev/null differ diff --git a/test.json b/test.json deleted file mode 100644 index f304e61..0000000 --- a/test.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "2024-04-01": { - "0": "0", - "1": "8", - "2": "8", - "3": "8", - "4": "8", - "5": "8", - "6": "0", - "vacation": "30" - }, - "2024-04-07": { - "0": "0", - "1": "6", - "2": "6", - "3": "6", - "4": "8", - "5": "6", - "6": "0", - "vacation": "28" - } -} \ No newline at end of file diff --git a/webcam_example.py b/webcam_example.py deleted file mode 100644 index b4fbfc4..0000000 --- a/webcam_example.py +++ /dev/null @@ -1,113 +0,0 @@ -#!/usr/bin/env python3 -import base64 -import signal -import time -import webbrowser - -import cv2 -import numpy as np -from fastapi import Response - -from nicegui import Client, app, core, run, ui - -# In case you don't have a webcam, this will provide a black placeholder image. -black_1px = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdjYGBg+A8AAQQBAHAgZQsAAAAASUVORK5CYII=' -placeholder = Response(content=base64.b64decode(black_1px.encode('ascii')), media_type='image/png') - - -def convert(frame: np.ndarray) -> bytes: - """Converts a frame from OpenCV to a JPEG image. - - This is a free function (not in a class or inner-function), - to allow run.cpu_bound to pickle it and send it to a separate process. - """ - _, imencode_image = cv2.imencode('.jpg', frame) - return imencode_image.tobytes() - - -def setup() -> None: - # OpenCV is used to access the webcam. - video_capture = cv2.VideoCapture(0) - detector = cv2.QRCodeDetector() - - blocker = False - blockset = 0 - - @app.get('/video/frame') - # Thanks to FastAPI's `app.get` it is easy to create a web route which always provides the latest image from OpenCV. - async def grab_video_frame() -> Response: - nonlocal blocker - if time.time() - blockset > 5: - blocker = False - - if not video_capture.isOpened(): - return placeholder - # The `video_capture.read` call is a blocking function. - # So we run it in a separate thread (default executor) to avoid blocking the event loop. - _, frame = await run.io_bound(video_capture.read) - if frame is None: - return placeholder - # `convert` is a CPU-intensive function, so we run it in a separate process to avoid blocking the event loop and GIL. - jpeg = await run.cpu_bound(convert, frame) - - # QR-Handling - - def function_call(): - b = webbrowser.open(str(a)) - print('\a') - nonlocal blocker - nonlocal blockset - blocker = True - blockset = time.time() - - if not blocker: - _, img = video_capture.read() - # detect and decode - data, bbox, _ = detector.detectAndDecode(img) - # check if there is a QRCode in the image - if data: - a = data - function_call() - # cv2.imshow("QRCODEscanner", img) - if cv2.waitKey(1) == ord("q"): - function_call() - - return Response(content=jpeg, media_type='image/jpeg') - - # For non-flickering image updates and automatic bandwidth adaptation an interactive image is much better than `ui.image()`. - video_image = ui.interactive_image().classes('w-full h-full') - # A timer constantly updates the source of the image. - # Because data from same paths is cached by the browser, - # we must force an update by adding the current timestamp to the source. - - ui.timer(interval=0.1, callback=lambda: video_image.set_source(f'/video/frame?{time.time()}')) - - async def disconnect() -> None: - """Disconnect all clients from current running server.""" - for client_id in Client.instances: - await core.sio.disconnect(client_id) - - def handle_sigint(signum, frame) -> None: - # `disconnect` is async, so it must be called from the event loop; we use `ui.timer` to do so. - ui.timer(0.1, disconnect, once=True) - # Delay the default handler to allow the disconnect to complete. - ui.timer(1, lambda: signal.default_int_handler(signum, frame), once=True) - - async def cleanup() -> None: - # This prevents ugly stack traces when auto-reloading on code change, - # because otherwise disconnected clients try to reconnect to the newly started server. - await disconnect() - # Release the webcam hardware so it can be used by other applications again. - video_capture.release() - - app.on_shutdown(cleanup) - # We also need to disconnect clients when the app is stopped with Ctrl+C, - # because otherwise they will keep requesting images which lead to unfinished subprocesses blocking the shutdown. - signal.signal(signal.SIGINT, handle_sigint) - - -# All the setup is only done when the server starts. This avoids the webcam being accessed -# by the auto-reload main process (see https://github.com/zauberzeug/nicegui/discussions/2321). -app.on_startup(setup) - -ui.run(port=9005) \ No newline at end of file