Merge pull request #17 from benaissazaki/log-cud-activities

Log CUD activities
This commit is contained in:
Adil Mohak 2024-01-12 20:54:26 +03:00 committed by GitHub
commit b2c5ca3b0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 100 additions and 10 deletions

View File

@ -0,0 +1,21 @@
# Generated by Django 4.0.8 on 2024-01-12 15:04
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('core', '0004_alter_newsandevents_id_alter_semester_id_and_more'),
]
operations = [
migrations.CreateModel(
name='ActivityLog',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('message', models.TextField()),
('created_at', models.DateTimeField(auto_now=True)),
],
),
]

View File

@ -84,3 +84,11 @@ class Semester(models.Model):
def __str__(self): def __str__(self):
return self.semester return self.semester
class ActivityLog(models.Model):
message = models.TextField()
created_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"[{self.created_at}]{self.message}"

View File

@ -298,9 +298,11 @@ def semester_delete_view(request, pk):
@login_required @login_required
@admin_required @admin_required
def dashboard_view(request): def dashboard_view(request):
logs = ActivityLog.objects.all().order_by("-created_at")[:10]
context = { context = {
"student_count": User.get_student_count(), "student_count": User.get_student_count(),
"lecturer_count": User.get_lecturer_count(), "lecturer_count": User.get_lecturer_count(),
"superuser_count": User.get_superuser_count(), "superuser_count": User.get_superuser_count(),
"logs": logs,
} }
return render(request, "core/dashboard.html", context) return render(request, "core/dashboard.html", context)

View File

@ -2,11 +2,13 @@ from django.db import models
from django.urls import reverse from django.urls import reverse
from django.conf import settings from django.conf import settings
from django.core.validators import FileExtensionValidator from django.core.validators import FileExtensionValidator
from django.db.models.signals import pre_save from django.db.models.signals import pre_save, post_save, post_delete
from django.db.models import Q from django.db.models import Q
from django.dispatch import receiver
# project import # project import
from .utils import * from .utils import *
from core.models import ActivityLog
YEARS = ( YEARS = (
(1, "1"), (1, "1"),
@ -62,6 +64,17 @@ class Program(models.Model):
return reverse("program_detail", kwargs={"pk": self.pk}) return reverse("program_detail", kwargs={"pk": self.pk})
@receiver(post_save, sender=Program)
def log_save(sender, instance, created, **kwargs):
verb = "created" if created else "updated"
ActivityLog.objects.create(message=f"The program '{instance}' has been {verb}.")
@receiver(post_delete, sender=Program)
def log_delete(sender, instance, **kwargs):
ActivityLog.objects.create(message=f"The program '{instance}' has been deleted.")
class CourseManager(models.Manager): class CourseManager(models.Manager):
def search(self, query=None): def search(self, query=None):
queryset = self.get_queryset() queryset = self.get_queryset()
@ -118,6 +131,17 @@ def course_pre_save_receiver(sender, instance, *args, **kwargs):
pre_save.connect(course_pre_save_receiver, sender=Course) pre_save.connect(course_pre_save_receiver, sender=Course)
@receiver(post_save, sender=Course)
def log_save(sender, instance, created, **kwargs):
verb = "created" if created else "updated"
ActivityLog.objects.create(message=f"The course '{instance}' has been {verb}.")
@receiver(post_delete, sender=Course)
def log_delete(sender, instance, **kwargs):
ActivityLog.objects.create(message=f"The course '{instance}' has been deleted.")
class CourseAllocation(models.Model): class CourseAllocation(models.Model):
lecturer = models.ForeignKey( lecturer = models.ForeignKey(
settings.AUTH_USER_MODEL, settings.AUTH_USER_MODEL,
@ -184,6 +208,25 @@ class Upload(models.Model):
super().delete(*args, **kwargs) super().delete(*args, **kwargs)
@receiver(post_save, sender=Upload)
def log_save(sender, instance, created, **kwargs):
if created:
ActivityLog.objects.create(
message=f"The file '{instance.title}' has been uploaded to the course '{instance.course}'."
)
else:
ActivityLog.objects.create(
message=f"The file '{instance.title}' of the course '{instance.course}' has been updated."
)
@receiver(post_delete, sender=Upload)
def log_delete(sender, instance, **kwargs):
ActivityLog.objects.create(
message=f"The file '{instance.title}' of the course '{instance.course}' has been deleted."
)
class UploadVideo(models.Model): class UploadVideo(models.Model):
title = models.CharField(max_length=100) title = models.CharField(max_length=100)
slug = models.SlugField(blank=True, unique=True) slug = models.SlugField(blank=True, unique=True)
@ -218,6 +261,25 @@ def video_pre_save_receiver(sender, instance, *args, **kwargs):
pre_save.connect(video_pre_save_receiver, sender=UploadVideo) pre_save.connect(video_pre_save_receiver, sender=UploadVideo)
@receiver(post_save, sender=UploadVideo)
def log_save(sender, instance, created, **kwargs):
if created:
ActivityLog.objects.create(
message=f"The video '{instance.title}' has been uploaded to the course {instance.course}."
)
else:
ActivityLog.objects.create(
message=f"The video '{instance.title}' of the course '{instance.course}' has been updated."
)
@receiver(post_delete, sender=UploadVideo)
def log_delete(sender, instance, **kwargs):
ActivityLog.objects.create(
message=f"The video '{instance.title}' of the course '{instance.course}' has been deleted."
)
class CourseOffer(models.Model): class CourseOffer(models.Model):
"""NOTE: Only department head can offer semester courses""" """NOTE: Only department head can offer semester courses"""

View File

@ -275,16 +275,13 @@
</div> </div>
<div class="col-md-6 p-2"> <div class="col-md-6 p-2">
<div class="card p-3 activities"> <div class="card p-3 activities">
<h5>Overall activities</h5> <h5>Latest activities</h5>
<ul class="small"> <ul class="small">
<li>Created a survey of something</li> {% for log in logs %}
<li>Added new admin user</li> <li>{{ log.message }} <span class="text-muted">- {{ log.created_at }}</span></li>
<li><span class="text-danger">Deleted</span> 1 video from CSE course</li> {% empty %}
<li>New documentation <span class="text-success">attached</span> for Arch</li> <span>No recent activity</span>
<li>Lorem ipsum dolor sit amet consectetur adipisicing elit.</li> {% endfor %}
<li>Veniam magnam reiciendis modi explicabo sed aliquid natus</li>
<li>molestias corrupti suscipit similique ex adipisci praesentium</li>
<li>sint dolore, quo quibusdam ea, neque cupiditate.</li>
</ul> </ul>
</div> </div>
</div> </div>