minor update

This commit is contained in:
2025-08-26 13:24:30 +05:30
parent 15e8344d0e
commit 87515609ef
6 changed files with 225 additions and 209 deletions
Binary file not shown.
+4 -3
View File
@@ -83,7 +83,8 @@
<ul class="dropdown-menu dropdown-menu-end"> <ul class="dropdown-menu dropdown-menu-end">
{% if user.is_citizen %} {% if user.is_citizen %}
<li> <li>
<a class="dropdown-item" href="{% url 'citizen_dashboard' %}">Citizen Dashboard</a> <a class="dropdown-item" href="{% url 'citizen_dashboard' %}">
<i class="fas fa-users me-2 text-primary"></i>Citizen Dashboard</a>
</li> </li>
{% endif %} {% endif %}
@@ -97,7 +98,7 @@
{% if user.is_superuser %} {% if user.is_superuser %}
<li> <li>
<a class="dropdown-item text-danger fw-bold" href="{% url 'superadmin_dashboard' %}"> <a class="dropdown-item text-danger fw-bold" href="{% url 'superadmin_dashboard' %}">
<i class="fas fa-crown me-1"></i> Super Admin <i class="fas fa-crown me-1 text-warning fw-bold"></i> Super Admin
</a> </a>
</li> </li>
{% endif %} {% endif %}
@@ -108,7 +109,7 @@
<li> <li>
<form method="post" action="{% url 'logout' %}"> <form method="post" action="{% url 'logout' %}">
{% csrf_token %} {% csrf_token %}
<button type="submit" class="dropdown-item">Logout</button> <button type="submit" class="dropdown-item"><i class="fas fa-right-from-bracket me-2"></i>Logout</button>
</form> </form>
</li> </li>
</ul> </ul>
+37 -18
View File
@@ -5,7 +5,8 @@
<section class="hero-section text-center"> <section class="hero-section text-center">
<div class="container"> <div class="container">
<h1 class="display-4 fw-bold mb-4">Report. Resolve. Rejoice.</h1> <h1 class="display-4 fw-bold mb-4">Report. Resolve. Rejoice.</h1>
<p class="lead mb-5">Your voice matters in making our community better. Report local issues and track their resolution in real-time.</p> <p class="lead mb-5">Your voice matters in making our community better. Report local issues and track their
resolution in real-time.</p>
<div class="d-grid gap-2 d-sm-flex justify-content-sm-center"> <div class="d-grid gap-2 d-sm-flex justify-content-sm-center">
{% if user.is_authenticated %} {% if user.is_authenticated %}
<a href="{% url 'citizen_dashboard' %}" class="btn btn-primary btn-lg px-4 gap-3">Report an Issue</a> <a href="{% url 'citizen_dashboard' %}" class="btn btn-primary btn-lg px-4 gap-3">Report an Issue</a>
@@ -25,7 +26,7 @@
<p class="text-muted">Issues Reported</p> <p class="text-muted">Issues Reported</p>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<h3 class="fw-bold text-primary">Soon</h3> <h3 class="fw-bold text-primary">{{ resolved_issues|default:"0" }}+</h3>
<p class="text-muted">Issues Resolved</p> <p class="text-muted">Issues Resolved</p>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
@@ -33,12 +34,13 @@
<p class="text-muted">Active Users</p> <p class="text-muted">Active Users</p>
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<h3 class="fw-bold text-primary">Soon</h3> <h3 class="fw-bold text-primary">{{ total_departments|default:"0" }}</h3>
<p class="text-muted">Municipal Departments</p> <p class="text-muted">Municipal Departments</p>
</div> </div>
</div> </div>
</section> </section>
<!-- Features Section --> <!-- Features Section -->
<section id="features" class="container mb-5"> <section id="features" class="container mb-5">
<div class="text-center mb-5"> <div class="text-center mb-5">
@@ -53,7 +55,8 @@
<i class="fas fa-map-marked-alt"></i> <i class="fas fa-map-marked-alt"></i>
</div> </div>
<h5 class="card-title">Location-Based Reporting</h5> <h5 class="card-title">Location-Based Reporting</h5>
<p class="card-text text-muted">Pinpoint issues on an interactive map for accurate location tracking and faster resolution.</p> <p class="card-text text-muted">Pinpoint issues on an interactive map for accurate location tracking
and faster resolution.</p>
</div> </div>
</div> </div>
</div> </div>
@@ -64,7 +67,8 @@
<i class="fas fa-tasks"></i> <i class="fas fa-tasks"></i>
</div> </div>
<h5 class="card-title">Real-Time Tracking</h5> <h5 class="card-title">Real-Time Tracking</h5>
<p class="card-text text-muted">Follow your reported issues through every stage from reporting to resolution.</p> <p class="card-text text-muted">Follow your reported issues through every stage from reporting to
resolution.</p>
</div> </div>
</div> </div>
</div> </div>
@@ -75,7 +79,8 @@
<i class="fas fa-users"></i> <i class="fas fa-users"></i>
</div> </div>
<h5 class="card-title">Community Engagement</h5> <h5 class="card-title">Community Engagement</h5>
<p class="card-text text-muted">Vote and comment on issues to help prioritize what matters most to your neighborhood.</p> <p class="card-text text-muted">Vote and comment on issues to help prioritize what matters most to
your neighborhood.</p>
</div> </div>
</div> </div>
</div> </div>
@@ -93,27 +98,33 @@
<div class="col-md-4"> <div class="col-md-4">
<div class="card h-100 border-0 shadow-sm"> <div class="card h-100 border-0 shadow-sm">
<div class="card-body text-center p-4"> <div class="card-body text-center p-4">
<span class="badge bg-primary rounded-circle mb-3" style="width: 50px; height: 50px; line-height: 50px; font-size: 1.5rem;">1</span> <span class="badge bg-primary rounded-circle mb-3"
style="width: 50px; height: 50px; line-height: 50px; font-size: 1.5rem;">1</span>
<h5 class="card-title">Report an Issue</h5> <h5 class="card-title">Report an Issue</h5>
<p class="card-text text-muted">Take a photo, add details, and drop a pin on the map to report problems in your area.</p> <p class="card-text text-muted">Take a photo, add details, and drop a pin on the map to report
problems in your area.</p>
</div> </div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<div class="card h-100 border-0 shadow-sm"> <div class="card h-100 border-0 shadow-sm">
<div class="card-body text-center p-4"> <div class="card-body text-center p-4">
<span class="badge bg-primary rounded-circle mb-3" style="width: 50px; height: 50px; line-height: 50px; font-size: 1.5rem;">2</span> <span class="badge bg-primary rounded-circle mb-3"
style="width: 50px; height: 50px; line-height: 50px; font-size: 1.5rem;">2</span>
<h5 class="card-title">Community Support</h5> <h5 class="card-title">Community Support</h5>
<p class="card-text text-muted">Others can vote and comment to show support and add details to your report.</p> <p class="card-text text-muted">Others can vote and comment to show support and add details to
your report.</p>
</div> </div>
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<div class="card h-100 border-0 shadow-sm"> <div class="card h-100 border-0 shadow-sm">
<div class="card-body text-center p-4"> <div class="card-body text-center p-4">
<span class="badge bg-primary rounded-circle mb-3" style="width: 50px; height: 50px; line-height: 50px; font-size: 1.5rem;">3</span> <span class="badge bg-primary rounded-circle mb-3"
style="width: 50px; height: 50px; line-height: 50px; font-size: 1.5rem;">3</span>
<h5 class="card-title">Official Response</h5> <h5 class="card-title">Official Response</h5>
<p class="card-text text-muted">Municipal authorities receive, prioritize, and work on resolving the issues.</p> <p class="card-text text-muted">Municipal authorities receive, prioritize, and work on resolving
the issues.</p>
</div> </div>
</div> </div>
</div> </div>
@@ -136,9 +147,11 @@
<div class="col-md-4"> <div class="col-md-4">
<div class="card issue-card h-100"> <div class="card issue-card h-100">
{% if issue.photo %} {% if issue.photo %}
<img src="{{ issue.photo.url }}" class="card-img-top" alt="{{ issue.title }}" style="height: 200px; object-fit: cover;"> <img src="{{ issue.photo.url }}" class="card-img-top" alt="{{ issue.title }}"
style="height: 200px; object-fit: cover;">
{% else %} {% else %}
<img src="https://via.placeholder.com/300x200/6c757d/ffffff?text=No+Image" class="card-img-top" alt="No image"> <img src="https://via.placeholder.com/300x200/6c757d/ffffff?text=No+Image" class="card-img-top"
alt="No image">
{% endif %} {% endif %}
<div class="card-body"> <div class="card-body">
<span class="badge <span class="badge
@@ -162,7 +175,8 @@
<!-- Vote Button --> <!-- Vote Button -->
<div class="vote-section"> <div class="vote-section">
{% if user.is_authenticated %} {% if user.is_authenticated %}
<button class="btn btn-sm btn-outline-primary vote-btn {% if issue.user_has_voted %}active{% endif %}" <button
class="btn btn-sm btn-outline-primary vote-btn {% if issue.user_has_voted %}active{% endif %}"
data-issue-id="{{ issue.id }}"> data-issue-id="{{ issue.id }}">
<i class="fas fa-thumbs-up"></i> <i class="fas fa-thumbs-up"></i>
<span class="vote-count">{{ issue.vote_count }}</span> <span class="vote-count">{{ issue.vote_count }}</span>
@@ -177,8 +191,10 @@
</div> </div>
</div> </div>
<div class="card-footer bg-transparent"> <div class="card-footer bg-transparent">
<small class="text-{% if issue.status == 'resolved' %}success{% elif issue.status == 'in_progress' %}warning{% else %}info{% endif %}"> <small
<i class="fas fa-{% if issue.status == 'resolved' %}check-circle{% elif issue.status == 'in_progress' %}tasks{% else %}clock{% endif %} me-1"></i> class="text-{% if issue.status == 'resolved' %}success{% elif issue.status == 'in_progress' %}warning{% else %}info{% endif %}">
<i
class="fas fa-{% if issue.status == 'resolved' %}check-circle{% elif issue.status == 'in_progress' %}tasks{% else %}clock{% endif %} me-1"></i>
{{ issue.get_status_display }} {{ issue.get_status_display }}
</small> </small>
</div> </div>
@@ -199,7 +215,8 @@
<section class="bg-primary text-white py-5"> <section class="bg-primary text-white py-5">
<div class="container text-center"> <div class="container text-center">
<h2 class="fw-bold mb-4">Ready to make a difference in your community?</h2> <h2 class="fw-bold mb-4">Ready to make a difference in your community?</h2>
<p class="lead mb-4">Join {{ active_users|default:"thousands of" }} citizens who are actively improving their neighborhoods.</p> <p class="lead mb-4">Join {{ active_users|default:"thousands of" }} citizens who are actively improving their
neighborhoods.</p>
{% if user.is_authenticated %} {% if user.is_authenticated %}
<a href="{% url 'citizen_dashboard' %}" class="btn btn-light btn-lg px-4">Report an Issue</a> <a href="{% url 'citizen_dashboard' %}" class="btn btn-light btn-lg px-4">Report an Issue</a>
{% else %} {% else %}
@@ -266,10 +283,12 @@
color: white; color: white;
border-color: #0d6efd; border-color: #0d6efd;
} }
.vote-btn:hover:not(:disabled) { .vote-btn:hover:not(:disabled) {
transform: scale(1.05); transform: scale(1.05);
transition: transform 0.2s; transition: transform 0.2s;
} }
.vote-btn:disabled { .vote-btn:disabled {
opacity: 0.7; opacity: 0.7;
cursor: not-allowed; cursor: not-allowed;
@@ -7,7 +7,7 @@
<h3>Super Admin Dashboard</h3> <h3>Super Admin Dashboard</h3>
</div> </div>
<div class="card-body"> <div class="card-body">
<p>Welcome, {{ request.user.username }} 👑</p> <p>Welcome, {{ request.user.username }} <i class="fas fa-crown text-warning fw-bold"></i></p>
<ul class="list-group"> <ul class="list-group">
<li class="list-group-item"> <li class="list-group-item">
@@ -19,17 +19,14 @@
<a href="{% url 'manage_departments' %}">Manage Departments</a> <a href="{% url 'manage_departments' %}">Manage Departments</a>
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<i class="fas fa-exclamation-circle me-2 text-danger"></i>
<a href="{% url 'manage_issues' %}">Manage Issues</a> <a href="{% url 'manage_issues' %}">Manage Issues</a>
</li> </li>
<li class="list-group-item"> <li class="list-group-item">
<a href="#">Manage Roles & Permissions</a> <i class="fas fa-chart-line me-2 text-warning"></i>
</li>
<li class="list-group-item">
<a href="#">View Analytics & Reports</a> <a href="#">View Analytics & Reports</a>
</li> </li>
<li class="list-group-item">
<a href="#">System Settings</a>
</li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -38,7 +38,7 @@
<input type="text" name="description" class="form-control" placeholder="Description (optional)"> <input type="text" name="description" class="form-control" placeholder="Description (optional)">
</div> </div>
<div class="col-md-2"> <div class="col-md-2">
<button type="submit" class="btn btn-success w-100">Add</button> <button type="submit" class="btn btn-success w-100"><i class="fas fa-plus me-2"></i>Add</button>
</div> </div>
</div> </div>
</form> </form>
+4 -5
View File
@@ -2,32 +2,31 @@ from django.contrib import messages
from django.contrib.auth import authenticate, login from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required, user_passes_test from django.contrib.auth.decorators import login_required, user_passes_test
from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth.hashers import make_password
from django.db import IntegrityError from django.db import IntegrityError
from django.db.models import Exists, OuterRef from django.db.models import Exists, OuterRef
from django.http import JsonResponse from django.http import JsonResponse
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.views.decorators.http import require_POST from django.views.decorators.http import require_POST
from .models import Issue, User, Vote, Comment, Department from .models import Issue, User, Vote, Comment, Department
from .forms import CitizenRegistrationForm, IssueForm, CommentForm, IssueAssignForm from .forms import CitizenRegistrationForm, IssueForm, CommentForm
def home(request): def home(request):
total_issues = Issue.objects.count() total_issues = Issue.objects.count()
resolved_issues = Issue.objects.filter(status='resolved').count() resolved_issues = Issue.objects.filter(status=Issue.STATUS_RESOLVED).count()
active_users = User.objects.filter(is_active=True).count() active_users = User.objects.filter(is_active=True).count()
total_departments = Department.objects.count()
recent_issues = Issue.objects.all().order_by('-created_at')[:3] recent_issues = Issue.objects.all().order_by('-created_at')[:3]
for issue in recent_issues: for issue in recent_issues:
issue.user_has_voted = issue.has_user_voted(request.user) if request.user.is_authenticated else False issue.user_has_voted = issue.has_user_voted(request.user) if request.user.is_authenticated else False
municipal_departments = 5
context = { context = {
'total_issues': total_issues, 'total_issues': total_issues,
'resolved_issues': resolved_issues, 'resolved_issues': resolved_issues,
'active_users': active_users, 'active_users': active_users,
'municipal_departments': municipal_departments, 'total_departments': total_departments,
'recent_issues': recent_issues, 'recent_issues': recent_issues,
} }
return render(request, 'core/index.html', context) return render(request, 'core/index.html', context)