Free and open source ticket system written in python
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