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 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