download seat arrangement as spreadsheet

API and lots of stuff
This commit is contained in:
Pranav Jerry 2023-06-12 20:53:13 +05:30
parent c2d1831b8e
commit d5dcdc8fc0
Signed by: pranav
GPG Key ID: F1DCDC4FED0A0C5B
10 changed files with 114 additions and 47 deletions

View File

@ -21,6 +21,11 @@ frappe.ui.form.on("Exam Group", {
});
frm.change_custom_button_type("Generate duty list", null, "primary");
}
if (frm.doc.seat_arrangement_created != 0) {
frm.add_custom_button("Download seat arrangement", () => {
frm.trigger("download_seat_arrangement");
});
}
},
allocate_exam_halls(frm) {
frm.set_value("allocate_rooms", true);
@ -35,4 +40,10 @@ frappe.ui.form.on("Exam Group", {
frm.set_value("create_seat_arrangement", true);
frm.save();
},
download_seat_arrangement(frm) {
open_url_post(
"/api/method/exam_helper.exam_helper.doctype.exam_group.exam_group.seats_spreadsheet",
{ name: frm.doc.name }
);
},
});

View File

@ -144,7 +144,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2023-05-21 22:13:44.855255",
"modified": "2023-06-12 20:52:14.083993",
"modified_by": "Administrator",
"module": "Exam Helper",
"name": "Exam Group",

View File

@ -2,8 +2,12 @@
# For license information, please see license.txt
import frappe
# import pyexcel
from frappe.model.document import Document
from operator import itemgetter
from io import BytesIO
from pyexcel_xlsx import save_data
class ExamGroup(Document):
@ -61,8 +65,8 @@ class ExamGroup(Document):
students = []
for student in exam.students:
students.append(student.id)
students.sort()
students_by_exams.append(students)
students.sort()
students_by_exams.append(students)
return students_by_exams
def randomize_students_by_exam(self):
@ -106,18 +110,18 @@ class ExamGroup(Document):
number_of_students = exam_hall.seating_capacity
else:
number_of_students = remaining_students
remaining_students -= number_of_students
e = frappe.new_doc("Exam Hall Child")
e.update(
{
"id": exam_hall.name,
"parent": self.name,
"parentfield": "allocated_rooms",
"parenttype": self.doctype,
"number_of_students": number_of_students,
}
)
# e.save()
remaining_students -= number_of_students
e = frappe.new_doc("Exam Hall Child")
e.update(
{
"id": exam_hall.name,
"parent": self.name,
"parentfield": "allocated_rooms",
"parenttype": self.doctype,
"number_of_students": number_of_students,
}
)
# e.save()
print(vars(self))
self.allocated_rooms.append(e)
@ -129,8 +133,8 @@ class ExamGroup(Document):
invigilators_required = room.number_of_students // 30
if invigilators_required == 0:
invigilators_required += 1
total_invigilators_required += invigilators_required
print(total_invigilators_required)
total_invigilators_required += invigilators_required
print(total_invigilators_required)
for i in range(total_invigilators_required):
if not all_staff:
# (
@ -147,22 +151,22 @@ class ExamGroup(Document):
# then by descending order of joining date
all_staff.sort(key=itemgetter(1), reverse=True)
print(all_staff)
staff = all_staff.pop(0)[2]
staff = frappe.get_doc("Staff", staff)
print(staff)
invigilator_child = frappe.new_doc("Invigilator And Duty")
invigilator_child.update(
{
"invigilator": staff.name,
"invigilator_name": staff.full_name,
"invigilator_department": staff.department,
"parent": self.name,
"parentfield": "duties",
"parenttype": self.doctype,
}
)
print(invigilator_child)
self.duties.append(invigilator_child)
staff = all_staff.pop(0)[2]
staff = frappe.get_doc("Staff", staff)
print(staff)
invigilator_child = frappe.new_doc("Invigilator And Duty")
invigilator_child.update(
{
"invigilator": staff.name,
"invigilator_name": staff.full_name,
"invigilator_department": staff.department,
"parent": self.name,
"parentfield": "duties",
"parenttype": self.doctype,
}
)
print(invigilator_child)
self.duties.append(invigilator_child)
def generate_seat_arrangement(self):
print("randomizing students")
@ -182,3 +186,55 @@ class ExamGroup(Document):
seat.parenttype = self.doctype
print("adding", seat.candidate, "to seat", seat.seat_number)
self.seat_arrangement.append(seat)
def get_allocated_rooms(self):
rooms = []
for room in self.allocated_rooms:
rooms.append(room.id)
return rooms
def get_seat_arrangement(self, room):
seats = []
for seat in self.seat_arrangement:
if seat.exam_hall == room:
seats.append((seat.candidate, seat.seat_number))
return seats
def get_rooms_and_seats(self):
data = {}
rooms = self.get_allocated_rooms()
for room in rooms:
data[room] = self.get_seat_arrangement(room)
return data
def get_rooms_spreadsheet_as_binary(self):
stream = BytesIO()
save_data(stream, self.get_rooms_and_seats())
return stream.getbuffer()
def attach_seat_arrangement_spreadsheet(self):
seats_file = frappe.new_doc("File")
seats_file.file_name = "Seat arrangement " + self.name + ".xlsx"
seats_file.content = self.get_rooms_spreadsheet_as_binary()
seats_file.attached_to_doctype = self.doctype
seats_file.attached_to_name = self.name
seats_file.parent = self.name
seats_file.parentfield = "seat_arrangement_file"
seats_file.parenttype = self.doctype
seats_file.is_private = 1
seats_file.flags["for_update"] = None
seats_file.module = None
seats_file.folder = "Home/Attachments"
seats_file.attached_to_field = "seat_arrangement_file"
seats_file.insert()
return seats_file
@frappe.whitelist()
def seats_spreadsheet(name):
exam_group = frappe.get_doc("Exam Group", name)
content = exam_group.get_rooms_spreadsheet_as_binary()
frappe.response.filename = "Seat arrangement " + name + ".xlsx"
frappe.response.filecontent = content
frappe.response.type = "download"
frappe.response.display_content_as = "attachment"

