From 3e14132a7cdeaa1807b4819187ffe33f7c1cb14b Mon Sep 17 00:00:00 2001 From: James2Tulloch <146088090+James2Tulloch@users.noreply.github.com> Date: Fri, 21 Feb 2025 10:04:32 +0000 Subject: [PATCH] User account functionality --- django_project/myapp/account.html | 14 +++ django_project/myapp/delete_account.html | 16 ++++ django_project/myapp/login.html | 21 +++++ django_project/myapp/logout.html | 21 +++++ django_project/myapp/register.html | 21 +++++ django_project/myapp/views.py | 115 +++++++++++++++++++---- 6 files changed, 189 insertions(+), 19 deletions(-) create mode 100644 django_project/myapp/account.html create mode 100644 django_project/myapp/delete_account.html create mode 100644 django_project/myapp/login.html create mode 100644 django_project/myapp/logout.html create mode 100644 django_project/myapp/register.html diff --git a/django_project/myapp/account.html b/django_project/myapp/account.html new file mode 100644 index 0000000..df2a921 --- /dev/null +++ b/django_project/myapp/account.html @@ -0,0 +1,14 @@ +<!DOCTYPE html> +<html> +<head> + <title>Account</title> +</head> +<body> + <h1>Account Page</h1> + <p>Username: {{ user.username }}</p> + <p>Email: {{ user.email }}</p> + <p><a href="{% url 'delete_account' %}">Delete Account</a></p> + <p><a href="{% url 'logout' %}">Logout</a></p> +</body> +</html> + diff --git a/django_project/myapp/delete_account.html b/django_project/myapp/delete_account.html new file mode 100644 index 0000000..2694df1 --- /dev/null +++ b/django_project/myapp/delete_account.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html> +<head> + <title>Delete Account</title> +</head> +<body> + <h1>Delete Account</h1> + <p>Are you sure you want to delete your account? This action cannot be undone.</p> + <form method="post"> + {% csrf_token %} + <button type="submit">Yes, delete my account</button> + </form> + <p><a href="{% url 'account' %}">Cancel</a></p> +</body> +</html> + diff --git a/django_project/myapp/login.html b/django_project/myapp/login.html new file mode 100644 index 0000000..36e1ee9 --- /dev/null +++ b/django_project/myapp/login.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html> +<head> + <title>Login</title> +</head> +<body> + <h1>Login</h1> + {% if messages %} + {% for message in messages %} + <p>{{ message }}</p> + {% endfor %} + {% endif %} + <form method="post"> + {% csrf_token %} + {{ form.as_p }} + <button type="submit">Login</button> + </form> + <p>Don't have an account? <a href="{% url 'register' %}">Register here</a>.</p> +</body> +</html> + diff --git a/django_project/myapp/logout.html b/django_project/myapp/logout.html new file mode 100644 index 0000000..1c67009 --- /dev/null +++ b/django_project/myapp/logout.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Logged Out</title> + <style> + body { font-family: Arial, sans-serif; margin: 2em; } + a { color: blue; text-decoration: none; } + a:hover { text-decoration: underline; } + </style> +</head> +<body> + <h1>You have been logged out.</h1> + <p> + Thank you for using our service. + <br> + <a href="{% url 'login' %}">Click here to log in again</a>. + </p> +</body> +</html> + diff --git a/django_project/myapp/register.html b/django_project/myapp/register.html new file mode 100644 index 0000000..35a9694 --- /dev/null +++ b/django_project/myapp/register.html @@ -0,0 +1,21 @@ +<!DOCTYPE html> +<html> +<head> + <title>Register</title> +</head> +<body> + <h1>Register</h1> + {% if messages %} + {% for message in messages %} + <p>{{ message }}</p> + {% endfor %} + {% endif %} + <form method="post"> + {% csrf_token %} + {{ form.as_p }} + <button type="submit">Register</button> + </form> + <p>Already have an account? <a href="{% url 'login' %}">Login here</a>.</p> +</body> +</html> + diff --git a/django_project/myapp/views.py b/django_project/myapp/views.py index c2bfafc..9981e44 100644 --- a/django_project/myapp/views.py +++ b/django_project/myapp/views.py @@ -1,5 +1,6 @@ -from django.shortcuts import render +from django.shortcuts import render, redirect from django.http import JsonResponse +from django.conf import settings import os import rust_crud_api # This is the module we built @@ -11,27 +12,103 @@ def init_db_view(request): except Exception as e: return JsonResponse({"error": str(e)}, status=500) -def create_user_view(request): - db_url = os.environ.get("DATABASE_URL") - name = request.POST.get("name", "Alice") - email = request.POST.get("email", "alice@example.com") - try: - rust_crud_api.create_user(db_url, name, email) - return JsonResponse({"message": "User created"}) - except Exception as e: - return JsonResponse({"error": str(e)}, status=500) +def register_view(request): + """ + Register a new user using the Rust extension. + Expects POST with 'name' and 'email'. + After registration, it simulates a login by storing the user's info in session. + """ + db_url = settings.DATABASE_URL + if request.method == 'POST': + name = request.POST.get('name') + email = request.POST.get('email') + if not name or not email: + return JsonResponse({'error': 'Name and email are required.'}, status=400) + try: + # Create user in the database via the Rust extension. + rust_crud_api.create_user(db_url, name, email) + # Since our extension does not return the new user’s id directly, + # we retrieve all users and find the one with the matching email. + users = rust_crud_api.get_all_users(db_url) + user = next((u for u in users if u.email == email), None) + if user is None: + return JsonResponse({'error': 'Registration failed.'}, status=500) + # Simulate login by storing user info in session. + request.session['user_id'] = user.id + request.session['user_email'] = user.email + request.session['user_name'] = user.name + return redirect('account') + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + return render(request, 'myapp/register.html') -def get_user_view(request, user_id): - db_url = os.environ.get("DATABASE_URL") + +def login_view(request): + """ + Login a user by looking up their email in the database. + (Since our Rust extension doesn't handle passwords, we simply check if the email exists.) + """ + db_url = settings.DATABASE_URL + if request.method == 'POST': + email = request.POST.get('email') + if not email: + return JsonResponse({'error': 'Email is required.'}, status=400) + try: + # Retrieve all users and try to find one with the given email. + users = rust_crud_api.get_all_users(db_url) + user = next((u for u in users if u.email == email), None) + if user is None: + return JsonResponse({'error': 'User not found.'}, status=404) + # Simulate login by storing user info in session. + request.session['user_id'] = user.id + request.session['user_email'] = user.email + request.session['user_name'] = user.name + return redirect('account') + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + return render(request, 'myapp/login.html') + + +def account_view(request): + """ + Display the account page for the logged-in user. + """ + user_id = request.session.get('user_id') + if not user_id: + return redirect('login') + db_url = settings.DATABASE_URL try: user = rust_crud_api.get_user(db_url, int(user_id)) if user is None: - return JsonResponse({"error": "User not found"}, status=404) - return JsonResponse({ - "id": user.id, - "name": user.name, - "email": user.email - }) + return JsonResponse({'error': 'User not found.'}, status=404) + return render(request, 'myapp/account.html', {'user': user}) except Exception as e: - return JsonResponse({"error": str(e)}, status=500) + return JsonResponse({'error': str(e)}, status=500) + + +def delete_account_view(request): + """ + Delete the account of the logged-in user. + """ + user_id = request.session.get('user_id') + if not user_id: + return redirect('login') + db_url = settings.DATABASE_URL + if request.method == 'POST': + try: + success = rust_crud_api.delete_user(db_url, int(user_id)) + if success: + request.session.flush() # Clear the session after deletion. + return redirect('register') + else: + return JsonResponse({'error': 'Account deletion failed.'}, status=500) + except Exception as e: + return JsonResponse({'error': str(e)}, status=500) + return render(request, 'myapp/delete_account.html') + +def logout_view(request): + # Clear all session data to log out the user. + request.session.flush() + # Optionally, render a confirmation page or redirect to login. + return render(request, 'myapp/logout.html') -- GitLab