forgotten password

This commit is contained in:
Martin Quarda 2024-10-17 08:26:38 +02:00
parent 819536523c
commit d33c69941e
3 changed files with 64 additions and 9 deletions

View File

@ -58,6 +58,7 @@ class Profile(models.Model):
first_name = models.CharField(max_length=120) first_name = models.CharField(max_length=120)
last_name = models.CharField(max_length=120) last_name = models.CharField(max_length=120)
phone = models.CharField(max_length=120, null=True, blank=True) phone = models.CharField(max_length=120, null=True, blank=True)
forgotten_password_code = models.CharField(max_length=120, null=True, blank=True)
address = models.CharField(max_length=255, null=True, blank=True) address = models.CharField(max_length=255, null=True, blank=True)
def __str__(self): def __str__(self):

View File

@ -15,6 +15,7 @@ from datetime import date, datetime, timedelta
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from weasyprint import HTML from weasyprint import HTML
from urllib.parse import parse_qs from urllib.parse import parse_qs
import secrets
import requests import requests
import json import json
import glob import glob
@ -70,8 +71,36 @@ def register_user(request):
return HttpResponse('{"success":"Úspěšná registrace!", "redirect":"/#"}', content_type='application/json') return HttpResponse('{"success":"Úspěšná registrace!", "redirect":"/#"}', content_type='application/json')
@csrf_exempt
def forgotten_password(request):
if not request.POST['email']:
return HttpResponse('{"reason":"Email je povinný!"}', status=400, content_type='application/json')
if not request.POST['password1'] or not request.POST['password2']:
return HttpResponse('{"reason":"Heslo je povinné!"}', status=400, content_type='application/json')
if request.POST['password1'] != request.POST['password2']:
return HttpResponse('{"reason":"Hesla se neshodují!"}', status=400, content_type='application/json')
if not request.POST['code']:
return HttpResponse('{"reason":"Kód pro obnovení hesla je povinný!"}', status=400, content_type='application/json')
user = DjangoUser.objects.get(username=request.POST['email'])
if user.profile.forgotten_password_code != request.POST['code']:
return HttpResponse('{"reason":"Špatný kód!"}', status=400, content_type='application/json')
user.set_password(request.POST['password1'])
user.save()
auth_login(request, user)
@csrf_exempt @csrf_exempt
def login(request): def login(request):
if "forgotten_password" in request.POST:
email = request.POST["email"]
user = DjangoUser.objects.get(username=email)
code = secrets.token_urlsafe(10)
user.profile.forgotten_password_code = code
user.profile.save()
mail = EmailMessage("zapomenuté heslo v Alkátor Race", f"""{code}""", "info@alkator.cz", [request.POST["email"]])
mail.send()
return HttpResponse('{"success":"Úspěšně poslán kód pro obnovení hesla uživatele '+ user.email + '", "redirect":"/#forgotten_password"}', content_type='application/json')
else:
try: try:
user = authenticate(request, username=request.POST['email'], password=request.POST['password']) user = authenticate(request, username=request.POST['email'], password=request.POST['password'])
except MultiValueDictKeyError: except MultiValueDictKeyError:
@ -85,6 +114,7 @@ def login(request):
@csrf_exempt @csrf_exempt
def logout(request): def logout(request):
auth_logout(request) auth_logout(request)
return redirect("/#") return redirect("/#")

View File

@ -474,7 +474,7 @@ class Main extends Component {
<input name="email" class="form-control" type="email" /> <input name="email" class="form-control" type="email" />
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="address" class="form-label">Adresa (kvůli fakturaci)</label> <label for="address" class="form-label">Fakturační Adresa</label>
<input type="text" class="form-control" id="address" name="address" /> <input type="text" class="form-control" id="address" name="address" />
</div> </div>
<div class="mb-3"> <div class="mb-3">
@ -493,6 +493,29 @@ class Main extends Component {
</form> </form>
</div> </div>
} }
{this.state.page == "#forgotten_password" &&
<div>
<form id="form" action="/api/login" class="container" onSubmit={(e) => this.onSubmit(e)}>
<div class="mb-3">
<label for="email" class="form-label">Přihlašovací email:</label>
<input name="email" class="form-control" type="email" />
</div>
<div class="mb-3">
<label for="code" class="form-label">Kód pro obnovení hesla:</label>
<input type="password" class="form-control" name="code"/>
</div>
<div class="mb-3">
<label for="password1" class="form-label">Nové heslo:</label>
<input type="password" class="form-control" name="password1"/>
</div>
<div class="mb-3">
<label for="password2" class="form-label">Nové heslo znova:</label>
<input type="password" class="form-control" name="password2"/>
</div>
<button type="submit" class="btn btn-primary">Přihlásit</button>
</form>
</div>
}
{this.state.page == "#login" && {this.state.page == "#login" &&
<div> <div>
<form id="form" action="/api/login" class="container" onSubmit={(e) => this.onSubmit(e)}> <form id="form" action="/api/login" class="container" onSubmit={(e) => this.onSubmit(e)}>
@ -504,6 +527,7 @@ class Main extends Component {
<label for="password" class="form-label">Heslo:</label> <label for="password" class="form-label">Heslo:</label>
<input type="password" class="form-control" name="password"/> <input type="password" class="form-control" name="password"/>
</div> </div>
<button type="submit" name="forgotten_password" class="btn btn-light">Zapomenuté heslo</button>
<button type="submit" class="btn btn-primary">Přihlásit</button> <button type="submit" class="btn btn-primary">Přihlásit</button>
</form> </form>
</div> </div>