Ajay
Ajay

Reputation: 13

Attendance reports using django

  1. I have a Student class and Attendance class where student var in Attendance is ForeignKey of Student class and Student class contains User as OneToOneField.
  2. Now when I take attendance using takeattendance function in views.py the attendance is stored properly in the Attendance class, But I have 3 logins hod, staff and student
  3. when staff add the attendance I want that the particular student should get the count of there own attendance in percentage.
  4. I am unable to get the logic for it. Please Help me with it

Models.py

class Student(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    branch = models.ForeignKey(Course,on_delete=models.CASCADE,null=True,blank=True)
    middle_name = models.CharField(max_length=50,null=True)
    roll_no = models.IntegerField()
    mobile_no = PhoneNumberField(default='')
    parents_mobile_no = PhoneNumberField(default='')
    year = models.ForeignKey(Year,on_delete=models.CASCADE)
    division = models.ForeignKey(Division,on_delete=models.CASCADE)
    batch = models.ForeignKey(Batch,on_delete=models.CASCADE)
    semester = models.ForeignKey(Semester,on_delete=models.CASCADE, null=True,blank=True)

class Attendance(models.Model):
    id = models.AutoField(primary_key=True)
    subject = models.ForeignKey(Subject, on_delete=models.CASCADE)
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    status = models.CharField(max_length=15)

views.py

def takeattendance(request):
    if request.method == "POST":
        subject = Subject.objects.get(id=request.POST['subject'])
        student_ids = request.POST.getlist('student_name')
        status_list = request.POST.getlist('status')

        attendance_objs = []
        for sid, status in zip(student_ids, status_list):
            attendance_objs.append(
                Attendance(
                  subject=subject,
                  student=Student.objects.get(id=sid),
                  status=status
                )
            )
        
        Attendance.objects.bulk_create(
                attendance_objs
        )

        if request.user.is_authenticated and request.user.user_type == 2:
           return render(request,'ms/hod/Attendance.html')
        elif request.user.is_authenticated and request.user.user_type == 3:
           return render(request,'ms/staff/Attendance.html')
        else:
            return HttpResponse("Failed")

    else:    
        return HttpResponse("Failed") 

Upvotes: 0

Views: 553

Answers (1)

Nealium
Nealium

Reputation: 2268

Here's some examples. There's definitely improvements that can be made and probably Django functions that can be used instead of manually doing everything

Edit

.values_list('date') should have been .values_list('date', 'subject')

Class attendance as a whole

total_of_days_attendance_was_taken = Attendance.objects.all().values_list('date', 'subject').distinct().count()

total_students = Student.objects.all().count()

target_total = total_of_days_attendance_was_taken*total_students

total_attendance = Attendance.objects.all().count()

entire_class_percent = '{0}%'.format((total_attendance/target_total)*100)

Attendance by Student

total_of_days_attendance_was_taken = Attendance.objects.all().values_list('date', 'subject').distinct().count()

per_student = {}
for i in Student.objects.all():
    total_for_student = Attendance.objects.filter(student=i).count()
    sudent_percent = '{0}%'.format((total_for_student/total_of_days_attendance_was_taken)*100)
    per_student[i.user.username] = sudent_percent

Student's own Attendance Rate

total_of_days_attendance_was_taken = Attendance.objects.all().values_list('date', 'subject').distinct().count()
total_for_student = Attendance.objects.filter(student=request.user).count()

sudent_percent = '{0}%'.format((total_for_student/total_of_days_attendance_was_taken)*100)

If you want Attendance for the current Subject/Class submitted

Class attendance as a whole

total_of_days_attendance_was_taken = Attendance.objects.filter(subject=subject).values_list('date').distinct().count()

total_students = Student.objects.all().count()

target_total = total_of_days_attendance_was_taken*total_students

total_attendance = Attendance.objects.filter(subject=subject).count()

entire_class_percent = '{0}%'.format((total_attendance/target_total)*100)

Attendance by Student

total_of_days_attendance_was_taken = Attendance.objects.filter(subject=subject).values_list('date').distinct().count()

per_student = {}
for i in Student.objects.all():
    total_for_student = Attendance.objects.filter( subject=subject, student=i).count()
    sudent_percent = '{0}%'.format((total_for_student/total_of_days_attendance_was_taken)*100)
    per_student[i.user.username] = sudent_percent

Student's own Attendance Rate

total_of_days_attendance_was_taken = Attendance.objects.filter(subject=subject).values_list('date').distinct().count()
total_for_student = Attendance.objects.filter(subject=subject, student=request.user).count()

sudent_percent = '{0}%'.format((total_for_student/total_of_days_attendance_was_taken)*100)

Upvotes: 1

Related Questions