@@ -723,3 +723,105 @@ def test_save_review_grants_two_times_does_not_create_duplicate_log_entries(rf,
723723 object_id = grant_1 .id ,
724724 change_message = "[Review Session] Pending status changed from 'None' to 'approved'." ,
725725 ).exists ()
726+
727+
728+ def test_save_review_grants_updates_internal_notes (rf , mocker ):
729+ mocker .patch ("reviews.admin.messages" )
730+
731+ user = UserFactory (is_staff = True , is_superuser = True )
732+ conference = ConferenceFactory ()
733+
734+ # Create review session for grants
735+ review_session = ReviewSessionFactory (
736+ conference = conference ,
737+ session_type = ReviewSession .SessionType .GRANTS ,
738+ status = ReviewSession .Status .COMPLETED ,
739+ )
740+ AvailableScoreOptionFactory (review_session = review_session , numeric_value = 0 )
741+ AvailableScoreOptionFactory (review_session = review_session , numeric_value = 1 )
742+
743+ # Create grants with different initial internal_notes
744+ grant_1 = GrantFactory (
745+ conference = conference , status = Grant .Status .pending , internal_notes = ""
746+ )
747+ grant_2 = GrantFactory (
748+ conference = conference ,
749+ status = Grant .Status .pending ,
750+ internal_notes = "Existing notes" ,
751+ )
752+ grant_3 = GrantFactory (
753+ conference = conference ,
754+ status = Grant .Status .pending ,
755+ internal_notes = "Notes to clear" ,
756+ )
757+
758+ # Build POST data with notes updates
759+ post_data = {
760+ f"decision-{ grant_1 .id } " : Grant .Status .pending ,
761+ f"notes-{ grant_1 .id } " : "New notes for grant 1" ,
762+ f"decision-{ grant_2 .id } " : Grant .Status .pending ,
763+ f"notes-{ grant_2 .id } " : "Updated notes for grant 2" ,
764+ f"decision-{ grant_3 .id } " : Grant .Status .pending ,
765+ f"notes-{ grant_3 .id } " : "" , # Clear notes
766+ }
767+
768+ request = rf .post ("/" , data = post_data )
769+ request .user = user
770+
771+ admin = ReviewSessionAdmin (ReviewSession , AdminSite ())
772+ response = admin ._review_grants_recap_view (request , review_session )
773+
774+ # Should redirect after successful save
775+ assert response .status_code == 302
776+
777+ # Refresh grants from database
778+ grant_1 .refresh_from_db ()
779+ grant_2 .refresh_from_db ()
780+ grant_3 .refresh_from_db ()
781+
782+ # Verify internal notes were updated
783+ assert grant_1 .internal_notes == "New notes for grant 1"
784+ assert grant_2 .internal_notes == "Updated notes for grant 2"
785+ assert grant_3 .internal_notes == ""
786+
787+
788+ def test_save_review_grants_does_not_update_unchanged_internal_notes (rf , mocker ):
789+ mocker .patch ("reviews.admin.messages" )
790+
791+ user = UserFactory (is_staff = True , is_superuser = True )
792+ conference = ConferenceFactory ()
793+
794+ # Create review session for grants
795+ review_session = ReviewSessionFactory (
796+ conference = conference ,
797+ session_type = ReviewSession .SessionType .GRANTS ,
798+ status = ReviewSession .Status .COMPLETED ,
799+ )
800+ AvailableScoreOptionFactory (review_session = review_session , numeric_value = 0 )
801+ AvailableScoreOptionFactory (review_session = review_session , numeric_value = 1 )
802+
803+ # Create grant with existing notes
804+ grant_1 = GrantFactory (
805+ conference = conference ,
806+ status = Grant .Status .pending ,
807+ internal_notes = "Existing notes" ,
808+ )
809+
810+ # Submit the same notes (no change)
811+ post_data = {
812+ f"decision-{ grant_1 .id } " : Grant .Status .pending ,
813+ f"notes-{ grant_1 .id } " : "Existing notes" ,
814+ }
815+
816+ request = rf .post ("/" , data = post_data )
817+ request .user = user
818+
819+ admin = ReviewSessionAdmin (ReviewSession , AdminSite ())
820+ response = admin ._review_grants_recap_view (request , review_session )
821+
822+ assert response .status_code == 302
823+
824+ grant_1 .refresh_from_db ()
825+
826+ # Notes should remain unchanged
827+ assert grant_1 .internal_notes == "Existing notes"
0 commit comments