121 lines
3.0 KiB
Python
121 lines
3.0 KiB
Python
#!/usr/bin/env python3
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
|
|
import django
|
|
|
|
|
|
def _env(name: str, default: str = "") -> str:
|
|
value = os.getenv(name, default)
|
|
return value.strip() if isinstance(value, str) else ""
|
|
|
|
|
|
def _setup_django() -> None:
|
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.main")
|
|
django.setup()
|
|
|
|
|
|
def _set_default_gym(user) -> None:
|
|
try:
|
|
from wger.gym.models import GymConfig
|
|
except Exception:
|
|
return
|
|
|
|
try:
|
|
config = GymConfig.objects.first()
|
|
except Exception:
|
|
return
|
|
|
|
if not config or not getattr(config, "default_gym", None):
|
|
return
|
|
|
|
profile = getattr(user, "userprofile", None)
|
|
if not profile or getattr(profile, "gym", None):
|
|
return
|
|
|
|
profile.gym = config.default_gym
|
|
profile.save()
|
|
|
|
|
|
def _ensure_profile(user) -> None:
|
|
profile = getattr(user, "userprofile", None)
|
|
if not profile:
|
|
return
|
|
if hasattr(profile, "email_verified") and not profile.email_verified:
|
|
profile.email_verified = True
|
|
if hasattr(profile, "is_temporary") and profile.is_temporary:
|
|
profile.is_temporary = False
|
|
profile.save()
|
|
|
|
|
|
def _ensure_admin(username: str, password: str, email: str) -> None:
|
|
from django.contrib.auth.models import User
|
|
|
|
if not username or not password:
|
|
raise RuntimeError("admin username/password missing")
|
|
|
|
user, created = User.objects.get_or_create(username=username)
|
|
if created:
|
|
user.is_active = True
|
|
if not user.is_staff:
|
|
user.is_staff = True
|
|
if email:
|
|
user.email = email
|
|
user.set_password(password)
|
|
user.save()
|
|
|
|
_ensure_profile(user)
|
|
_set_default_gym(user)
|
|
print(f"ensured admin user {username}")
|
|
|
|
|
|
def _ensure_user(username: str, password: str, email: str) -> None:
|
|
from django.contrib.auth.models import User
|
|
|
|
if not username or not password:
|
|
raise RuntimeError("username/password missing")
|
|
|
|
user, created = User.objects.get_or_create(username=username)
|
|
if created:
|
|
user.is_active = True
|
|
if email and user.email != email:
|
|
user.email = email
|
|
user.set_password(password)
|
|
user.save()
|
|
|
|
_ensure_profile(user)
|
|
_set_default_gym(user)
|
|
action = "created" if created else "updated"
|
|
print(f"{action} user {username}")
|
|
|
|
|
|
def main() -> int:
|
|
admin_user = _env("WGER_ADMIN_USERNAME")
|
|
admin_password = _env("WGER_ADMIN_PASSWORD")
|
|
admin_email = _env("WGER_ADMIN_EMAIL")
|
|
|
|
username = _env("WGER_USERNAME") or _env("ONLY_USERNAME")
|
|
password = _env("WGER_PASSWORD")
|
|
email = _env("WGER_EMAIL")
|
|
|
|
if not any([admin_user and admin_password, username and password]):
|
|
print("no admin or user payload provided; exiting")
|
|
return 0
|
|
|
|
_setup_django()
|
|
|
|
if admin_user and admin_password:
|
|
_ensure_admin(admin_user, admin_password, admin_email)
|
|
|
|
if username and password:
|
|
_ensure_user(username, password, email)
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|