Free and open source ticket system written in python
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147from django.shortcuts import render, redirectfrom django.contrib.auth import logout, loginfrom .forms import UserChangeForm, RegisterForm, AccountFinishFormfrom django.contrib.auth.forms import AuthenticationFormfrom .models import PawUser, GoogleSSOUserfrom django.utils import translationfrom django.conf import settingsfrom django.contrib.auth.decorators import login_requiredfrom .utils.google_sso import GoogleSSO
@login_requireddef home_view(request):
user_language = request.user.language translation.activate(user_language) res = redirect("all_tickets") res.set_cookie(settings.LANGUAGE_COOKIE_NAME, user_language) return res
def register_view(request):
if request.method == "POST": form = RegisterForm(request.POST) if form.is_valid(): PawUser.objects.create_user( username=form.cleaned_data.get("username"), email=form.cleaned_data.get("email"), password=form.cleaned_data.get("password") ) return redirect("login") else: form = RegisterForm()
return render(request, "core/register.html", {"form": form})
def login_view(request):
auth_url = None
if settings.GOOGLE_OAUTH_ENABLED: google_sso = GoogleSSO() auth_url, state = google_sso.flow.authorization_url(prompt="consent")
# Save data on Session if not request.session.session_key: request.session.create() request.session.set_expiry(60 * 1000) request.session["sso_state"] = state # request.session["sso_next_url"] = next_path request.session.save()
if request.method == "POST": form = AuthenticationForm(request=request, data=request.POST) if form.is_valid(): login(request, form.get_user()) return redirect("home")
else: form = AuthenticationForm()
return render(request, "core/login.html", {"form": form, "google_sso_enabled": settings.GOOGLE_OAUTH_ENABLED, "google_sso_auth_url": auth_url})
def google_callback_view(request):
if not settings.GOOGLE_OAUTH_ENABLED: return redirect("login")
if request.method == "POST" and request.user.is_authenticated and "account_finish" in request.POST: form = AccountFinishForm(request.POST) if form.is_valid(): request.user.username = form.cleaned_data["username"] request.user.save() return redirect("home") else: return render(request, "core/account_finish.html", {"form": form}) else: google_sso = GoogleSSO() state = request.GET.get("state") code = request.GET.get("code")
if state != request.session.get("sso_state"): return redirect("login")
try: google_sso.flow.fetch_token(code=code) user_info = google_sso.get_user_info() except Exception: return redirect("login")
user, created = PawUser.objects.get_or_create(email=user_info["email"], defaults={"username": user_info["email"]})
if created: GoogleSSOUser.objects.create(paw_user=user, google_id=user_info["id"])
login(request, user) if created or user.username == user.email: form = AccountFinishForm() return render(request, "core/account_finish.html", {"form": form})
return redirect("home")
def logout_view(request): logout(request) return redirect("login")
@login_requireddef settings_view(request): changed_user_language = False
if request.method == "POST": form = UserChangeForm(request.POST, request.FILES) if form.is_valid():
if form.cleaned_data["language"] != request.user.language: translation.activate(form.cleaned_data["language"]) changed_user_language = True
if not hasattr(request.user, 'googlessouser'): request.user.email = form.cleaned_data["email"]
request.user.language = form.cleaned_data["language"] request.user.telegram_username = form.cleaned_data["telegram_username"] request.user.use_darkmode = form.cleaned_data["use_darkmode"] request.user.receive_email_notifications = form.cleaned_data["receive_email_notifications"] if form.cleaned_data["profile_picture"]: request.user.profile_picture = form.cleaned_data["profile_picture"] request.user.save() else: form = UserChangeForm(initial={ "email": request.user.email, "language": request.user.language, "telegram_username": request.user.telegram_username, "use_darkmode": request.user.use_darkmode, "receive_email_notifications": request.user.receive_email_notifications })
res = render(request, "core/settings.html", {"form": form}) if changed_user_language: res.set_cookie(settings.LANGUAGE_COOKIE_NAME, request.user.language) return res