View File

@ -10,8 +10,8 @@
"documentation_url": "https://example.org",
"idx": 0,
"is_complete": 0,
"modified": "2023-05-21 22:25:11.524321",
"modified_by": "Administrator",
"modified": "2023-05-23 20:13:43.851075",
"modified_by": "examhead@example.org",
"module": "Exam Helper",
"name": "First steps",
"owner": "Administrator",

View File

@ -7,8 +7,8 @@
"is_complete": 0,
"is_single": 0,
"is_skipped": 0,
"modified": "2023-05-19 18:03:47.186458",
"modified_by": "Administrator",
"modified": "2023-05-23 20:04:49.315076",
"modified_by": "examhead@example.org",
"name": "Create exams",
"owner": "Administrator",
"reference_document": "Exam",

View File

@ -8,8 +8,8 @@
"is_complete": 0,
"is_single": 0,
"is_skipped": 0,
"modified": "2023-05-21 21:53:02.968686",
"modified_by": "Administrator",
"modified": "2023-05-23 20:02:25.228321",
"modified_by": "examhead@example.org",
"name": "Create students",
"owner": "Administrator",
"reference_document": "Student",

View File

@ -8,8 +8,8 @@
"is_complete": 0,
"is_single": 0,
"is_skipped": 0,
"modified": "2023-05-21 22:03:01.026619",
"modified_by": "Administrator",
"modified": "2023-05-23 20:08:02.597123",
"modified_by": "examhead@example.org",
"name": "Exam halls",
"owner": "Administrator",
"reference_document": "Exam Hall",

View File

@ -8,8 +8,8 @@
"is_complete": 0,
"is_single": 0,
"is_skipped": 0,
"modified": "2023-05-21 22:22:41.602331",
"modified_by": "Administrator",
"modified": "2023-05-23 20:11:20.144188",
"modified_by": "examhead@example.org",
"name": "Group exams",
"owner": "Administrator",
"path": "/app/auto-exam-group/view/list",

View File

@ -8,8 +8,8 @@
"is_complete": 0,
"is_single": 0,
"is_skipped": 0,
"modified": "2023-05-21 22:23:48.809916",
"modified_by": "Administrator",
"modified": "2023-05-23 20:08:38.121046",
"modified_by": "examhead@example.org",
"name": "Group exams manually",
"owner": "Administrator",
"reference_document": "Exam Group",

View File

@ -8,8 +8,8 @@
"is_complete": 0,
"is_single": 0,
"is_skipped": 0,
"modified": "2023-05-21 21:48:28.915663",
"modified_by": "Administrator",
"modified": "2023-05-23 19:33:43.890697",
"modified_by": "pranav@example.org",
"name": "Invigilators",
"owner": "Administrator",
"reference_document": "Staff",