2024-10-05 00:55:24 +03:00

210 lines
7.0 KiB
Python

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from accounts.decorators import admin_required, lecturer_required
from accounts.models import User, Student
from .forms import SessionForm, SemesterForm, NewsAndEventsForm
from .models import NewsAndEvents, ActivityLog, Session, Semester
# ########################################################
# News & Events
# ########################################################
@login_required
def home_view(request):
items = NewsAndEvents.objects.all().order_by("-updated_date")
context = {
"title": "News & Events",
"items": items,
}
return render(request, "core/index.html", context)
@login_required
@admin_required
def dashboard_view(request):
logs = ActivityLog.objects.all().order_by("-created_at")[:10]
gender_count = Student.get_gender_count()
context = {
"student_count": User.objects.get_student_count(),
"lecturer_count": User.objects.get_lecturer_count(),
"superuser_count": User.objects.get_superuser_count(),
"males_count": gender_count["M"],
"females_count": gender_count["F"],
"logs": logs,
}
return render(request, "core/dashboard.html", context)
@login_required
def post_add(request):
if request.method == "POST":
form = NewsAndEventsForm(request.POST)
title = form.cleaned_data.get("title", "Post") if form.is_valid() else None
if form.is_valid():
form.save()
messages.success(request, f"{title} has been uploaded.")
return redirect("home")
messages.error(request, "Please correct the error(s) below.")
else:
form = NewsAndEventsForm()
return render(request, "core/post_add.html", {"title": "Add Post", "form": form})
@login_required
@lecturer_required
def edit_post(request, pk):
instance = get_object_or_404(NewsAndEvents, pk=pk)
if request.method == "POST":
form = NewsAndEventsForm(request.POST, instance=instance)
title = form.cleaned_data.get("title", "Post") if form.is_valid() else None
if form.is_valid():
form.save()
messages.success(request, f"{title} has been updated.")
return redirect("home")
messages.error(request, "Please correct the error(s) below.")
else:
form = NewsAndEventsForm(instance=instance)
return render(request, "core/post_add.html", {"title": "Edit Post", "form": form})
@login_required
@lecturer_required
def delete_post(request, pk):
post = get_object_or_404(NewsAndEvents, pk=pk)
post_title = post.title
post.delete()
messages.success(request, f"{post_title} has been deleted.")
return redirect("home")
# ########################################################
# Session
# ########################################################
@login_required
@lecturer_required
def session_list_view(request):
"""Show list of all sessions"""
sessions = Session.objects.all().order_by("-is_current_session", "-session")
return render(request, "core/session_list.html", {"sessions": sessions})
@login_required
@lecturer_required
def session_add_view(request):
"""Add a new session"""
if request.method == "POST":
form = SessionForm(request.POST)
if form.is_valid():
if form.cleaned_data.get("is_current_session"):
unset_current_session()
form.save()
messages.success(request, "Session added successfully.")
return redirect("session_list")
else:
form = SessionForm()
return render(request, "core/session_update.html", {"form": form})
@login_required
@lecturer_required
def session_update_view(request, pk):
session = get_object_or_404(Session, pk=pk)
if request.method == "POST":
form = SessionForm(request.POST, instance=session)
if form.is_valid():
if form.cleaned_data.get("is_current_session"):
unset_current_session()
form.save()
messages.success(request, "Session updated successfully.")
return redirect("session_list")
else:
form = SessionForm(instance=session)
return render(request, "core/session_update.html", {"form": form})
@login_required
@lecturer_required
def session_delete_view(request, pk):
session = get_object_or_404(Session, pk=pk)
if session.is_current_session:
messages.error(request, "You cannot delete the current session.")
else:
session.delete()
messages.success(request, "Session successfully deleted.")
return redirect("session_list")
def unset_current_session():
"""Unset current session"""
current_session = Session.objects.filter(is_current_session=True).first()
if current_session:
current_session.is_current_session = False
current_session.save()
# ########################################################
# Semester
# ########################################################
@login_required
@lecturer_required
def semester_list_view(request):
semesters = Semester.objects.all().order_by("-is_current_semester", "-semester")
return render(request, "core/semester_list.html", {"semesters": semesters})
@login_required
@lecturer_required
def semester_add_view(request):
if request.method == "POST":
form = SemesterForm(request.POST)
if form.is_valid():
if form.cleaned_data.get("is_current_semester"):
unset_current_semester()
unset_current_session()
form.save()
messages.success(request, "Semester added successfully.")
return redirect("semester_list")
else:
form = SemesterForm()
return render(request, "core/semester_update.html", {"form": form})
@login_required
@lecturer_required
def semester_update_view(request, pk):
semester = get_object_or_404(Semester, pk=pk)
if request.method == "POST":
form = SemesterForm(request.POST, instance=semester)
if form.is_valid():
if form.cleaned_data.get("is_current_semester"):
unset_current_semester()
unset_current_session()
form.save()
messages.success(request, "Semester updated successfully!")
return redirect("semester_list")
else:
form = SemesterForm(instance=semester)
return render(request, "core/semester_update.html", {"form": form})
@login_required
@lecturer_required
def semester_delete_view(request, pk):
semester = get_object_or_404(Semester, pk=pk)
if semester.is_current_semester:
messages.error(request, "You cannot delete the current semester.")
else:
semester.delete()
messages.success(request, "Semester successfully deleted.")
return redirect("semester_list")
def unset_current_semester():
"""Unset current semester"""
current_semester = Semester.objects.filter(is_current_semester=True).first()
if current_semester:
current_semester.is_current_semester = False
current_semester.save()