From dca3d504275a30d16c195b8320773138267bfdb2 Mon Sep 17 00:00:00 2001 From: James2Tulloch <146088090+James2Tulloch@users.noreply.github.com> Date: Fri, 28 Feb 2025 13:37:32 +0000 Subject: [PATCH] Cleaned up views.py monolith --- django_project/django_project/urls.py | 32 +- django_project/myapp/views.py | 372 ----------------------- django_project/myapp/views/__init__.py | 6 + django_project/myapp/views/authviews.py | 57 ++++ django_project/myapp/views/groupviews.py | 113 +++++++ django_project/myapp/views/initview.py | 14 + django_project/myapp/views/postviews.py | 53 ++++ django_project/myapp/views/userviews.py | 140 +++++++++ 8 files changed, 402 insertions(+), 385 deletions(-) delete mode 100644 django_project/myapp/views.py create mode 100644 django_project/myapp/views/__init__.py create mode 100644 django_project/myapp/views/authviews.py create mode 100644 django_project/myapp/views/groupviews.py create mode 100644 django_project/myapp/views/initview.py create mode 100644 django_project/myapp/views/postviews.py create mode 100644 django_project/myapp/views/userviews.py diff --git a/django_project/django_project/urls.py b/django_project/django_project/urls.py index 5702f0f..ae506df 100644 --- a/django_project/django_project/urls.py +++ b/django_project/django_project/urls.py @@ -16,24 +16,30 @@ Including another URLconf """ from django.contrib import admin from django.urls import path, include -from myapp import views from django.conf import settings from django.conf.urls.static import static +from myapp.views.authviews import login_view, logout_view +from myapp.views.userviews import register_view, account_view, delete_account_view +from myapp.views.groupviews import group_list_view, group_create_view, group_update_view, group_delete_view, group_detail_view +from myapp.views.postviews import create_post_view, feed_view +from myapp.views.initview import init_db_view + + urlpatterns = [ path('admin/', admin.site.urls), - path('register/', views.register_view, name='register'), - path('', views.login_view, name='login'), # default view - path('account/', views.account_view, name='account'), - path('delete/', views.delete_account_view, name='delete_account'), - path('logout/', views.logout_view, name='logout'), - path('groups/', views.group_list_view, name='group_list'), - path('groups/create/', views.group_create_view, name='group_create'), - path('groups/<int:group_id>/update/', views.group_update_view, name='group_update'), - path('groups/<int:group_id>/delete/', views.group_delete_view, name='group_delete'), - path('groups/<int:group_id>/', views.group_detail_view, name='group_detail'), - path('post/create/', views.create_post_view, name='create_post'), - path('feed/', views.feed_view, name='feed'), + path('register/', register_view, name='register'), + path('', login_view, name='login'), # default view + path('account/', account_view, name='account'), + path('delete/', delete_account_view, name='delete_account'), + path('logout/', logout_view, name='logout'), + path('groups/', group_list_view, name='group_list'), + path('groups/create/', group_create_view, name='group_create'), + path('groups/<int:group_id>/update/', group_update_view, name='group_update'), + path('groups/<int:group_id>/delete/', group_delete_view, name='group_delete'), + path('groups/<int:group_id>/', group_detail_view, name='group_detail'), + path('post/create/', create_post_view, name='create_post'), + path('feed/', feed_view, name='feed'), ] if settings.DEBUG: diff --git a/django_project/myapp/views.py b/django_project/myapp/views.py deleted file mode 100644 index a3353c6..0000000 --- a/django_project/myapp/views.py +++ /dev/null @@ -1,372 +0,0 @@ -from django.shortcuts import render, redirect -from django.http import JsonResponse -from django.conf import settings -import time -import os -import rust_crud_api # Custom Rust Pyo3 Library 🦀 - -# Dont delete this -db_url = settings.DATABASE_URL - - - -def init_db_view(request): - db_url = os.environ.get("DATABASE_URL") - try: - rust_crud_api.init_db(db_url) - return JsonResponse({"message": "Database initialized"}) - except Exception as e: - return JsonResponse({"error": str(e)}, status=500) - -def register_view(request): - """ - Handles user registration. Expects POST with - 'name', 'email', 'password', 'username', 'studentid', 'startyear', 'endyear', - and optionally 'profilepicture'. - """ - db_url = settings.DATABASE_URL # Make sure DATABASE_URL is defined in your Django settings - context = {} - - if request.method == 'POST': - name = request.POST.get('name', '').strip() - email = request.POST.get('email', '').strip() - password = request.POST.get('password', '').strip() - username = request.POST.get('username', '').strip() - studentid_str = request.POST.get('studentid', '').strip() - startyear_str = request.POST.get('startyear', '').strip() - endyear_str = request.POST.get('endyear', '').strip() - - # 1. Check required fields - if not all([name, email, password, username, studentid_str, startyear_str, endyear_str]): - context['error'] = ( - "Name, email, username, student ID, start year, and end year are required." - ) - return render(request, 'myapp/register.html', context) - - # 2. Try converting studentid, startyear, endyear to int - try: - studentid = int(studentid_str) - except ValueError: - context['error'] = "Student ID must be a number." - return render(request, 'myapp/register.html', context) - - try: - startyear = int(startyear_str) - except ValueError: - context['error'] = "Start year must be a number." - return render(request, 'myapp/register.html', context) - - try: - endyear = int(endyear_str) - except ValueError: - context['error'] = "End year must be a number." - return render(request, 'myapp/register.html', context) - - # 3. Handle profile picture upload (if any) - profilepicture_file = request.FILES.get('profilepicture') - saved_path = None # Default to None if no file is uploaded - - if profilepicture_file: - # Make sure your form <input> matches name="profilepicture" - filename = profilepicture_file.name - - # Decide a directory inside MEDIA_ROOT for profile pics - profile_dir = os.path.join(settings.MEDIA_ROOT, 'profile_pics') - os.makedirs(profile_dir, exist_ok=True) # Ensure the folder exists - - # Build the full filesystem path where we’ll store the file - save_path = os.path.join(profile_dir, filename) - - # Write the file to disk in chunks - with open(save_path, 'wb+') as destination: - for chunk in profilepicture_file.chunks(): - destination.write(chunk) - - # The path we'll store in the DB (so we can serve it at /media/profile_pics/<filename>) - saved_path = f"/media/profile_pics/{filename}" - - # Debug prints to confirm we have the file and path - print("DEBUG: profilepicture_file is:", profilepicture_file) - print("DEBUG: saved_path is:", saved_path) - - # 4. Call Rust to create the user - try: - rust_crud_api.create_user( - db_url, - name, - email, - password, - username, - studentid, - startyear, - endyear, - saved_path - ) - # 5. After successful registration, redirect to login or some other page - return redirect('login') - except Exception as e: - context['error'] = f"An error occurred: {str(e)}" - return render(request, 'myapp/register.html', context) - - # If GET or anything else, just render the registration form - return render(request, 'myapp/register.html', context) - -def login_view(request): - """ - Handles user login by verifying credentials using the Rust extension. - If valid, stores user details in the session and redirects to the account page. - """ - db_url = settings.DATABASE_URL - context = {} - - if request.method == 'POST': - email = request.POST.get('email', '').strip() - password = request.POST.get('password', '').strip() - - if not email or not password: - context['error'] = "Email and password are required." - return render(request, 'myapp/login.html', context) - - try: - # Verify the user's credentials using the Rust extension. - is_valid = rust_crud_api.verify_user(db_url, email, password) - if not is_valid: - context['error'] = "Invalid email or password." - return render(request, 'myapp/login.html', context) - - # Retrieve the user record to store additional info in session. - # (For simplicity, we retrieve all users and select the matching one.) - users = rust_crud_api.get_all_users(db_url) - user = next((u for u in users if u.email.lower() == email.lower()), None) - if not user: - context['error'] = "User not found." - return render(request, 'myapp/login.html', context) - - # Store user information in the session. - request.session['user_id'] = user.id - request.session['user_name'] = user.name - request.session['user_email'] = user.email - - return redirect('feed') - except Exception as e: - context['error'] = f"An error occurred: {str(e)}" - return render(request, 'myapp/login.html', context) - - return render(request, 'myapp/login.html', context) - -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 render(request, 'myapp/account.html', {'user': user}) - except Exception as e: - 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') - -def group_list_view(request): - """ - List all groups. - """ - db_url = settings.DATABASE_URL - context = {} - try: - groups = rust_crud_api.get_all_groups(db_url) - context['groups'] = groups - except Exception as e: - context['error'] = f"An error occurred: {e}" - return render(request, 'myapp/group_list.html', context) - -def group_create_view(request): - """ - Create a new group. - """ - db_url = settings.DATABASE_URL - context = {} - if request.method == 'POST': - group_name = request.POST.get('name', '').strip() - if not group_name: - context['error'] = "Group name is required." - return render(request, 'myapp/group_create.html', context) - try: - rust_crud_api.create_group(db_url, group_name) - return redirect('group_list') - except Exception as e: - context['error'] = f"An error occurred: {e}" - return render(request, 'myapp/group_create.html', context) - return render(request, 'myapp/group_create.html', context) - -def group_update_view(request, group_id): - """ - Update an existing group's name. - """ - db_url = settings.DATABASE_URL - context = {} - try: - group = rust_crud_api.get_group(db_url, int(group_id)) - if group is None: - context['error'] = "Group not found." - return render(request, 'myapp/group_update.html', context) - except Exception as e: - context['error'] = f"Error retrieving group: {e}" - return render(request, 'myapp/group_update.html', context) - - if request.method == 'POST': - new_name = request.POST.get('name', '').strip() - if not new_name: - context['error'] = "New group name is required." - context['group'] = group - return render(request, 'myapp/group_update.html', context) - try: - # This assumes you've implemented an `update_group` function in your Rust library. - rust_crud_api.update_group(db_url, int(group_id), new_name) - return redirect('group_list') - except Exception as e: - context['error'] = f"Error updating group: {e}" - context['group'] = group - return render(request, 'myapp/group_update.html', context) - - context['group'] = group - return render(request, 'myapp/group_update.html', context) - -def group_delete_view(request, group_id): - """ - Delete a group. - """ - db_url = settings.DATABASE_URL - context = {} - if request.method == 'POST': - try: - # This assumes you have a `delete_group` function in your Rust library. - success = rust_crud_api.delete_group(db_url, int(group_id)) - if success: - return redirect('group_list') - else: - context['error'] = "Deletion failed." - except Exception as e: - context['error'] = f"Error deleting group: {e}" - else: - try: - group = rust_crud_api.get_group(db_url, int(group_id)) - context['group'] = group - except Exception as e: - context['error'] = f"Error retrieving group: {e}" - return render(request, 'myapp/group_delete.html', context) - -def group_detail_view(request, group_id): - """ - Fetch a single group's details using the Rust extension and display them. - """ - db_url = settings.DATABASE_URL - context = {} - try: - group = rust_crud_api.get_group(db_url, group_id) - if group is None: - return HttpResponseNotFound("Group not found.") - context['group'] = group - except Exception as e: - context['error'] = f"An error occurred: {e}" - return render(request, 'myapp/group_detail.html', context) - -'''def account_view(request): - """ - Display the account page with user posts. - """ - db_url = settings.DATABASE_URL - user_id = request.session.get('user_id') - if not user_id: - return redirect('login') - - try: - # Retrieve user info, e.g., using get_user (or session data) - users = rust_crud_api.get_all_users(db_url) - user = next((u for u in users if u.id == user_id), None) - # Retrieve posts for this user (public posts) - posts = rust_crud_api.get_user_posts(db_url, user_id) - except Exception as e: - return render(request, 'myapp/account.html', {'error': str(e)}) - - return render(request, 'myapp/account.html', {'user': user, 'posts': posts}) -''' - -def create_post_view(request): - """ - Allow a logged-in user to create a new post. - If a group is specified in the POST data, the post is associated with that group. - """ - db_url = settings.DATABASE_URL - user_id = request.session.get('user_id') - if not user_id: - return redirect('login') - - context = {} - if request.method == 'POST': - content = request.POST.get('content', '').strip() - # Optionally, get a group_id if the post is for a group: - group_id = request.POST.get('group_id') - if group_id: - try: - group_id = int(group_id) - except ValueError: - group_id = None - else: - group_id = None - - if not content: - context['error'] = "Post content cannot be empty." - return render(request, 'myapp/create_post.html', context) - - try: - rust_crud_api.create_post(db_url, user_id, group_id, content) - return redirect('feed') - except Exception as e: - context['error'] = f"Error creating post: {str(e)}" - - return render(request, 'myapp/create_post.html', context) - -def feed_view(request): - """ - Display a global feed of posts. - """ - db_url = settings.DATABASE_URL - try: - posts = rust_crud_api.get_feed(db_url) - except Exception as e: - return render(request, 'myapp/feed.html', {'error': str(e)}) - - return render(request, 'myapp/feed.html', {'posts': posts}) - - diff --git a/django_project/myapp/views/__init__.py b/django_project/myapp/views/__init__.py new file mode 100644 index 0000000..5095669 --- /dev/null +++ b/django_project/myapp/views/__init__.py @@ -0,0 +1,6 @@ +from .authviews import * +from .userviews import * +from .groupviews import * +from .postviews import * +from .initview import * + diff --git a/django_project/myapp/views/authviews.py b/django_project/myapp/views/authviews.py new file mode 100644 index 0000000..cdc6084 --- /dev/null +++ b/django_project/myapp/views/authviews.py @@ -0,0 +1,57 @@ +from django.shortcuts import render, redirect +from django.http import JsonResponse +from django.conf import settings +import time +import os +import rust_crud_api + +db_url = settings.DATABASE_URL + +def login_view(request): + """ + Handles user login by verifying credentials using the Rust extension. + If valid, stores user details in the session and redirects to the account page. + """ + db_url = settings.DATABASE_URL + context = {} + + if request.method == 'POST': + email = request.POST.get('email', '').strip() + password = request.POST.get('password', '').strip() + + if not email or not password: + context['error'] = "Email and password are required." + return render(request, 'myapp/login.html', context) + + try: + # Verify the user's credentials using the Rust extension. + is_valid = rust_crud_api.verify_user(db_url, email, password) + if not is_valid: + context['error'] = "Invalid email or password." + return render(request, 'myapp/login.html', context) + + # Retrieve the user record to store additional info in session. + # (For simplicity, we retrieve all users and select the matching one.) + users = rust_crud_api.get_all_users(db_url) + user = next((u for u in users if u.email.lower() == email.lower()), None) + if not user: + context['error'] = "User not found." + return render(request, 'myapp/login.html', context) + + # Store user information in the session. + request.session['user_id'] = user.id + request.session['user_name'] = user.name + request.session['user_email'] = user.email + + return redirect('feed') + except Exception as e: + context['error'] = f"An error occurred: {str(e)}" + return render(request, 'myapp/login.html', context) + + return render(request, 'myapp/login.html', context) + +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') \ No newline at end of file diff --git a/django_project/myapp/views/groupviews.py b/django_project/myapp/views/groupviews.py new file mode 100644 index 0000000..069ee16 --- /dev/null +++ b/django_project/myapp/views/groupviews.py @@ -0,0 +1,113 @@ +from django.shortcuts import render, redirect +from django.http import JsonResponse +from django.conf import settings +import time +import os +import rust_crud_api + +db_url = settings.DATABASE_URL + +def group_list_view(request): + """ + List all groups. + """ + db_url = settings.DATABASE_URL + context = {} + try: + groups = rust_crud_api.get_all_groups(db_url) + context['groups'] = groups + except Exception as e: + context['error'] = f"An error occurred: {e}" + return render(request, 'myapp/group_list.html', context) + +def group_create_view(request): + """ + Create a new group. + """ + db_url = settings.DATABASE_URL + context = {} + if request.method == 'POST': + group_name = request.POST.get('name', '').strip() + if not group_name: + context['error'] = "Group name is required." + return render(request, 'myapp/group_create.html', context) + try: + rust_crud_api.create_group(db_url, group_name) + return redirect('group_list') + except Exception as e: + context['error'] = f"An error occurred: {e}" + return render(request, 'myapp/group_create.html', context) + return render(request, 'myapp/group_create.html', context) + +def group_update_view(request, group_id): + """ + Update an existing group's name. + """ + db_url = settings.DATABASE_URL + context = {} + try: + group = rust_crud_api.get_group(db_url, int(group_id)) + if group is None: + context['error'] = "Group not found." + return render(request, 'myapp/group_update.html', context) + except Exception as e: + context['error'] = f"Error retrieving group: {e}" + return render(request, 'myapp/group_update.html', context) + + if request.method == 'POST': + new_name = request.POST.get('name', '').strip() + if not new_name: + context['error'] = "New group name is required." + context['group'] = group + return render(request, 'myapp/group_update.html', context) + try: + # This assumes you've implemented an `update_group` function in your Rust library. + rust_crud_api.update_group(db_url, int(group_id), new_name) + return redirect('group_list') + except Exception as e: + context['error'] = f"Error updating group: {e}" + context['group'] = group + return render(request, 'myapp/group_update.html', context) + + context['group'] = group + return render(request, 'myapp/group_update.html', context) + +def group_delete_view(request, group_id): + """ + Delete a group. + """ + db_url = settings.DATABASE_URL + context = {} + if request.method == 'POST': + try: + # This assumes you have a `delete_group` function in your Rust library. + success = rust_crud_api.delete_group(db_url, int(group_id)) + if success: + return redirect('group_list') + else: + context['error'] = "Deletion failed." + except Exception as e: + context['error'] = f"Error deleting group: {e}" + else: + try: + group = rust_crud_api.get_group(db_url, int(group_id)) + context['group'] = group + except Exception as e: + context['error'] = f"Error retrieving group: {e}" + return render(request, 'myapp/group_delete.html', context) + +def group_detail_view(request, group_id): + """ + Fetch a single group's details using the Rust extension and display them. + """ + db_url = settings.DATABASE_URL + context = {} + try: + group = rust_crud_api.get_group(db_url, group_id) + if group is None: + return HttpResponseNotFound("Group not found.") + context['group'] = group + except Exception as e: + context['error'] = f"An error occurred: {e}" + return render(request, 'myapp/group_detail.html', context) + diff --git a/django_project/myapp/views/initview.py b/django_project/myapp/views/initview.py new file mode 100644 index 0000000..7b18a5c --- /dev/null +++ b/django_project/myapp/views/initview.py @@ -0,0 +1,14 @@ +from django.shortcuts import render, redirect +from django.http import JsonResponse +from django.conf import settings +import time +import os +import rust_crud_api + +def init_db_view(request): + db_url = os.environ.get("DATABASE_URL") + try: + rust_crud_api.init_db(db_url) + return JsonResponse({"message": "Database initialized"}) + except Exception as e: + return JsonResponse({"error": str(e)}, status=500) diff --git a/django_project/myapp/views/postviews.py b/django_project/myapp/views/postviews.py new file mode 100644 index 0000000..dc7ce50 --- /dev/null +++ b/django_project/myapp/views/postviews.py @@ -0,0 +1,53 @@ +from django.shortcuts import render, redirect +from django.http import JsonResponse +from django.conf import settings +import time +import os +import rust_crud_api + +def create_post_view(request): + """ + Allow a logged-in user to create a new post. + If a group is specified in the POST data, the post is associated with that group. + """ + db_url = settings.DATABASE_URL + user_id = request.session.get('user_id') + if not user_id: + return redirect('login') + + context = {} + if request.method == 'POST': + content = request.POST.get('content', '').strip() + # Optionally, get a group_id if the post is for a group: + group_id = request.POST.get('group_id') + if group_id: + try: + group_id = int(group_id) + except ValueError: + group_id = None + else: + group_id = None + + if not content: + context['error'] = "Post content cannot be empty." + return render(request, 'myapp/create_post.html', context) + + try: + rust_crud_api.create_post(db_url, user_id, group_id, content) + return redirect('feed') + except Exception as e: + context['error'] = f"Error creating post: {str(e)}" + + return render(request, 'myapp/create_post.html', context) + +def feed_view(request): + """ + Display a global feed of posts. + """ + db_url = settings.DATABASE_URL + try: + posts = rust_crud_api.get_feed(db_url) + except Exception as e: + return render(request, 'myapp/feed.html', {'error': str(e)}) + + return render(request, 'myapp/feed.html', {'posts': posts}) \ No newline at end of file diff --git a/django_project/myapp/views/userviews.py b/django_project/myapp/views/userviews.py new file mode 100644 index 0000000..1efd179 --- /dev/null +++ b/django_project/myapp/views/userviews.py @@ -0,0 +1,140 @@ +from django.shortcuts import render, redirect +from django.http import JsonResponse +from django.conf import settings +import time +import os +import rust_crud_api + +db_url = settings.DATABASE_URL + +def register_view(request): + """ + Handles user registration. Expects POST with + 'name', 'email', 'password', 'username', 'studentid', 'startyear', 'endyear', + and optionally 'profilepicture'. + """ + db_url = settings.DATABASE_URL # Make sure DATABASE_URL is defined in your Django settings + context = {} + + if request.method == 'POST': + name = request.POST.get('name', '').strip() + email = request.POST.get('email', '').strip() + password = request.POST.get('password', '').strip() + username = request.POST.get('username', '').strip() + studentid_str = request.POST.get('studentid', '').strip() + startyear_str = request.POST.get('startyear', '').strip() + endyear_str = request.POST.get('endyear', '').strip() + + # 1. Check required fields + if not all([name, email, password, username, studentid_str, startyear_str, endyear_str]): + context['error'] = ( + "Name, email, username, student ID, start year, and end year are required." + ) + return render(request, 'myapp/register.html', context) + + # 2. Try converting studentid, startyear, endyear to int + try: + studentid = int(studentid_str) + except ValueError: + context['error'] = "Student ID must be a number." + return render(request, 'myapp/register.html', context) + + try: + startyear = int(startyear_str) + except ValueError: + context['error'] = "Start year must be a number." + return render(request, 'myapp/register.html', context) + + try: + endyear = int(endyear_str) + except ValueError: + context['error'] = "End year must be a number." + return render(request, 'myapp/register.html', context) + + # 3. Handle profile picture upload (if any) + profilepicture_file = request.FILES.get('profilepicture') + saved_path = None # Default to None if no file is uploaded + + if profilepicture_file: + # Make sure your form <input> matches name="profilepicture" + filename = profilepicture_file.name + + # Decide a directory inside MEDIA_ROOT for profile pics + profile_dir = os.path.join(settings.MEDIA_ROOT, 'profile_pics') + os.makedirs(profile_dir, exist_ok=True) # Ensure the folder exists + + # Build the full filesystem path where we’ll store the file + save_path = os.path.join(profile_dir, filename) + + # Write the file to disk in chunks + with open(save_path, 'wb+') as destination: + for chunk in profilepicture_file.chunks(): + destination.write(chunk) + + # The path we'll store in the DB (so we can serve it at /media/profile_pics/<filename>) + saved_path = f"/media/profile_pics/{filename}" + + # Debug prints to confirm we have the file and path + print("DEBUG: profilepicture_file is:", profilepicture_file) + print("DEBUG: saved_path is:", saved_path) + + # 4. Call Rust to create the user + try: + rust_crud_api.create_user( + db_url, + name, + email, + password, + username, + studentid, + startyear, + endyear, + saved_path + ) + # 5. After successful registration, redirect to login or some other page + return redirect('login') + except Exception as e: + context['error'] = f"An error occurred: {str(e)}" + return render(request, 'myapp/register.html', context) + + # If GET or anything else, just render the registration form + return render(request, 'myapp/register.html', context) + + + +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 render(request, 'myapp/account.html', {'user': user}) + except Exception as e: + 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') \ No newline at end of file -- GitLab