download seat arrangement as spreadsheet
API and lots of stuff
This commit is contained in:
parent
c2d1831b8e
commit
d5dcdc8fc0
|
@ -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 }
|
||||
);
|
||||
},
|
||||
});
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in New Issue