diff --git a/accounts/templates/accounts/login.html b/accounts/templates/accounts/login.html new file mode 100644 index 0000000..3583ec1 --- /dev/null +++ b/accounts/templates/accounts/login.html @@ -0,0 +1,46 @@ +{% comment %} Login Page {% endcomment %} + +{% block login %} +

Log In

+
+ {% csrf_token %} {{ form.as_p }} +
+

+ +
+

+ + + {% for message in messages %} +

{{message}}

+ {% endfor %} +
+{% comment %}
+ + + We'll never share your email with anyone else. +
+
+ + +
+
+ + +
+ {% endcomment %} + +

+ New to Mystiq? + Create an account +

+{% endblock %} diff --git a/accounts/templates/accounts/register.html b/accounts/templates/accounts/register.html index 7a58c5e..7a0b9eb 100644 --- a/accounts/templates/accounts/register.html +++ b/accounts/templates/accounts/register.html @@ -82,7 +82,7 @@
-

Already have an account? Sign in.

+

Already have an account? Sign in.

diff --git a/accounts/templates/accounts/success.html b/accounts/templates/accounts/success.html new file mode 100644 index 0000000..4d6969e --- /dev/null +++ b/accounts/templates/accounts/success.html @@ -0,0 +1 @@ + Login Successful! \ No newline at end of file diff --git a/accounts/tests.py b/accounts/tests.py index 2d290cc..ddcd919 100644 --- a/accounts/tests.py +++ b/accounts/tests.py @@ -48,10 +48,11 @@ def register_util(t: TestCase, username: str): def login_util(t: TestCase, c: Client, redirect_to: str): payload = { - "login": t.email, + "email": t.email, "password": t.password, } - resp = c.post(reverse("accounts.login"), payload) + resp = c.post(reverse("accounts:login"), payload) + print(resp.content) t.assertEqual(resp.status_code, 302) t.assertEqual(resp.headers["location"], reverse(redirect_to)) @@ -150,3 +151,34 @@ class RegistrationTest(TestCase): self.assertEqual( b"We do not provide services for this domain yet." in resp.content, True ) + + +# Login Tests + + +class LoginTest(TestCase): + def setUp(self): + self.username = "register_user" + self.password = "2i3j4;1qlk2asdf" + self.email = "register_user@vitap.ac.in" + register_util(t=self, username=self.username) + + def test_register_template_works(self): + """ + Tests if register template renders + """ + resp = self.client.get(reverse("accounts:login")) + self.assertEqual(b"Log" in resp.content, True) + + def test_login_works(self): + """ + Tests if login works + """ + c = Client() + payload = { + "email": self.email, + "password": self.password, + } + resp = c.post(reverse("accounts:login"), payload) + self.assertEqual(resp.status_code, 302) + self.assertEqual(resp.headers["location"], reverse("accounts:success_page")) diff --git a/accounts/urls.py b/accounts/urls.py index 16592e4..1e57f5a 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -22,4 +22,7 @@ app_name = "accounts" urlpatterns = [ path("", views.index, name="accounts.index"), path("register/", views.register, name="register"), + path("login/", views.login_user, name="login"), + path("success/", views.success_page, name="success_page"), + # path("accounts/login/", default_login_url, name="accounts.default_login_url"), ] diff --git a/accounts/views.py b/accounts/views.py index 53e0ce7..579f7ca 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -14,8 +14,8 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from audioop import reverse from multiprocessing import get_context -from django.shortcuts import render # Create your views here. from re import template @@ -26,6 +26,9 @@ from django.contrib.auth import authenticate, login, logout, get_user_model from django.http import HttpResponse, HttpResponseRedirect from django.views.decorators.csrf import csrf_protect from django.core.exceptions import ValidationError +from django.contrib.auth.decorators import login_required +from django.contrib import messages +from django.urls import reverse # Create your views here. from django.http import HttpResponse @@ -35,6 +38,65 @@ def index(request): return HttpResponse("Hello World.") +# @csrf_protect +# def login(request): +# return render(request, 'accounts/login.html') + + +# login page +@csrf_protect +def login_user(request): + def default_login_ctx(): + return { + "title": "Login", + "footer": footer_ctx(), + } + + if request.method == "POST": + email = request.POST["email"] + password = request.POST["password"] + # domain_check = email.split("@") + # check user exists + User = get_user_model() + + if not User.objects.filter(email=email).exists(): + messages.info(request, "Username OR password is incorrect") + return redirect(reverse("accounts:login")) + + username = User.objects.get(email=email).username + user = authenticate(request, username=username, password=password) + + if user is not None: + login(request, user) + # Redirect to a success page. + print(reverse("accounts:success_page")) + if "next" in request.POST: + next = request.POST["next"] + if len(next) > 0: + return redirect(next) + return redirect(reverse("accounts:success_page")) + else: + # Return an 'invalid login' error message. + messages.info(request, "Username OR password is incorrect") + return redirect(reverse("accounts:login")) + else: + context = {} + if "next" in request.GET: + next = request.GET["next"] + context["next"] = next + return render(request, "accounts/login.html", context=context) + + +# success page +@login_required(login_url="/accounts/login/") +@csrf_protect +def success_page(request): + return render(request, "accounts/success.html") + + +# user registratoin + + @csrf_protect def register(request): # response = "You are at the Registration Page." @@ -51,6 +113,14 @@ def register(request): password = request.POST["password"] password_confirm = request.POST["password-confirm"] + # password matching + if password != password_confirm: + context["error"] = { + "title": "Registration Failed", + "reason": "Passwords do not match.", + } + return render(request, "accounts/register.html", status=400, context=context) + # domain verification domain_check = email.split("@") if domain_check[1] != "vitap.ac.in": @@ -62,19 +132,17 @@ def register(request): # email verification User = get_user_model() - if User.objects.filter(email=email).exists(): + if any( + [ + User.objects.filter(email=email).exists(), + User.objects.filter(username=domain_check[0]).exists(), + ] + ): context["error"] = { "title": "Registration Failed", "reason": "This email is already registered.", } return render(request, "accounts/register.html", status=400, context=context) - # password matching - if password != password_confirm: - context["error"] = { - "title": "Registration Failed", - "reason": "Passwords do not match.", - } - return render(request, "accounts/register.html", status=400, context=context) user = get_user_model()( username=domain_check[0],