Free and open source ticket system written in python
at main 146 lines 5.1 kB view raw
1from django.shortcuts import render, redirect 2from django.contrib.auth import logout, login 3from .forms import UserChangeForm, RegisterForm, AccountFinishForm 4from django.contrib.auth.forms import AuthenticationForm 5from .models import PawUser, GoogleSSOUser 6from django.utils import translation 7from django.conf import settings 8from django.contrib.auth.decorators import login_required 9from .utils.google_sso import GoogleSSO 10 11 12@login_required 13def home_view(request): 14 15 user_language = request.user.language 16 translation.activate(user_language) 17 res = redirect("all_tickets") 18 res.set_cookie(settings.LANGUAGE_COOKIE_NAME, user_language) 19 return res 20 21 22def register_view(request): 23 24 if request.method == "POST": 25 form = RegisterForm(request.POST) 26 if form.is_valid(): 27 PawUser.objects.create_user( 28 username=form.cleaned_data.get("username"), 29 email=form.cleaned_data.get("email"), 30 password=form.cleaned_data.get("password") 31 ) 32 return redirect("login") 33 else: 34 form = RegisterForm() 35 36 return render(request, "core/register.html", {"form": form}) 37 38 39def login_view(request): 40 41 auth_url = None 42 43 if settings.GOOGLE_OAUTH_ENABLED: 44 google_sso = GoogleSSO() 45 auth_url, state = google_sso.flow.authorization_url(prompt="consent") 46 47 # Save data on Session 48 if not request.session.session_key: 49 request.session.create() 50 request.session.set_expiry(60 * 1000) 51 request.session["sso_state"] = state 52 # request.session["sso_next_url"] = next_path 53 request.session.save() 54 55 if request.method == "POST": 56 form = AuthenticationForm(request=request, data=request.POST) 57 if form.is_valid(): 58 login(request, form.get_user()) 59 return redirect("home") 60 61 else: 62 form = AuthenticationForm() 63 64 return render(request, "core/login.html", {"form": form, "google_sso_enabled": settings.GOOGLE_OAUTH_ENABLED, "google_sso_auth_url": auth_url}) 65 66 67def google_callback_view(request): 68 69 if not settings.GOOGLE_OAUTH_ENABLED: 70 return redirect("login") 71 72 if request.method == "POST" and request.user.is_authenticated and "account_finish" in request.POST: 73 form = AccountFinishForm(request.POST) 74 if form.is_valid(): 75 request.user.username = form.cleaned_data["username"] 76 request.user.save() 77 return redirect("home") 78 else: 79 return render(request, "core/account_finish.html", {"form": form}) 80 else: 81 google_sso = GoogleSSO() 82 state = request.GET.get("state") 83 code = request.GET.get("code") 84 85 if state != request.session.get("sso_state"): 86 return redirect("login") 87 88 try: 89 google_sso.flow.fetch_token(code=code) 90 user_info = google_sso.get_user_info() 91 except Exception: 92 return redirect("login") 93 94 user, created = PawUser.objects.get_or_create(email=user_info["email"], defaults={"username": user_info["email"]}) 95 96 if created: 97 GoogleSSOUser.objects.create(paw_user=user, google_id=user_info["id"]) 98 99 login(request, user) 100 if created or user.username == user.email: 101 form = AccountFinishForm() 102 return render(request, "core/account_finish.html", {"form": form}) 103 104 return redirect("home") 105 106 107def logout_view(request): 108 logout(request) 109 return redirect("login") 110 111 112@login_required 113def settings_view(request): 114 changed_user_language = False 115 116 if request.method == "POST": 117 form = UserChangeForm(request.POST, request.FILES) 118 if form.is_valid(): 119 120 if form.cleaned_data["language"] != request.user.language: 121 translation.activate(form.cleaned_data["language"]) 122 changed_user_language = True 123 124 if not hasattr(request.user, 'googlessouser'): 125 request.user.email = form.cleaned_data["email"] 126 127 request.user.language = form.cleaned_data["language"] 128 request.user.telegram_username = form.cleaned_data["telegram_username"] 129 request.user.use_darkmode = form.cleaned_data["use_darkmode"] 130 request.user.receive_email_notifications = form.cleaned_data["receive_email_notifications"] 131 if form.cleaned_data["profile_picture"]: 132 request.user.profile_picture = form.cleaned_data["profile_picture"] 133 request.user.save() 134 else: 135 form = UserChangeForm(initial={ 136 "email": request.user.email, 137 "language": request.user.language, 138 "telegram_username": request.user.telegram_username, 139 "use_darkmode": request.user.use_darkmode, 140 "receive_email_notifications": request.user.receive_email_notifications 141 }) 142 143 res = render(request, "core/settings.html", {"form": form}) 144 if changed_user_language: 145 res.set_cookie(settings.LANGUAGE_COOKIE_NAME, request.user.language) 146 return res