diff --git a/.env b/.env deleted file mode 100644 index e8985d5..0000000 --- a/.env +++ /dev/null @@ -1,34 +0,0 @@ -# Flask-Configuration - Key are generated through setup.sh -SECRET_KEY="" -REDEEM_SECRET="" -WTF_CSRF_SECRET_KEY="" - -# locales -BABEL_DEFAULT_LOCALE="en" -BABEL_SUPPORTED_LOCALES="de,en" -BABEL_TRANSLATION_DIRECTORIES="translations" - -# Timezone -TZ=Europe/Berlin - -# Security -SESSION_COOKIE_SECURE="False" -CSRF_ENABLED="True" -# Account registration -REGISTRATION_ENABLED="True" - -# checking interval if keys have to be redeemed before a specific date -CHECK_EXPIRING_KEYS_INTERVAL_HOURS=6 - -# Pushover -PUSHOVER_APP_TOKEN="" -PUSHOVER_USER_KEY="" - -# Gotify -GOTIFY_URL="" -GOTIFY_TOKEN="" - -# Matrix -MATRIX_HOMESERVER="" -MATRIX_ACCESS_TOKEN="" -MATRIX_ROOM_ID="" diff --git a/setup.sh b/setup.sh index 362cdb9..7a24685 100644 --- a/setup.sh +++ b/setup.sh @@ -52,7 +52,6 @@ else elif command -v apt-get &>/dev/null; then sudo apt-get update sudo apt-get install -y docker-compose-plugin - sudo apt-get install -y docker-compose elif command -v dnf &>/dev/null; then sudo dnf install -y docker-compose elif command -v yum &>/dev/null; then @@ -75,12 +74,12 @@ else fi -# Configuration +# Konfiguration PROJECT_DIR="steam-gift-manager" TRANSLATIONS_DIR="../translations" DATA_DIR="../data" -# 1. Create project folder & translations folder +# 1. Projektordner & Übersetzungsordner erstellen mkdir -p "$PROJECT_DIR"/{templates,static} mkdir -p "$TRANSLATIONS_DIR"/de/LC_MESSAGES mkdir -p "$TRANSLATIONS_DIR"/en/LC_MESSAGES @@ -108,10 +107,9 @@ matrix-client reportlab requests pillow -gunicorn EOL -# 3. Create .env file in parent directory +# 3. .env-Datei im übergeordneten Verzeichnis erstellen cd .. SECRET_KEY=$(python3 -c 'import secrets; print(secrets.token_hex(24))') REDEEM_SECRET=$(python3 -c 'import secrets; print(secrets.token_hex(16))') @@ -154,10 +152,10 @@ MATRIX_ACCESS_TOKEN="" MATRIX_ROOM_ID="" EOL -# Back to project directory +# Zurück ins Projektverzeichnis cd $PROJECT_DIR -# 4. app.py (the main app) +# 4. app.py (vollständige korrigierte Version) cat <<'PYTHON_END' > app.py import os import logging @@ -220,7 +218,7 @@ load_dotenv(override=True) # Lade Umgebungsvariablen aus .env mit override load_dotenv(override=True) -# App-Configuration +# Konfiguration app.config.update( SECRET_KEY=os.getenv('SECRET_KEY'), SQLALCHEMY_DATABASE_URI=('sqlite:////app/data/games.db'), @@ -235,7 +233,7 @@ app.config.update( interval_hours = int(os.getenv('CHECK_EXPIRING_KEYS_INTERVAL_HOURS', 12)) -# Initialisation +# Initialisierung db = SQLAlchemy(app, metadata=metadata) migrate = Migrate(app, db) login_manager = LoginManager(app) @@ -259,7 +257,7 @@ def inject_template_vars(): theme='dark' if request.cookies.get('dark_mode') == 'true' else 'light' ) -# DB Models +# Datenbankmodelle class User(db.Model, UserMixin): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) @@ -351,7 +349,7 @@ def login(): @app.route('/register', methods=['GET', 'POST']) def register(): if not app.config['REGISTRATION_ENABLED']: - flash(_('No new registrations. They are deactivated!'), 'danger') + flash(_('Registrierungen sind deaktiviert'), 'danger') return redirect(url_for('login')) if request.method == 'POST': @@ -385,16 +383,16 @@ def change_password(): confirm_password = request.form['confirm_password'] if not check_password_hash(current_user.password, current_password): - flash(_('Current passwort is wrong'), 'danger') + flash(_('Aktuelles Passwort ist falsch'), 'danger') return redirect(url_for('change_password')) if new_password != confirm_password: - flash(_('New Passwords are not matching'), 'danger') + flash(_('Neue Passwörter stimmen nicht überein'), 'danger') return redirect(url_for('change_password')) current_user.password = generate_password_hash(new_password) db.session.commit() - flash(_('Password changed successfully'), 'success') + flash(_('Passwort erfolgreich geändert'), 'success') return redirect(url_for('index')) return render_template('change_password.html') @@ -590,7 +588,7 @@ def export_pdf(): game.redeem_date.strftime('%d.%m.%y') if game.redeem_date else '' ]) - # Table format + # Tabelle formatieren table = Table(data, colWidths=col_widths, repeatRows=1) table.setStyle(TableStyle([ ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'), @@ -652,15 +650,15 @@ def import_games(): db.session.commit() - flash(_('%(new)d new games imported, %(dup)d skipped duplicates', new=new_games, dup=duplicates), 'success') + flash(_('%(new)d neue Spiele importiert, %(dup)d Duplikate übersprungen', new=new_games, dup=duplicates), 'success') except Exception as e: db.session.rollback() - flash(_('Import error: %(error)s', error=str(e)), 'danger') + flash(_('Importfehler: %(error)s', error=str(e)), 'danger') return redirect(url_for('index')) - flash(_('Please upload a valid CSV file.'), 'danger') + flash(_('Bitte eine gültige CSV-Datei hochladen.'), 'danger') return render_template('import.html') @@ -814,7 +812,7 @@ def check_expiring_keys(): send_notification(user, game) -# Optional: cleaning up old tokens +# Optional: Cleanup-Funktion für regelmäßiges Löschen abgelaufener Tokens def cleanup_expired_tokens(): now = datetime.utcnow() expired = RedeemToken.query.filter(RedeemToken.expires < now).all() @@ -823,13 +821,13 @@ def cleanup_expired_tokens(): db.session.commit() -# Scheduler start +# Scheduler initialisieren und starten scheduler = BackgroundScheduler() scheduler.add_job(func=check_expiring_keys, trigger="interval", hours=interval_hours) scheduler.add_job(func=cleanup_expired_tokens, trigger="interval", hours=1) scheduler.start() -# Shutdown of the Schedulers when stopping the app +# Shutdown des Schedulers bei Beendigung der App atexit.register(lambda: scheduler.shutdown()) if __name__ == '__main__': @@ -839,7 +837,7 @@ if __name__ == '__main__': PYTHON_END -# Create Babel configuration +# Babel Konfiguration erstellen cat < babel.cfg [python: **.py] [jinja2: **/templates/**.html] @@ -881,8 +879,7 @@ RUN groupadd -g \$GID appuser && \ USER appuser EXPOSE 5000 - -CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"] +CMD ["python", "app.py"] DOCKER_END # 6. docker-compose.yml @@ -903,11 +900,11 @@ services: restart: unless-stopped COMPOSE_END -# 7. Directories and permissions +# 7. Verzeichnisse und Berechtigungen mkdir -p ../data ../translations chmod -R a+rwX ../data ../translations -# 8. Translation and upgrade scripts +# 8. Übersetzungs- und Upgrade-Scripte cat <<'SCRIPT_END' > ../translate.sh #!/bin/bash set -e @@ -919,10 +916,10 @@ declare -A locales=( ["en"]="en" ) -# create POT-file +# POT-Datei erstellen docker-compose exec steam-manager pybabel extract -F babel.cfg -o translations/messages.pot . -# Check for each language and initialize if necessary +# Für jede Sprache prüfen und ggf. initialisieren for lang in "${!locales[@]}"; do if [ ! -f "translations/${locales[$lang]}/LC_MESSAGES/messages.po" ]; then docker-compose exec steam-manager pybabel init \ @@ -932,11 +929,11 @@ for lang in "${!locales[@]}"; do fi done -# Update and compile translations +# Übersetzungen aktualisieren und kompilieren docker-compose exec steam-manager pybabel update -i translations/messages.pot -d translations docker-compose exec steam-manager pybabel compile -d translations -echo "✅ Translations updated!" +echo "✅ Übersetzungen aktualisiert!" SCRIPT_END chmod +x ../translate.sh @@ -944,25 +941,25 @@ cat <<'SCRIPT_END' > ../upgrade.sh #!/bin/bash set -e -# Set the working directory to the project directory +# Setze das Arbeitsverzeichnis auf das Projektverzeichnis cd "$(dirname "$0")/steam-gift-manager" # Setze FLASK_APP, falls nötig export FLASK_APP=app.py -# Initialize migrations, if not yet available +# Initialisiere migrations, falls noch nicht vorhanden if [ ! -d migrations ]; then echo "Starting Flask-Migrate..." docker-compose exec steam-manager flask db init fi -# Create migration (only if models have changed) +# Erzeuge Migration (nur wenn sich Modelle geändert haben) docker-compose exec steam-manager flask db migrate -m "Automatic Migration" -# Apply migration +# Wende Migration an docker-compose exec steam-manager flask db upgrade -echo "✅ Database migration completed!" +echo "✅ Database-Migration abgeschlossen!" SCRIPT_END chmod +x ../upgrade.sh @@ -1015,7 +1012,7 @@ cat < templates/base.html {% if current_user.is_authenticated %}