-
-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathviews.py
67 lines (54 loc) · 2.34 KB
/
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from secrets import token_hex
from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required, user_passes_test
from django.core.cache import cache
from django.http import HttpResponse, JsonResponse
from django.shortcuts import redirect
from django.template import loader
from conreq.core.sign_up.forms import UserForm
from conreq.utils.debug import performance_metrics
# Days, Hours, Minutes, Seconds
INVITE_CODE_DURATION = 7 * 24 * 60 * 60
@performance_metrics()
def invite(request):
# User submitted the registration form
invite_code = request.GET.get("invite_code", "")
invite_key = "invite_code" + invite_code
if request.method == "POST":
# Check if the invite code was valid
if cache.get(invite_key):
# Check if form submission is clean
form = UserForm(request.POST)
if form.is_valid():
# Remove the invite code, then create & login the user
cache.delete(invite_key)
form.save()
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password1")
user = authenticate(username=username, password=password)
login(request, user)
return redirect("base:landing")
# Invite code invalid!
else:
return redirect("base:landing")
# Submission wasn't valid, so return the error codes
template = loader.get_template("registration/sign_up.html")
return HttpResponse(template.render({"form": form}, request))
# User needs to fill out registration form, so check if the invite code exists
if cache.get(invite_key):
template = loader.get_template("registration/sign_up.html")
return HttpResponse(template.render({}, request))
# User tried to use an invalid invite code!
return redirect("base:landing")
@login_required
@user_passes_test(lambda u: u.is_staff)
@performance_metrics()
def generate_invite_code(request):
# Create an invite code that doesn't already exist
while True:
invite_code = token_hex(12)
cache_key = "invite_code" + invite_code
if cache.get(cache_key) is None:
cache.set(cache_key, True, INVITE_CODE_DURATION)
break
return JsonResponse({"invite_code": invite_code})