This commit is contained in:
sankalp committed 2025-12-14 06:54:44 +05:45
1 parent e3a96e1190
commit 2d4145103c
7 files changed
+2303 -16

No files matched your search

+6 -2
View File
@@ -1,5 +1,9 @@
from django.urls import path
from .views import home
from src.api.base import views
urlpatterns = [path("", home, name="home")]
urlpatterns = [
path("", views.dashboard, name="dashboard"),
path("login/", views.login_view, name="login"),
path("logout/", views.logout_view, name="logout"),
]
+102 -2
View File
@@ -1,5 +1,105 @@
from django.shortcuts import render
from datetime import timedelta
from django.contrib import messages
from django.contrib.auth import authenticate
from django.contrib.auth import login as auth_login
from django.contrib.auth import logout as auth_logout
from django.contrib.auth.decorators import login_required, user_passes_test
from django.db.models import Sum
from django.shortcuts import redirect, render
from django.utils import timezone
from src.models.clients import Client
from src.models.finance import Expense, Invoice
from src.models.projects import Project, Task
from src.models.services import Service
def home(request):
def is_superuser(user):
return user.is_superuser
def login_view(request):
if request.user.is_authenticated:
return redirect("dashboard")
if request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
user = authenticate(request, username=username, password=password)
if user is not None and user.is_superuser:
auth_login(request, user)
return redirect("dashboard")
else:
messages.error(
request,
"Invalid credentials or insufficient permissions. Superuser access required.",
)
return render(request, "base/login.html")
def logout_view(request):
auth_logout(request)
messages.success(request, "You have been logged out successfully")
return redirect("login")
@login_required(login_url="login")
@user_passes_test(is_superuser, login_url="login")
def dashboard(request):
# Date ranges
today = timezone.now().date()
week_ago = today - timedelta(days=7)
month_ago = today - timedelta(days=30)
# Core metrics
total_clients = Client.objects.count()
active_projects = Project.objects.filter(status="In_PROGRESS").count()
pending_tasks = Task.objects.filter(status="TODO").count()
# Financial metrics
total_income = (
Invoice.objects.filter(status="PAID").aggregate(Sum("amount"))["amount__sum"]
or 0
)
pending_income = (
Invoice.objects.filter(status="SENT").aggregate(Sum("amount"))["amount__sum"]
or 0
)
monthly_expenses = (
Expense.objects.filter(date__gte=month_ago).aggregate(Sum("amount"))[
"amount__sum"
]
or 0
)
overdue_invoices = Invoice.objects.filter(status="OVERDUE").count()
# Recent Activity
recent_projects = Project.objects.select_related("client").order_by("-updated_at")[
:5
]
recent_tasks = Task.objects.select_related("project").order_by("-updated_at")[:5]
upcoming_deadlines = Project.objects.filter(
deadline__gte=today, deadline__lte=today + timedelta(days=7)
).order_by("deadline")[:5]
# Services expiring soon
expiring_services = Service.objects.filter(
expiry_date__gte=today, expiry_date__lte=today + timedelta(days=30)
).order_by("expiry_date")[:5]
context = {
"total_clients": total_clients,
"active_projects": active_projects,
"pending_tasks": pending_tasks,
"total_income": total_income,
"pending_income": pending_income,
"monthly_expenses": monthly_expenses,
"overdue_invoices": overdue_invoices,
"recent_projects": recent_projects,
"recent_tasks": recent_tasks,
"upcoming_deadlines": upcoming_deadlines,
"expiring_services": expiring_services,
}
return render(request, "base/dashboard.html", context)