Erste Anpassungen für Dockercontainer
This commit is contained in:
parent
e7acbce08c
commit
e54a210d69
23
Dockerfile
Normal file
23
Dockerfile
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
FROM debian:latest
|
||||||
|
RUN apt update && apt upgrade -y
|
||||||
|
RUN apt install python3 python3-pip python3.11-venv locales -y
|
||||||
|
RUN mkdir /app
|
||||||
|
RUN mkdir /.venv
|
||||||
|
RUN mkdir /backup
|
||||||
|
RUN python3 -m venv /.venv
|
||||||
|
RUN /.venv/bin/pip install nicegui
|
||||||
|
RUN /.venv/bin/pip install segno
|
||||||
|
RUN /.venv/bin/pip install python-dateutil
|
||||||
|
|
||||||
|
RUN sed -i '/de_DE.UTF-8/s/^# //g' /etc/locale.gen && \
|
||||||
|
locale-gen
|
||||||
|
ENV LANG de_DE.UTF-8
|
||||||
|
ENV LANGUAGE de_DE:de
|
||||||
|
ENV LC_ALL de_DE.UTF-8
|
||||||
|
|
||||||
|
COPY main.py /app/main.py
|
||||||
|
COPY favicon.svg /app/favicon.svg
|
||||||
|
COPY lib /app/lib/
|
||||||
|
EXPOSE 8090
|
||||||
|
ENTRYPOINT ["/.venv/bin/python", "/app/main.py", "--docker"]
|
||||||
|
#ENTRYPOINT exec /app/.venv/bin/python /app/main.py --docker
|
10
docker-compose.yml
Normal file
10
docker-compose.yml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
services:
|
||||||
|
test:
|
||||||
|
image: test:0
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- 8090:8090
|
||||||
|
volumes:
|
||||||
|
- /home/alexander/Dokumente/Python/Zeiterfassung:/app
|
||||||
|
- /home/alexander/Dokumente/Python/Zeiterfassung/users-docker:/users
|
||||||
|
- /home/alexander/Dokumente/Python/Zeiterfassung/backup:/backup
|
11
lib/admin.py
11
lib/admin.py
@ -1,7 +1,6 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
import dateutil.easter
|
import dateutil.easter
|
||||||
from PIL.SpiderImagePlugin import isInt
|
|
||||||
from dateutil.easter import *
|
from dateutil.easter import *
|
||||||
|
|
||||||
from nicegui import ui, app, events
|
from nicegui import ui, app, events
|
||||||
@ -45,6 +44,9 @@ def page_admin():
|
|||||||
updates_available = ValueBinder()
|
updates_available = ValueBinder()
|
||||||
updates_available.value = False
|
updates_available.value = False
|
||||||
|
|
||||||
|
is_docker = ValueBinder
|
||||||
|
print(docker)
|
||||||
|
|
||||||
with ui.tabs() as tabs:
|
with ui.tabs() as tabs:
|
||||||
|
|
||||||
time_overview = ui.tab('Zeitdaten')
|
time_overview = ui.tab('Zeitdaten')
|
||||||
@ -1468,7 +1470,10 @@ Dies kann nicht rückgängig gemacht werden!''')
|
|||||||
except ValueError:
|
except ValueError:
|
||||||
button_string = date_string
|
button_string = date_string
|
||||||
ui.markdown(button_string)
|
ui.markdown(button_string)
|
||||||
ui.markdown(f'{round(size/1_000_000,2)} MB')
|
if size > 1_000_000:
|
||||||
|
ui.markdown(f'{round(size/1_000_000,2)} MB')
|
||||||
|
else:
|
||||||
|
ui.markdown(f'{round(size / 1_000, 2)} kB')
|
||||||
ui.markdown(version)
|
ui.markdown(version)
|
||||||
ui.button(icon='download', on_click=lambda file=date_string: ui.download.file(
|
ui.button(icon='download', on_click=lambda file=date_string: ui.download.file(
|
||||||
os.path.join(scriptpath, backupfolder, f'{file}.zip'))).tooltip(
|
os.path.join(scriptpath, backupfolder, f'{file}.zip'))).tooltip(
|
||||||
@ -1529,7 +1534,7 @@ Dies kann nicht rückgängig gemacht werden!''')
|
|||||||
for file in files:
|
for file in files:
|
||||||
add = os.path.join(root, file)
|
add = os.path.join(root, file)
|
||||||
target.write(add)
|
target.write(add)
|
||||||
target.write(usersettingsfilename)
|
target.write(os.path.join(scriptpath, usersettingsfilename), arcname=usersettingsfilename)
|
||||||
target.writestr("app_version.txt", data=app_version)
|
target.writestr("app_version.txt", data=app_version)
|
||||||
backup_list.refresh()
|
backup_list.refresh()
|
||||||
n.dismiss()
|
n.dismiss()
|
||||||
|
@ -6,9 +6,12 @@ from pathlib import Path
|
|||||||
import hashlib
|
import hashlib
|
||||||
|
|
||||||
app_title = "Zeiterfassung"
|
app_title = "Zeiterfassung"
|
||||||
app_version = ("0.0.0")
|
app_version = "0.0.0"
|
||||||
|
|
||||||
|
docker = False
|
||||||
|
|
||||||
# Standardpfade
|
# Standardpfade
|
||||||
|
|
||||||
scriptpath = str(Path(os.path.dirname(os.path.abspath(__file__))).parent.absolute())
|
scriptpath = str(Path(os.path.dirname(os.path.abspath(__file__))).parent.absolute())
|
||||||
userfolder = "users"
|
userfolder = "users"
|
||||||
backupfolder = str(os.path.join(scriptpath, "backup"))
|
backupfolder = str(os.path.join(scriptpath, "backup"))
|
||||||
|
20
lib/users.py
20
lib/users.py
@ -14,25 +14,28 @@ import shutil
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
from lib.definitions import userfolder, scriptpath, usersettingsfilename, photofilename, status_in, status_out, \
|
from lib.definitions import userfolder, scriptpath, usersettingsfilename, photofilename, status_in, status_out, \
|
||||||
standard_adminsettings, standard_usersettings, va_file
|
standard_adminsettings, standard_usersettings, va_file, docker
|
||||||
|
|
||||||
|
|
||||||
# Benutzerklasse
|
# Benutzerklasse
|
||||||
|
|
||||||
class user:
|
class user:
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
self.userfolder = os.path.join(scriptpath, userfolder, name)
|
if not scriptpath == "/app":
|
||||||
|
self.userfolder = os.path.join(scriptpath, userfolder, name)
|
||||||
|
else:
|
||||||
|
self.userfolder = os.path.join("/users", name)
|
||||||
self.settingsfile = os.path.join(self.userfolder, usersettingsfilename)
|
self.settingsfile = os.path.join(self.userfolder, usersettingsfilename)
|
||||||
self.photofile = os.path.join(self.userfolder, photofilename)
|
self.photofile = os.path.join(self.userfolder, photofilename)
|
||||||
|
|
||||||
# Stammdaten einlesen
|
# Stammdaten einlesen
|
||||||
try:
|
#try:
|
||||||
with open(self.settingsfile) as json_file:
|
with open(self.settingsfile) as json_file:
|
||||||
data = json.load(json_file)
|
data = json.load(json_file)
|
||||||
|
print(data)
|
||||||
except:
|
#except:
|
||||||
print("Fehler beim Erstellen des Datenarrays.")
|
# print("Fehler beim Erstellen des Datenarrays.")
|
||||||
#Hier muss noch Fehlerbehandlungcode hin
|
# #TODO Hier muss noch Fehlerbehandlungcode hin
|
||||||
|
|
||||||
self.password = data["password"]
|
self.password = data["password"]
|
||||||
self.workhours = data["workhours"]
|
self.workhours = data["workhours"]
|
||||||
@ -534,6 +537,7 @@ def new_user(username: str):
|
|||||||
def load_adminsettings():
|
def load_adminsettings():
|
||||||
# Settingsdatei einlesen
|
# Settingsdatei einlesen
|
||||||
settings_filename = os.path.join(scriptpath, usersettingsfilename)
|
settings_filename = os.path.join(scriptpath, usersettingsfilename)
|
||||||
|
print(settings_filename)
|
||||||
if not os.path.exists(settings_filename):
|
if not os.path.exists(settings_filename):
|
||||||
print("Keine Einstellungsdatei gefunden. Lege Standarddatei an.")
|
print("Keine Einstellungsdatei gefunden. Lege Standarddatei an.")
|
||||||
with open(settings_filename, 'w') as json_file:
|
with open(settings_filename, 'w') as json_file:
|
||||||
|
@ -73,6 +73,7 @@
|
|||||||
"2030-10-30": "Reformationstag",
|
"2030-10-30": "Reformationstag",
|
||||||
"2030-12-25": "1. Weihnachtsfeiertag",
|
"2030-12-25": "1. Weihnachtsfeiertag",
|
||||||
"2030-12-26": "2. Weihnachtsfeiertag",
|
"2030-12-26": "2. Weihnachtsfeiertag",
|
||||||
"2025-06-11": "Testeintrag"
|
"2025-06-11": "Testeintrag",
|
||||||
|
"2025-05-31": "Testeintrag"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"archived": 0,
|
"archived": 1,
|
||||||
"total_hours": 0,
|
"total_hours": 0,
|
||||||
"absence": {}
|
"absence": {},
|
||||||
|
"overtime": -406441
|
||||||
}
|
}
|
@ -15,7 +15,6 @@ import argparse
|
|||||||
|
|
||||||
from lib.web_ui import hash_password
|
from lib.web_ui import hash_password
|
||||||
|
|
||||||
|
|
||||||
class Commandline_Header:
|
class Commandline_Header:
|
||||||
message_string = f"{app_title} {app_version}"
|
message_string = f"{app_title} {app_version}"
|
||||||
underline = ""
|
underline = ""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user