from django.shortcuts import render, redirect, get_object_or_404 from django.contrib import messages from django.http import HttpResponseRedirect from django.urls import reverse_lazy from django.conf import settings from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator from accounts.models import User, Student from app.models import Session, Semester from course.models import Course from accounts.decorators import lecturer_required, student_required from .models import TakenCourse, Result User = settings.AUTH_USER_MODEL #pdf from django.core.files.storage import FileSystemStorage from django.http import HttpResponse, JsonResponse from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Image, LongTable from reportlab.lib.styles import getSampleStyleSheet, black, ParagraphStyle from reportlab.lib.enums import TA_JUSTIFY,TA_LEFT,TA_CENTER,TA_RIGHT from reportlab.platypus.tables import Table from reportlab.lib.units import inch from reportlab.lib import colors cm = 2.54 from SMS.settings import MEDIA_ROOT, BASE_DIR, STATIC_URL import os from .models import * # ######################################################## # Score Add & Add for # ######################################################## @login_required @lecturer_required def add_score(request): """ Shows a page where a lecturer will select a course allocated to him for score entry. in a specific semester and session """ current_session = Session.objects.get(is_current_session=True) current_semester = get_object_or_404(Semester, is_current_semester=True, session=current_session) # semester = Course.objects.filter(allocated_course__lecturer__pk=request.user.id, semester=current_semester) courses = Course.objects.filter(allocated_course__lecturer__pk=request.user.id).filter(semester=current_semester) context = { "current_session": current_session, "current_semester": current_semester, "courses": courses, } return render(request, 'result/add_score.html', context) @login_required @lecturer_required def add_score_for(request, id): """ Shows a page where a lecturer will add score for students that are taking courses allocated to him in a specific semester and session """ current_session = Session.objects.get(is_current_session=True) current_semester = get_object_or_404(Semester, is_current_semester=True, session=current_session) if request.method == 'GET': courses = Course.objects.filter(allocated_course__lecturer__pk=request.user.id).filter( semester=current_semester) course = Course.objects.get(pk=id) # myclass = Class.objects.get(lecturer__pk=request.user.id) # myclass = get_object_or_404(Class, lecturer__pk=request.user.id) # students = TakenCourse.objects.filter(course__allocated_course__lecturer__pk=request.user.id).filter( # course__id=id).filter(student__allocated_student__lecturer__pk=request.user.id).filter( # course__semester=current_semester) students = TakenCourse.objects.filter(course__allocated_course__lecturer__pk=request.user.id).filter( course__id=id).filter(course__semester=current_semester) context = { "title": "Submit Score | DjangoSMS", "courses": courses, "course": course, # "myclass": myclass, "students": students, "current_session": current_session, "current_semester": current_semester, } return render(request, 'result/add_score_for.html', context) if request.method == 'POST': ids = () data = request.POST.copy() data.pop('csrfmiddlewaretoken', None) # remove csrf_token for key in data.keys(): ids = ids + (str(key),) # gather all the all students id (i.e the keys) in a tuple for s in range(0, len(ids)): # iterate over the list of student ids gathered above student = TakenCourse.objects.get(id=ids[s]) # print(student) # print(student.student) # print(student.student.department.id) courses = Course.objects.filter(level=student.student.level).filter(program__pk=student.student.department.id).filter( semester=current_semester) # all courses of a specific level in current semester total_credit_in_semester = 0 for i in courses: if i == courses.count(): break else: total_credit_in_semester += int(i.credit) score = data.getlist(ids[s]) # get list of score for current student in the loop assignment = score[0] # subscript the list to get the fisrt value > ca score mid_exam = score[1] # do the same for exam score quiz = score[2] attendance = score[3] final_exam = score[4] obj = TakenCourse.objects.get(pk=ids[s]) # get the current student data obj.assignment = assignment # set current student assignment score obj.mid_exam = mid_exam # set current student mid_exam score obj.quiz = quiz # set current student quiz score obj.attendance = attendance # set current student attendance score obj.final_exam = final_exam # set current student final_exam score obj.total = obj.get_total(assignment=assignment, mid_exam=mid_exam, quiz=quiz, attendance=attendance, final_exam=final_exam) obj.grade = obj.get_grade(total=obj.total) # obj.total = obj.get_total(assignment, mid_exam, quiz, attendance, final_exam) # obj.grade = obj.get_grade(assignment, mid_exam, quiz, attendance, final_exam) obj.point = obj.get_point(grade=obj.grade) obj.comment = obj.get_comment(grade=obj.grade) # obj.carry_over(obj.grade) # obj.is_repeating() obj.save() gpa = obj.calculate_gpa(total_credit_in_semester) cgpa = obj.calculate_cgpa() try: a = Result.objects.get(student=student.student, semester=current_semester, session=current_session, level=student.student.level) a.gpa = gpa a.cgpa = cgpa a.save() except: Result.objects.get_or_create(student=student.student, gpa=gpa, semester=current_semester, session=current_session, level=student.student.level) # try: # a = Result.objects.get(student=student.student, semester=current_semester, level=student.student.level) # a.gpa = gpa # a.cgpa = cgpa # a.save() # except: # Result.objects.get_or_create(student=student.student, gpa=gpa, semester=current_semester, level=student.student.level) messages.success(request, 'Successfully Recorded! ') return HttpResponseRedirect(reverse_lazy('add_score_for', kwargs={'id': id})) return HttpResponseRedirect(reverse_lazy('add_score_for', kwargs={'id': id})) # ######################################################## @login_required @student_required def grade_result(request): student = Student.objects.get(student__pk=request.user.id) courses = TakenCourse.objects.filter(student__student__pk=request.user.id).filter(course__level=student.level) # total_credit_in_semester = 0 results = Result.objects.filter(student__student__pk=request.user.id) result_set = set() for result in results: result_set.add(result.session) sorted_result = sorted(result_set) total_first_semester_credit = 0 total_sec_semester_credit = 0 for i in courses: if i.course.semester == "First": total_first_semester_credit += int(i.course.credit) if i.course.semester == "Second": total_sec_semester_credit += int(i.course.credit) previousCGPA = 0 # previousLEVEL = 0 # calculate_cgpa for i in results: previousLEVEL = i.level try: a = Result.objects.get(student__student__pk=request.user.id, level=previousLEVEL, semester="Second") previousCGPA = a.cgpa break except: previousCGPA = 0 context = { "courses": courses, "results": results, "sorted_result": sorted_result, "student": student, 'total_first_semester_credit': total_first_semester_credit, 'total_sec_semester_credit': total_sec_semester_credit, 'total_first_and_second_semester_credit': total_first_semester_credit + total_sec_semester_credit, "previousCGPA": previousCGPA, } return render(request, 'result/grade_results.html', context) @login_required @student_required def assessment_result(request): student = Student.objects.get(student__pk=request.user.id) courses = TakenCourse.objects.filter(student__student__pk=request.user.id, course__level=student.level) result = Result.objects.filter(student__student__pk=request.user.id) context = { "courses": courses, "result": result, "student": student, } return render(request, 'result/assessment_results.html', context) @login_required @lecturer_required def result_sheet_pdf_view(request, id): current_semester = Semester.objects.get(is_current_semester=True) current_session = Session.objects.get(is_current_session=True) result = TakenCourse.objects.filter(course__pk=id) course = get_object_or_404(Course, id=id) no_of_pass = TakenCourse.objects.filter(course__pk=id, comment="PASS").count() no_of_fail = TakenCourse.objects.filter(course__pk=id, comment="FAIL").count() fname = str(current_semester) + '_semester_' + str(current_session) + '_' + str(course) + '_resultSheet.pdf' fname = fname.replace("/", "-") flocation = settings.MEDIA_ROOT + "/result_sheet/" + fname doc = SimpleDocTemplate(flocation, rightMargin=0, leftMargin=6.5 * cm, topMargin=0.3 * cm, bottomMargin=0) styles = getSampleStyleSheet() styles.add(ParagraphStyle( name="ParagraphTitle", fontSize=11, fontName="FreeSansBold")) Story = [Spacer(1,.2)] style = styles["Normal"] # picture = request.user.picture # l_pic = Image(picture, 1*inch, 1*inch) # l_pic.__setattr__("_offs_x", 200) # l_pic.__setattr__("_offs_y", -130) # Story.append(l_pic) # logo = settings.MEDIA_ROOT + "/logo/logo-mini.png" # im_logo = Image(logo, 1*inch, 1*inch) # im_logo.__setattr__("_offs_x", -218) # im_logo.__setattr__("_offs_y", -60) # Story.append(im_logo) logo = settings.MEDIA_ROOT + "/logo/you-logo-here.png" im = Image(logo, 1*inch, 1*inch) im.__setattr__("_offs_x", -200) im.__setattr__("_offs_y", -45) Story.append(im) style = getSampleStyleSheet() normal = style["Normal"] normal.alignment = TA_CENTER normal.fontName = "Helvetica" normal.fontSize = 12 normal.leading = 15 title = " "+str(current_semester) + " Semester " + str(current_session) + " Result Sheet" title = Paragraph(title.upper(), normal) Story.append(title) Story.append(Spacer(1,0.1*inch)) style = getSampleStyleSheet() normal = style["Normal"] normal.alignment = TA_CENTER normal.fontName = "Helvetica" normal.fontSize = 10 normal.leading = 15 title = "Course lecturer: " + request.user.get_full_name + "" title = Paragraph(title.upper(), normal) Story.append(title) Story.append(Spacer(1,0.1*inch)) normal = style["Normal"] normal.alignment = TA_CENTER normal.fontName = "Helvetica" normal.fontSize = 10 normal.leading = 15 level = result.filter(course_id=id).first() title = "Level: " + str(level.course.level) title = Paragraph(title.upper(), normal) Story.append(title) Story.append(Spacer(1,.6*inch)) elements = [] count = 0 header = [('S/N', 'ID NO.', 'FULL NAME', 'TOTAL', 'GRADE', 'POINT', 'COMMENT')] table_header = Table(header, [inch], [0.5*inch]) table_header.setStyle( TableStyle([ ('BACKGROUND',(0,0),(-1,-1),colors.black), ('TEXTCOLOR',(1,0),(-1,-1),colors.white), ('TEXTCOLOR',(0,0),(0,0),colors.cyan), ('ALIGN',(0,0),(-1,-1),'CENTER'), ('VALIGN',(0,0),(-1,-1),'MIDDLE'), ('BOX',(0,0),(-1,-1),1,colors.black), ])) Story.append(table_header) for student in result: data = [(count+1, student.student.student.username.upper(), Paragraph(student.student.student.get_full_name.capitalize(), styles['Normal']), student.total, student.grade, student.point, student.comment)] color = colors.black if student.grade == 'F': color = colors.red count += 1 t_body = Table(data, colWidths=[inch]) t_body.setStyle( TableStyle([ ('INNERGRID', (0,0), (-1,-1), 0.05, colors.black), ('BOX', (0,0), (-1,-1), 0.1, colors.black), ])) Story.append(t_body) Story.append(Spacer(1,1*inch)) style_right = ParagraphStyle(name='right', parent=styles['Normal'], alignment=TA_RIGHT) tbl_data = [ [Paragraph("Date:_____________________________", styles["Normal"]), Paragraph("No. of PASS: " + str(no_of_pass), style_right)], [Paragraph("Siganture / Stamp: _____________________________", styles["Normal"]), Paragraph("No. of FAIL: " + str(no_of_fail), style_right)]] tbl = Table(tbl_data) Story.append(tbl) doc.build(Story) fs = FileSystemStorage(settings.MEDIA_ROOT + "/result_sheet") with fs.open(fname) as pdf: response = HttpResponse(pdf, content_type='application/pdf') response['Content-Disposition'] = 'inline; filename=' + fname + '' return response return response @login_required @student_required def course_registration_form(request): current_semester = Semester.objects.get(is_current_semester=True) current_session = Session.objects.get(is_current_session=True) courses = TakenCourse.objects.filter(student__student__id=request.user.id) fname = request.user.username + '.pdf' fname = fname.replace("/", "-") # flocation = '/tmp/' + fname # print(MEDIA_ROOT + "\\" + fname) flocation = settings.MEDIA_ROOT + "/registration_form/" + fname doc = SimpleDocTemplate(flocation, rightMargin=15, leftMargin=15, topMargin=0, bottomMargin=0) styles = getSampleStyleSheet() Story = [Spacer(1,0.5)] Story.append(Spacer(1,0.4*inch)) style = styles["Normal"] style = getSampleStyleSheet() normal = style["Normal"] normal.alignment = TA_CENTER normal.fontName = "Helvetica" normal.fontSize = 12 normal.leading = 18 title = "EZOD UNIVERSITY OF TECHNOLOGY, ADAMA" title = Paragraph(title.upper(), normal) Story.append(title) style = getSampleStyleSheet() school = style["Normal"] school.alignment = TA_CENTER school.fontName = "Helvetica" school.fontSize = 10 school.leading = 18 school_title = "SCHOOL OF ELECTRICAL ENGINEERING & COMPUTING" school_title = Paragraph(school_title.upper(), school) Story.append(school_title) style = getSampleStyleSheet() Story.append(Spacer(1,0.1*inch)) department = style["Normal"] department.alignment = TA_CENTER department.fontName = "Helvetica" department.fontSize = 9 department.leading = 18 department_title = "DEPARTMENT OF COMPUTER SCIENCE & ENGINEERING" department_title = Paragraph(department_title, department) Story.append(department_title) Story.append(Spacer(1,.3*inch)) title = "STUDENT COURSE REGISTRATION FORM" title = Paragraph(title.upper(), normal) Story.append(title) student = Student.objects.get(student__pk=request.user.id) style_right = ParagraphStyle(name='right', parent=styles['Normal']) tbl_data = [ [Paragraph("Registration Number : " + request.user.username.upper() + "", styles["Normal"])], [Paragraph("Name : " + request.user.get_full_name.upper() + "", styles["Normal"])], [Paragraph("Session : " + current_session.session.upper() + "", styles["Normal"]), Paragraph("Level: " + student.level + "", styles["Normal"]) ]] tbl = Table(tbl_data) Story.append(tbl) Story.append(Spacer(1, 0.6*inch)) style = getSampleStyleSheet() semester = style["Normal"] semester.alignment = TA_LEFT semester.fontName = "Helvetica" semester.fontSize = 9 semester.leading = 18 semester_title = "FIRST SEMESTER" semester_title = Paragraph(semester_title, semester) Story.append(semester_title) elements = [] # FIRST SEMESTER count = 0 header = [('S/No', 'Course Code', 'Course Title', 'Unit', Paragraph('Name, Siganture of course lecturer & Date', style['Normal']))] table_header = Table(header,1*[1.4*inch], 1*[0.5*inch]) table_header.setStyle( TableStyle([ ('ALIGN',(-2,-2), (-2,-2),'CENTER'), ('VALIGN',(-2,-2), (-2,-2),'MIDDLE'), ('ALIGN',(1,0), (1,0),'CENTER'), ('VALIGN',(1,0), (1,0),'MIDDLE'), ('ALIGN',(0,0), (0,0),'CENTER'), ('VALIGN',(0,0), (0,0),'MIDDLE'), ('ALIGN',(-4,0), (-4,0),'LEFT'), ('VALIGN',(-4,0), (-4,0),'MIDDLE'), ('ALIGN',(-3,0), (-3,0),'LEFT'), ('VALIGN',(-3,0), (-3,0),'MIDDLE'), ('TEXTCOLOR',(0,-1),(-1,-1),colors.black), ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), ('BOX', (0,0), (-1,-1), 0.25, colors.black), ])) Story.append(table_header) first_semester_unit = 0 for course in courses: if course.course.semester == FIRST: first_semester_unit += int(course.course.credit) data = [(count+1, course.course.code.upper(), Paragraph(course.course.title, style['Normal']), course.course.credit, '')] color = colors.black count += 1 table_body=Table(data,1*[1.4*inch], 1*[0.3*inch]) table_body.setStyle( TableStyle([ ('ALIGN',(-2,-2), (-2,-2),'CENTER'), ('ALIGN',(1,0), (1,0),'CENTER'), ('ALIGN',(0,0), (0,0),'CENTER'), ('ALIGN',(-4,0), (-4,0),'LEFT'), ('TEXTCOLOR',(0,-1),(-1,-1),colors.black), ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), ('BOX', (0,0), (-1,-1), 0.25, colors.black), ])) Story.append(table_body) style = getSampleStyleSheet() semester = style["Normal"] semester.alignment = TA_LEFT semester.fontName = "Helvetica" semester.fontSize = 8 semester.leading = 18 semester_title = "Total Second First Credit : " + str(first_semester_unit) + "" semester_title = Paragraph(semester_title, semester) Story.append(semester_title) # FIRST SEMESTER ENDS HERE Story.append(Spacer(1, 0.6*inch)) style = getSampleStyleSheet() semester = style["Normal"] semester.alignment = TA_LEFT semester.fontName = "Helvetica" semester.fontSize = 9 semester.leading = 18 semester_title = "SECOND SEMESTER" semester_title = Paragraph(semester_title, semester) Story.append(semester_title) # SECOND SEMESTER count = 0 header = [('S/No', 'Course Code', 'Course Title', 'Unit', Paragraph('Name, Signature of course lecturer & Date', style['Normal']))] table_header = Table(header,1*[1.4*inch], 1*[0.5*inch]) table_header.setStyle( TableStyle([ ('ALIGN',(-2,-2), (-2,-2),'CENTER'), ('VALIGN',(-2,-2), (-2,-2),'MIDDLE'), ('ALIGN',(1,0), (1,0),'CENTER'), ('VALIGN',(1,0), (1,0),'MIDDLE'), ('ALIGN',(0,0), (0,0),'CENTER'), ('VALIGN',(0,0), (0,0),'MIDDLE'), ('ALIGN',(-4,0), (-4,0),'LEFT'), ('VALIGN',(-4,0), (-4,0),'MIDDLE'), ('ALIGN',(-3,0), (-3,0),'LEFT'), ('VALIGN',(-3,0), (-3,0),'MIDDLE'), ('TEXTCOLOR',(0,-1),(-1,-1),colors.black), ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), ('BOX', (0,0), (-1,-1), 0.25, colors.black), ])) Story.append(table_header) second_semester_unit = 0 for course in courses: if course.course.semester == SECOND: second_semester_unit += int(course.course.credit) data = [(count+1, course.course.code.upper(), Paragraph(course.course.title, style['Normal']), course.course.credit, '')] color = colors.black count += 1 table_body=Table(data,1*[1.4*inch], 1*[0.3*inch]) table_body.setStyle( TableStyle([ ('ALIGN',(-2,-2), (-2,-2),'CENTER'), ('ALIGN',(1,0), (1,0),'CENTER'), ('ALIGN',(0,0), (0,0),'CENTER'), ('ALIGN',(-4,0), (-4,0),'LEFT'), ('TEXTCOLOR',(0,-1),(-1,-1),colors.black), ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), ('BOX', (0,0), (-1,-1), 0.25, colors.black), ])) Story.append(table_body) style = getSampleStyleSheet() semester = style["Normal"] semester.alignment = TA_LEFT semester.fontName = "Helvetica" semester.fontSize = 8 semester.leading = 18 semester_title = "Total Second Semester Credit : " + str(second_semester_unit) + "" semester_title = Paragraph(semester_title, semester) Story.append(semester_title) Story.append(Spacer(1, 2)) style = getSampleStyleSheet() certification = style["Normal"] certification.alignment = TA_JUSTIFY certification.fontName = "Helvetica" certification.fontSize = 8 certification.leading = 18 student = Student.objects.get(student__pk=request.user.id) certification_text = "CERTIFICATION OF REGISTRATION: I certify that " + str(request.user.get_full_name.upper()) + "\ has been duly registered for the " + student.level + " level of study in the department\ of COMPUTER SICENCE & ENGINEERING and that the courses and credits registered are as approved by the senate of the University" certification_text = Paragraph(certification_text, certification) Story.append(certification_text) # FIRST SEMESTER ENDS HERE logo = MEDIA_ROOT + "/logo/you-logo-here.png" im_logo = Image(logo, 1*inch, 1*inch) im_logo.__setattr__("_offs_x", -218) im_logo.__setattr__("_offs_y", 480) Story.append(im_logo) picture = BASE_DIR + request.user.get_picture() im = Image(picture, 1.0*inch, 1.0*inch) im.__setattr__("_offs_x", 218) im.__setattr__("_offs_y", 550) Story.append(im) doc.build(Story) fs = FileSystemStorage(settings.MEDIA_ROOT + "/registration_form") with fs.open(fname) as pdf: response = HttpResponse(pdf, content_type='application/pdf') response['Content-Disposition'] = 'inline; filename='+fname+'' return response return response