Commit 6ec35b41 authored by impfundev's avatar impfundev

feat: forgot password

parent 288fedef
...@@ -48,3 +48,30 @@ class SignUpForm(forms.Form): ...@@ -48,3 +48,30 @@ class SignUpForm(forms.Form):
} }
), ),
) )
class ForgotPassword(forms.Form):
email = forms.EmailField(
widget=forms.TextInput(
attrs={
"placeholder": "Email",
"class": "form-control",
}
)
)
old_password = forms.CharField(
widget=forms.PasswordInput(
attrs={
"placeholder": "Old Password",
"class": "form-control",
}
)
)
new_password = forms.CharField(
widget=forms.PasswordInput(
attrs={
"placeholder": "New Password",
"class": "form-control",
}
)
)
{% extends "base.html" %} {% block content %}
<main
style="min-height: 100vh"
class="w-100 h-100 bg-body-secondary d-flex justify-content-center align-items-center"
>
<form
action="/auth/forgot-password/"
method="POST"
class="card w-25 p-4 rounded-4 shadow"
>
<h1 class="h3 text-center mb-4">Forgot Password</h1>
{% csrf_token %} {% for field in form %}
<div class="form-outline form-white mb-3">{{ field }}</div>
{% endfor %}
<button
type="submit"
id="submit-login"
class="btn btn-primary my-2 rounded-5"
>
Save Changes
</button>
<div class="d-flex flex-column align-items-center">
{% if message %}
<p class="alert alert-success small" role="alert">
<i class="bi bi-check2-circle"></i> {{ message }}
</p>
{% endif %} {% if error_message %}
<p class="alert alert-warning small" role="alert">
<i class="bi bi-exclamation-circle"></i> {{ error_message }}
</p>
{% endif %}
<p class="my-2">
Back to <a href="/auth/login">Login</a> or
<a href="/auth/sign-up">Sign Up</a>
</p>
</div>
</form>
</main>
{% endblock content %}
...@@ -19,14 +19,17 @@ ...@@ -19,14 +19,17 @@
> >
Login Login
</button> </button>
{% if error_message %} <div class="d-flex flex-column align-items-center">
<p class="alert alert-warning small" role="alert"> {% if error_message %}
<i class="bi bi-exclamation-circle"></i> {{ error_message }} <p class="alert alert-warning small" role="alert">
</p> <i class="bi bi-exclamation-circle"></i> {{ error_message }}
{% endif %} </p>
<p class="my-2"> {% endif %}
Don't have an account? <a href="/auth/sign-up">Sign Up</a> <p class="my-2">
</p> Don't have an account? <a href="/auth/sign-up">Sign Up</a>
</p>
<a href="/auth/forgot-password/" class="my-2">Forgot password</a>
</div>
</form> </form>
</main> </main>
{% endblock content %} {% endblock content %}
...@@ -19,12 +19,16 @@ ...@@ -19,12 +19,16 @@
> >
Login Login
</button> </button>
{% if error_message %} <div class="d-flex flex-column align-items-center">
<p class="alert alert-warning small" role="alert"> {% if error_message %}
<i class="bi bi-exclamation-circle"></i> {{ error_message }} <p class="alert alert-warning small" role="alert">
</p> <i class="bi bi-exclamation-circle"></i> {{ error_message }}
{% endif %} </p>
<p class="my-2">Already have an account? <a href="/auth/login">Login</a></p> {% endif %}
<p class="my-2">
Already have an account? <a href="/auth/login">Login</a>
</p>
</div>
</form> </form>
</main> </main>
{% endblock content %} {% endblock content %}
from django.urls import path from django.urls import path
from authentications.views import login, sign_up, logout from authentications.views import AuthView
urlpatterns = [ urlpatterns = [
path("login/", login, name="login"), path("login/", AuthView.login, name="login"),
path("sign-up/", sign_up, name="sign_up"), path("sign-up/", AuthView.sign_up, name="sign_up"),
path("logout/", logout, name="logout"), path("logout/", AuthView.logout, name="logout"),
path("forgot-password/", AuthView.forgot_password, name="forgot_password"),
] ]
from django.views.generic import TemplateView
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.shortcuts import render from django.shortcuts import render
from authentications.forms import LoginForm, SignUpForm from authentications.forms import LoginForm, SignUpForm, ForgotPassword
from librarians.models import Librarians, LoginHistory from librarians.models import Librarians, LoginHistory
from authentications.utils import create_auth_session from authentications.utils import create_auth_session
def login(request): class AuthView(TemplateView):
librarian = Librarians.objects.all() def login(request):
context = {"form": LoginForm()} librarian = Librarians.objects.all()
if request.method == "POST": context = {"form": LoginForm()}
form = LoginForm(request.POST) if request.method == "POST":
if form.is_valid(): form = LoginForm(request.POST)
account = librarian.filter( if form.is_valid():
email=form.data["email"], password=form.data["password"] account = librarian.filter(
) email=form.data["email"], password=form.data["password"]
if account.exists():
librarian = librarian.get(
email=form.data["email"],
password=form.data["password"],
) )
payload = {
"librarian_id": librarian.id,
"name": librarian.name,
"email": librarian.email,
}
create_auth_session(request, payload)
LoginHistory.objects.create(librarian_id=librarian.id)
return HttpResponseRedirect("/dashboard/")
else:
context["error_message"] = (
"Email or Password invalid, please enter valid data or Sign Up first"
)
else:
form = LoginForm()
return render(request, "login.html", context) if account.exists():
librarian = librarian.get(
email=form.data["email"],
password=form.data["password"],
)
payload = {
"librarian_id": librarian.id,
"name": librarian.name,
"email": librarian.email,
}
create_auth_session(request, payload)
def sign_up(request): LoginHistory.objects.create(librarian_id=librarian.id)
librarian = Librarians.objects.all() return HttpResponseRedirect("/dashboard/")
context = {"form": SignUpForm()} else:
if request.method == "POST": context["error_message"] = (
form = SignUpForm(request.POST) "Email or Password invalid, please enter valid data or Sign Up first"
if form.is_valid(): )
is_email = librarian.filter(email=form.data["email"]) else:
form = LoginForm()
if is_email.exists(): return render(request, "login.html", context)
context["error_message"] = (
"Email was already exist, please use different email" def sign_up(request):
) librarian = Librarians.objects.all()
else: context = {"form": SignUpForm()}
librarian.create( if request.method == "POST":
name=form.data["name"], form = SignUpForm(request.POST)
email=form.data["email"], if form.is_valid():
password=form.data["password"], is_email = librarian.filter(email=form.data["email"])
)
new_librarian = librarian.get(
name=form.data["name"],
email=form.data["email"],
password=form.data["password"],
)
payload = { if is_email.exists():
"librarian_id": new_librarian.id, context["error_message"] = (
"name": new_librarian.name, "Email was already exist, please use different email"
"email": new_librarian.email, )
} else:
create_auth_session(request, payload) librarian.create(
name=form.data["name"],
email=form.data["email"],
password=form.data["password"],
)
new_librarian = librarian.get(
name=form.data["name"],
email=form.data["email"],
password=form.data["password"],
)
LoginHistory.objects.create(librarian_id=new_librarian.id) payload = {
return HttpResponseRedirect("/dashboard/") "librarian_id": new_librarian.id,
else: "name": new_librarian.name,
form = SignUpForm() "email": new_librarian.email,
}
create_auth_session(request, payload)
return render(request, "sign_up.html", context) LoginHistory.objects.create(librarian_id=new_librarian.id)
return HttpResponseRedirect("/dashboard/")
else:
form = SignUpForm()
return render(request, "sign_up.html", context)
def logout(request):
del request.session["auth_session"]
return HttpResponseRedirect("/auth/login")
def forgot_password(request):
librarian = Librarians.objects.all()
context = {"form": ForgotPassword()}
if request.method == "POST":
form = ForgotPassword(request.POST)
if form.is_valid:
account = librarian.filter(
email=form.data["email"], password=form.data["old_password"]
)
if account.exists():
if form.data["old_password"] == form.data["new_password"]:
context["error_message"] = (
"Old and New password cannot be same!"
)
else:
try:
librarian.update(password=form.data["new_password"])
context["message"] = (
"Change password success, now lets try login!"
)
except:
context["error_message"] = (
"Change password failed, please try again later."
)
else:
context["error_message"] = (
"Account with email and old password not found, please enter valid data!"
)
def logout(request): return render(request, "forgot-password.html", context)
del request.session["auth_session"]
return HttpResponseRedirect("/auth/login")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment