diff --git a/app/accounts/urls.py b/app/accounts/urls.py index 1af758e..12a91a9 100644 --- a/app/accounts/urls.py +++ b/app/accounts/urls.py @@ -1,10 +1,12 @@ from django.urls import path, include #from .views import SignupPageView -from accounts.views import SignupPageView +from accounts.views import AccountDeleteView, SettingsView, SignupPageView urlpatterns = [ + path('delete/', AccountDeleteView.as_view(), name='account-delete'), + path('settings/', SettingsView, name='settings'), path("signup/", SignupPageView.as_view(), name="signup"), path("", include("allauth.urls")), ] \ No newline at end of file diff --git a/app/accounts/views.py b/app/accounts/views.py index 368ed5c..698a3d9 100644 --- a/app/accounts/views.py +++ b/app/accounts/views.py @@ -1,12 +1,61 @@ import datetime from django.urls import reverse_lazy -from django.views import generic +from django.views.generic import CreateView, DeleteView +from django.shortcuts import render, redirect +from django.contrib import messages +from django.contrib.auth import login +from django.contrib.auth.forms import AuthenticationForm +from django.contrib.auth.mixins import LoginRequiredMixin from .forms import CustomUserCreationForm -from organizations.models import OrganizationInvitation +from .models import CustomUser +from organizations.models import Organization, OrganizationInvitation +from campaign.models import Campaign -class SignupPageView(generic.CreateView): +class AccountDeleteView(LoginRequiredMixin, DeleteView): + model = CustomUser + template_name = 'account/account_confirm_delete.html' + success_url = reverse_lazy('home') + + def get_object(self, queryset=None): + # Ensure that only the logged-in user can delete their account + return self.request.user + + def delete(self, request, *args, **kwargs): + # Optionally, add a message for the user or perform extra cleanup + messages.success(request, "Your account has been deleted successfully.") + return super().delete(request, *args, **kwargs) + + +def DashboardView(request): + """ + Display a dashboard overview for the logged-in account. + If the user is not authenticated, display the login form. + """ + if request.user.is_authenticated: + context = { + 'user': request.user, + 'member_campaigns': Campaign.objects.filter(users=request.user), + 'owner_campaigns': Campaign.objects.filter(owner=request.user), + 'campaigns': Campaign.objects.all() if request.user.is_superuser else context['member_campaigns'], + 'member_organizations': Organization.objects.filter(users=request.user), + 'owner_organizations': Organization.objects.filter(owner=request.user), + 'organizations': context['member_organizations'] if not request.user.is_superuser else Organization.objects.all() + } + return render(request, "account/dashboard.html", context) + else: + # Process the login form for unauthenticated users + form = AuthenticationForm(request=request, data=request.POST or None) + if request.method == "POST": + if form.is_valid(): + user = form.get_user() + login(request, user) + return redirect("dashboard") # Ensure 'dashboard' is named appropriately in your urls.py + return render(request, "account/login.html", {"form": form}) + + +class SignupPageView(CreateView): form_class = CustomUserCreationForm success_url = reverse_lazy("account_login") template_name = "account/signup.html" @@ -21,3 +70,26 @@ def form_valid(self, form): invitation.organization.users.add(user) invitation.delete() return super().form_valid(form) + + +def SettingsView(request): + """ + Display a dashboard overview for the logged-in account. + If the user is not authenticated, display the login form. + """ + if request.user.is_authenticated: + # Here, you can add additional context for the dashboard as needed + context = { + 'user': request.user, + # add other variables for your dashboard here + } + return render(request, "account/settings.html", context) + else: + # Process the login form for unauthenticated users + form = AuthenticationForm(request=request, data=request.POST or None) + if request.method == "POST": + if form.is_valid(): + user = form.get_user() + login(request, user) + return redirect("settings") + return render(request, "account/login.html", {"form": form}) \ No newline at end of file diff --git a/app/main/settings.py b/app/main/settings.py index 984176c..2eeb80e 100644 --- a/app/main/settings.py +++ b/app/main/settings.py @@ -186,7 +186,7 @@ CRISPY_TEMPLATE_PACK = "bootstrap5" # django-allauth config -LOGIN_REDIRECT_URL = "home" +LOGIN_REDIRECT_URL = "dashboard" ACCOUNT_LOGOUT_REDIRECT = "home" SITE_ID = 1 AUTHENTICATION_BACKENDS = ( diff --git a/app/main/urls.py b/app/main/urls.py index c744600..112a936 100644 --- a/app/main/urls.py +++ b/app/main/urls.py @@ -18,21 +18,24 @@ from django.conf.urls.i18n import i18n_patterns from django.views.i18n import JavaScriptCatalog +from accounts.views import DashboardView + urlpatterns = [ path('campaign/admin/jsi18n/', JavaScriptCatalog.as_view(), name='javascript-catalog'), # Add this line # Django admin - path("backend/", admin.site.urls), + path('backend/', admin.site.urls), # User management - path("accounts/", include("accounts.urls")), + path('accounts/', include('accounts.urls')), + path('dashboard/', DashboardView, name='dashboard'), # Local apps - path("", include("pages.urls")), - path("api/", include("api.urls")), - path("campaigns/", include("campaign.urls")), - path("cities/", include("cities.urls")), - path("devices/", include("devices.urls")), - path("stations/", include("stations.urls")), - path("workshops/", include("workshops.urls")), - path("organizations/", include("organizations.urls")), + path('', include('pages.urls')), + path('api/', include('api.urls')), + path('campaigns/', include('campaign.urls')), + path('cities/', include('cities.urls')), + path('devices/', include('devices.urls')), + path('stations/', include('stations.urls')), + path('workshops/', include('workshops.urls')), + path('organizations/', include('organizations.urls')), ] + i18n_patterns( # Your URLs that require localization # Include set_language URL diff --git a/app/templates/_base.html b/app/templates/_base.html index d4e0fb2..62554b2 100644 --- a/app/templates/_base.html +++ b/app/templates/_base.html @@ -68,6 +68,17 @@ {{ user.username }}