Free and open source ticket system written in python
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 5edd527aaba4e33b526f04f58d0db2b8a4ef278e 144 lines 5.0 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 if settings.GOOGLE_OAUTH_ENABLED: 42 google_sso = GoogleSSO() 43 auth_url, state = google_sso.flow.authorization_url(prompt="consent") 44 45 # Save data on Session 46 if not request.session.session_key: 47 request.session.create() 48 request.session.set_expiry(60 * 1000) 49 request.session["sso_state"] = state 50 # request.session["sso_next_url"] = next_path 51 request.session.save() 52 53 if request.method == "POST": 54 form = AuthenticationForm(request=request, data=request.POST) 55 if form.is_valid(): 56 login(request, form.get_user()) 57 return redirect("home") 58 59 else: 60 form = AuthenticationForm() 61 62 return render(request, "core/login.html", {"form": form, "google_sso_enabled": settings.GOOGLE_OAUTH_ENABLED, "google_sso_auth_url": auth_url}) 63 64 65def google_callback_view(request): 66 67 if not settings.GOOGLE_OAUTH_ENABLED: 68 return redirect("login") 69 70 if request.method == "POST" and request.user.is_authenticated and "account_finish" in request.POST: 71 form = AccountFinishForm(request.POST) 72 if form.is_valid(): 73 request.user.username = form.cleaned_data["username"] 74 request.user.save() 75 return redirect("home") 76 else: 77 return render(request, "core/account_finish.html", {"form": form}) 78 else: 79 google_sso = GoogleSSO() 80 state = request.GET.get("state") 81 code = request.GET.get("code") 82 83 if state != request.session.get("sso_state"): 84 return redirect("login") 85 86 try: 87 google_sso.flow.fetch_token(code=code) 88 user_info = google_sso.get_user_info() 89 except Exception: 90 return redirect("login") 91 92 user, created = PawUser.objects.get_or_create(email=user_info["email"], defaults={"username": user_info["email"]}) 93 94 if created: 95 GoogleSSOUser.objects.create(paw_user=user, google_id=user_info["id"]) 96 97 login(request, user) 98 if created or user.username == user.email: 99 form = AccountFinishForm() 100 return render(request, "core/account_finish.html", {"form": form}) 101 102 return redirect("home") 103 104 105def logout_view(request): 106 logout(request) 107 return redirect("login") 108 109 110@login_required 111def settings_view(request): 112 changed_user_language = False 113 114 if request.method == "POST": 115 form = UserChangeForm(request.POST, request.FILES) 116 if form.is_valid(): 117 118 if form.cleaned_data["language"] != request.user.language: 119 translation.activate(form.cleaned_data["language"]) 120 changed_user_language = True 121 122 if not hasattr(request.user, 'googlessouser'): 123 request.user.email = form.cleaned_data["email"] 124 125 request.user.language = form.cleaned_data["language"] 126 request.user.telegram_username = form.cleaned_data["telegram_username"] 127 request.user.use_darkmode = form.cleaned_data["use_darkmode"] 128 request.user.receive_email_notifications = form.cleaned_data["receive_email_notifications"] 129 if form.cleaned_data["profile_picture"]: 130 request.user.profile_picture = form.cleaned_data["profile_picture"] 131 request.user.save() 132 else: 133 form = UserChangeForm(initial={ 134 "email": request.user.email, 135 "language": request.user.language, 136 "telegram_username": request.user.telegram_username, 137 "use_darkmode": request.user.use_darkmode, 138 "receive_email_notifications": request.user.receive_email_notifications 139 }) 140 141 res = render(request, "core/settings.html", {"form": form}) 142 if changed_user_language: 143 res.set_cookie(settings.LANGUAGE_COOKIE_NAME, request.user.language) 144 return res