@@ -307,12 +307,11 @@ def take_attendance_view(request, scheduled_activity_id):
307307 status = 403 ,
308308 )
309309
310- if "att_code_mode" in request .POST :
311- selected_mode = int (request .POST ["att_code_mode" ])
312- if scheduled_activity .code_mode != selected_mode :
313- scheduled_activity .set_code_mode (selected_mode )
314- redirect_url = reverse (url_name , args = [scheduled_activity .id ])
315- return redirect (redirect_url )
310+ att_code_mode = request .POST .get ("att_code_mode" )
311+ if att_code_mode is not None and int (att_code_mode ) != scheduled_activity .code_mode :
312+ scheduled_activity .set_code_mode (int (att_code_mode ))
313+ redirect_url = reverse (url_name , args = [scheduled_activity .id ])
314+ return redirect (redirect_url )
316315
317316 if not scheduled_activity .block .locked and request .user .is_eighth_admin :
318317 messages .success (request , "Note: Taking attendance on an unlocked block." )
@@ -363,6 +362,7 @@ def take_attendance_view(request, scheduled_activity_id):
363362
364363 present_signups = EighthSignup .objects .filter (scheduled_activity = scheduled_activity , user__in = present_user_ids )
365364 present_signups .update (was_absent = False )
365+ present_signups .update (attendance_marked = True )
366366
367367 for s in present_signups :
368368 invalidate_obj (s )
@@ -430,7 +430,7 @@ def take_attendance_view(request, scheduled_activity_id):
430430 "show_checkboxes" : (scheduled_activity .block .locked or request .user .is_eighth_admin ),
431431 "show_icons" : (scheduled_activity .block .locked and scheduled_activity .block .attendance_locked () and not request .user .is_eighth_admin ),
432432 "bbcu_script" : settings .BBCU_SCRIPT ,
433- "qrurl " : request .build_absolute_uri (reverse ("qr_attendance" , args = [scheduled_activity .id , scheduled_activity .attendance_code ])),
433+ "qr_url " : request .build_absolute_uri (reverse ("qr_attendance" , args = [scheduled_activity .id , scheduled_activity .attendance_code ])),
434434 }
435435
436436 if request .user .is_eighth_admin :
@@ -540,7 +540,9 @@ def accept_all_passes_view(request, scheduled_activity_id):
540540 if not can_accept :
541541 return render (request , "error/403.html" , {"reason" : "You do not have permission to take accept these passes." }, status = 403 )
542542
543- EighthSignup .objects .filter (after_deadline = True , scheduled_activity = scheduled_activity ).update (pass_accepted = True , was_absent = False )
543+ EighthSignup .objects .filter (after_deadline = True , scheduled_activity = scheduled_activity ).update (
544+ pass_accepted = True , was_absent = False , attendance_taken = True
545+ )
544546 invalidate_obj (scheduled_activity )
545547
546548 if "admin" in request .path :
@@ -774,71 +776,92 @@ def email_students_view(request, scheduled_activity_id):
774776
775777@login_required
776778@deny_restricted
777- def student_attendance_view (request , attc = None , attf = None , attimef = None , atteachf = None ):
779+ def student_attendance_view (request ):
778780 blocks = EighthBlock .objects .get_blocks_today ()
781+ mark_block = None
782+ mark_result = None
779783 if request .method == "POST" :
780784 now = timezone .localtime ()
781- dayblks = Day .objects .select_related ("day_type" ).get (date = now ).day_type .blocks
782- for blk in blocks :
783- blklet = blk .block_letter
784- code = request .POST .get (blklet )
785+ try :
786+ day_blocks = Day .objects .select_related ("day_type" ).get (date = now ).day_type .blocks
787+ except Day .DoesNotExist :
788+ messages .error (request , "Error. Attendance is only available on school days." )
789+ return redirect ("index" )
790+ for block in blocks :
791+ block_letter = block .block_letter
792+ code = request .POST .get (block_letter )
785793 if code is None :
786794 continue
787- act = request .user .eighthscheduledactivity_set .get (block = blk )
795+ act = request .user .eighthscheduledactivity_set .get (block = block )
788796 if act .get_code_mode_display () == "Auto" :
789797 try :
790- dayblk = dayblks .get (name = "8" + blklet )
798+ day_block = day_blocks .get (name = "8" + block_letter )
791799 except Exception :
792- attimef = blk
800+ mark_result = "invalid_time"
801+ mark_block = block
793802 break
794- start_time = shift_time (tm (hour = dayblk .start .hour , minute = dayblk .start .minute ), - 20 )
795- end_time = shift_time (tm (hour = dayblk .end .hour , minute = dayblk .end .minute ), 20 )
803+ start_time = shift_time (tm (hour = day_block .start .hour , minute = day_block .start .minute ), - 20 )
804+ end_time = shift_time (tm (hour = day_block .end .hour , minute = day_block .end .minute ), 20 )
796805 if not start_time <= now .time () <= end_time :
797- attimef = blk
806+ mark_result = "invalid_time"
807+ mark_block = block
798808 break
799809 elif act .get_code_mode_display () == "Closed" :
800- atteachf = blk
810+ mark_result = "code_closed"
811+ mark_block = block
801812 break
802813 code = code .upper ()
803814 if code == act .attendance_code :
804815 try :
805816 present = EighthSignup .objects .get (scheduled_activity = act , user__in = [request .user .id ])
806817 present .was_absent = False
818+ present .attendance_marked = True
807819 invalidate_obj (present )
808820 act .attendance_taken = True
809821 act .save ()
810822 invalidate_obj (act )
811- attc = blk
823+ mark_result = "code_correct"
824+ mark_block = block
812825 except Exception :
813- attf = blk
826+ mark_result = "code_fail"
827+ mark_block = block
814828 break
815829 else :
816- attf = blk
830+ mark_result = "code_fail"
831+ mark_block = block
817832 break
818- return student_frontend (request , attc , attf , attimef , atteachf )
833+ return student_frontend (request , mark_block , mark_result )
819834
820835
821836@login_required
822837@deny_restricted
823- def student_frontend (request , attc = None , attf = None , attimef = None , atteachf = None ):
838+ def student_frontend (request , mark_block : EighthBlock = None , mark_result : str = None ):
824839 blocks = EighthBlock .objects .get_blocks_today ()
825840 if blocks :
826841 sch_acts = []
827842 att_marked = []
828- for b in blocks :
843+ for block in blocks :
829844 try :
830- act = request .user .eighthscheduledactivity_set .get (block = b )
845+ act = request .user .eighthscheduledactivity_set .get (block = block )
831846 if act .activity .name != "z - Hybrid Sticky" :
832- sch_acts .append ([b , act , ", " .join ([r .name for r in act .get_true_rooms ()]), ", " .join ([s .name for s in act .get_true_sponsors ()])])
847+ sch_acts .append (
848+ [block , act , ", " .join ([r .name for r in act .get_true_rooms ()]), ", " .join ([s .name for s in act .get_true_sponsors ()])]
849+ )
833850 signup = EighthSignup .objects .get (user = request .user , scheduled_activity = act )
834- if not signup .was_absent :
835- att_marked .append (b )
851+ if signup .attendance_marked :
852+ att_marked .append (block )
836853 except EighthScheduledActivity .DoesNotExist :
837- sch_acts .append ([b , None ])
854+ sch_acts .append ([block , None ])
855+ results = {
856+ "code_correct" : '<p style="color: green;">Attendance marked successfully.</p>' ,
857+ "code_closed" : '<p style="color: red;">Error. Ask your teacher to open the attendance code.</p>' ,
858+ "code_fail" : '<p style="color: red;">Invalid Code.</p>' ,
859+ "invalid_time" : f'<p style="color: red;">Invalid time. Please fill this out during { block .block_letter } block.</p>' ,
860+ }
838861 response = render (
839862 request ,
840863 "eighth/student_submit_attendance.html" ,
841- context = {"sch_acts" : sch_acts , "att_marked" : att_marked , "attc " : attc , "attf " : attf , "attimef" : attimef , "atteachf" : atteachf },
864+ context = {"sch_acts" : sch_acts , "att_marked" : att_marked , "mark_block " : mark_block , "attendance_result " : results . get ( mark_result ) },
842865 )
843866 else :
844867 messages .error (request , "There are no eighth period blocks scheduled today." )
@@ -852,25 +875,22 @@ def qr_attendance_view(request, act_id, code):
852875 act = get_object_or_404 (EighthScheduledActivity , id = act_id )
853876 error = False
854877 block = act .block
855- attc = None
856- attf = None
857- attimef = None
858- atteachf = None
878+ mark_result = None
859879 if act .get_code_mode_display () == "Auto" :
860880 now = timezone .localtime ()
861- dayblks = Day .objects .select_related ("day_type" ).get (date = now ).day_type .blocks
881+ day_blocks = Day .objects .select_related ("day_type" ).get (date = now ).day_type .blocks
862882 try :
863- dayblk = dayblks .get (name = "8" + block .block_letter )
864- start_time = shift_time (tm (hour = dayblk .start .hour , minute = dayblk .start .minute ), - 20 )
865- end_time = shift_time (tm (hour = dayblk .end .hour , minute = dayblk .end .minute ), 20 )
883+ day_block = day_blocks .get (name = "8" + block .block_letter )
884+ start_time = shift_time (tm (hour = day_block .start .hour , minute = day_block .start .minute ), - 20 )
885+ end_time = shift_time (tm (hour = day_block .end .hour , minute = day_block .end .minute ), 20 )
866886 if not start_time <= now .time () <= end_time :
867- attimef = block
887+ mark_result = "invalid_time"
868888 error = True
869889 except Exception :
870- attimef = block
890+ mark_result = "invalid_time"
871891 error = True
872892 elif act .get_code_mode_display () == "Closed" :
873- atteachf = block
893+ mark_result = "code_closed"
874894 error = True
875895 if not error :
876896 code = code .upper ()
@@ -882,14 +902,14 @@ def qr_attendance_view(request, act_id, code):
882902 act .attendance_taken = True
883903 act .save ()
884904 invalidate_obj (act )
885- attc = block
905+ mark_result = "code_correct"
886906 messages .success (request , "Attendance marked." )
887907 except Exception :
888- attf = block
908+ mark_result = "code_fail"
889909 messages .error (request , "Failed to mark attendance." )
890910 else :
891- attf = block
911+ mark_result = "code_fail"
892912 messages .error (request , "Failed to mark attendance." )
893913 else :
894914 messages .error (request , "Failed to mark attendance." )
895- return student_frontend (request , attc , attf , attimef , atteachf )
915+ return student_frontend (request , block , mark_result )
0 commit comments