Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

70 personal dashboar for ak project #116

Merged
merged 9 commits into from
Jan 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion app/accounts/urls.py
Original file line number Diff line number Diff line change
@@ -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")),
]
78 changes: 75 additions & 3 deletions app/accounts/views.py
Original file line number Diff line number Diff line change
@@ -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"
Expand All @@ -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})
2 changes: 1 addition & 1 deletion app/main/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = (
Expand Down
23 changes: 13 additions & 10 deletions app/main/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
20 changes: 12 additions & 8 deletions app/templates/_base.html
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,17 @@
{{ user.username }}
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="{% url 'dashboard' %}">
{% trans "Dashboard" %}
</a>
</li>
<li>
<a class="dropdown-item" href="{% url 'settings' %}">
{% trans "Settings" %}
</a>
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" href="{% url 'organizations-my' %}">
{% trans "My Organizations" %}
Expand All @@ -85,14 +96,7 @@
</a>
</li>
{% endif %}
<li>
<a class="dropdown-item" href="{% url 'account_change_password' %}">
{% trans "Change Password" %}
</a>
</li>
<li>
<hr class="dropdown-divider">
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" href="{% url 'account_logout' %}">
{% trans "Log Out" %}
Expand Down
15 changes: 15 additions & 0 deletions app/templates/account/account_confirm_delete.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{% extends "_base.html" %}
{% load i18n %}
{% load static %}

{% block title %}{% trans "Delete Your Account" %}{% endblock title %}

{% block content %}
<h2 class="mb-4 mt-5">{% trans "Delete Your Account" %}</h2>
<p>{% trans "Are you sure you want to delete your account? This action cannot be undone." %}</p>
<form method="post">
{% csrf_token %}
<button type="submit" class="btn btn-danger">{% trans "Confirm Delete" %}</button>
<a href="{% url 'settings' %}" class="btn btn-secondary">{% trans "Cancel" %}</a>
</form>
{% endblock content %}
157 changes: 157 additions & 0 deletions app/templates/account/dashboard.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
{% extends "_base.html" %}
{% load i18n %}
{% load static %}

{% block title %}{% trans "Dashboard" %}{% endblock title %}

{% block content %}
<div class="container mt-5">
<h2 class="mb-4">{% trans "Welcome," %} {{ user.username }}</h2>

<!-- Summary Cards Row -->
<div class="row mb-4">
<!-- Example Card: My Campaigns Count -->
<div class="col-md-6 col-lg-3 mb-3">
<div class="card text-center shadow-sm">
<div class="card-body">
<h5 class="card-title mb-3">
<i class="bi bi-flag-fill"></i> {% trans "My Campaigns" %}
</h5>
<p class="display-6">{{ campaigns|length }}</p>
<a href="{% url 'campaigns-my' %}" class="btn btn-outline-primary btn-sm mt-2">
{% trans "View Campaigns" %}
</a>
</div>
</div>
</div>
<!-- Example Card: My Organizations Count -->
<div class="col-md-6 col-lg-3 mb-3">
<div class="card text-center shadow-sm">
<div class="card-body">
<h5 class="card-title mb-3">
<i class="bi bi-people-fill"></i> {% trans "My Organizations" %}
</h5>
<p class="display-6">{{ member_organizations|length }}</p>
<a href="{% url 'organizations-my' %}" class="btn btn-outline-secondary btn-sm mt-2">
{% trans "View Organizations" %}
</a>
</div>
</div>
</div>
<!-- Example Card: Add more stats or summary here (optional) -->
<div class="col-md-6 col-lg-3 mb-3">
<div class="card text-center shadow-sm">
<div class="card-body">
<h5 class="card-title mb-3">
<i class="bi bi-clipboard-data"></i> {% trans "Measurements" %}
</h5>
<p class="display-6">3764</p>
<a href="#" class="btn btn-outline-secondary btn-sm mt-2">
{% trans "Manage Data" %}
</a>
</div>
</div>
</div>
<!-- Example Card: Another optional summary -->
<div class="col-md-6 col-lg-3 mb-3">
<div class="card text-center shadow-sm">
<div class="card-body">
<h5 class="card-title mb-3">
<i class="bi bi-calendar-week"></i> {% trans "Days measured" %}
</h5>
<p class="display-6">5</p>
<a href="#" class="btn btn-outline-secondary btn-sm mt-2">
{% trans "View Timeline" %}
</a>
</div>
</div>
</div>
</div>

<!-- Row for My Campaigns and My Organizations details -->
<div class="row mb-4">
<!-- My Campaigns Column -->
<div class="col-lg-6 mb-4">
<h3>
<i class="bi bi-flag-fill"></i> {% trans "My Campaigns" %}
</h3>
{% if campaigns %}
<div class="list-group">
{% for campaign in campaigns %}
<div class="list-group-item list-group-item-action d-flex flex-column flex-md-row justify-content-between align-items-start">
<div class="mb-2 mb-md-0">
<h5 class="mb-1">
<a href="{% url 'campaigns-detail' campaign.pk %}">{{ campaign.name }}</a>
{% if campaign in owner_campaigns %}
<span class="badge bg-secondary">{% trans "Owner" %}</span>
{% elif campaign in member_campaigns %}
<span class="badge bg-secondary">{% trans "Member" %}</span>
{% else %}
<span class="badge bg-secondary">{% trans "Other" %}</span>
{% endif %}
</h5>
<p class="mb-1">
<strong>{% trans "Date:" %}</strong>
{{ campaign.start_date|date:"d.m.Y H:i" }} – {{ campaign.end_date|date:"d.m.Y H:i" }}
</p>
</div>
</div>
{% endfor %}
</div>
{% else %}
<div class="alert alert-warning mt-3" role="alert">
{% trans "No campaigns found." %}
</div>
{% endif %}
</div>

<!-- My Organizations Column -->
<div class="col-lg-6 mb-4">
<h3>
<i class="bi bi-people-fill"></i> {% trans "My Organizations" %}
</h3>
{% if member_organizations %}
<div class="list-group">
{% for organization in organizations %}
<div class="list-group-item list-group-item-action d-flex flex-column flex-md-row justify-content-between align-items-start">
<div class="mb-2 mb-md-0">
<h5 class="mb-1">
<a href="{% url 'organizations-detail' organization.pk %}">{{ organization.name }}</a>
{% if organization in owner_organizations %}
<span class="badge bg-secondary">{% trans "Owner" %}</span>
{% elif organization in member_organizations %}
<span class="badge bg-secondary">{% trans "Member" %}</span>
{% else %}
<span class="badge bg-secondary">{% trans "Other" %}</span>
{% endif %}
</h5>
<p class="mb-1">
{{ organization.description|truncatewords:20 }}
</p>
</div>
</div>
{% endfor %}
</div>
{% else %}
<div class="alert alert-warning mt-3" role="alert">
{% trans "You are not a member of any organizations." %}
</div>
{% endif %}
</div>
</div>

<!-- Help and Documentation -->
<div class="row">
<div class="col-lg-6 mb-4">
<h3><i class="bi bi-question-circle-fill"></i> {% trans "Help" %}</h3>
<p>{% trans "Here you can find FAQs and support if you run into issues." %}</p>
<a href="#" class="btn btn-outline-info">{% trans "View Help" %}</a>
</div>
<div class="col-lg-6 mb-4">
<h3><i class="bi bi-book-fill"></i> {% trans "Documentation" %}</h3>
<p>{% trans "Read detailed guides and manuals to make the most out of our platform." %}</p>
<a href="#" class="btn btn-outline-info">{% trans "View Docs" %}</a>
</div>
</div>
</div>
{% endblock content %}
2 changes: 1 addition & 1 deletion app/templates/account/email_confirm.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
{% load account %}
{% block head_title %}{% trans "Confirm E-mail Address" %}{% endblock %}
{% block content %}
<h1>{% trans "Confirm E-mail Address" %}</h1> {% if confirmation %}
<h2 class="mt-5">{% trans "Confirm E-mail Address" %}</h2> {% if confirmation %}
{% user_display confirmation.email_address.user as user_display %}
<p>{% blocktrans with confirmation.email_address.email as email %}Please confirm that <a href="mailto:{{ email }}">{{ email }}</a> is an e-mail address for user
{{ user_display }}.{% endblocktrans %}</p>
Expand Down
7 changes: 4 additions & 3 deletions app/templates/account/login.html
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
{% extends "_base.html" %}
{% load i18n %}
{% load crispy_forms_tags %}

{% block title %}Anmelden{% endblock title %}
{% block title %}{% trans "Log in" %}{% endblock title %}

{% block content %}
<h2>Anmelden</h2>
<h2 class="mt-5">{% trans "Log in" %}</h2>
<form method="post">
{% csrf_token %}
{{ form|crispy }}
<button class="btn btn-success" type="submit">Anmelden</button>
<button class="btn btn-success" type="submit">{% trans "Log in" %}</button>
</form>
{% endblock content %}
Loading
Loading