SEBSERV-139 added GUI in Exam-Config
This commit is contained in:
		
							parent
							
								
									2bea1f25c6
								
							
						
					
					
						commit
						9923e06029
					
				
					 3 changed files with 141 additions and 33 deletions
				
			
		|  | @ -0,0 +1,65 @@ | |||
| /* | ||||
|  * Copyright (c) 2020 ETH Zürich, Educational Development and Technology (LET) | ||||
|  * | ||||
|  * This Source Code Form is subject to the terms of the Mozilla Public | ||||
|  * License, v. 2.0. If a copy of the MPL was not distributed with this | ||||
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||
|  */ | ||||
| 
 | ||||
| package ch.ethz.seb.sebserver.gui.service.examconfig.impl.rules; | ||||
| 
 | ||||
| import org.apache.commons.lang3.BooleanUtils; | ||||
| import org.springframework.context.annotation.Lazy; | ||||
| import org.springframework.stereotype.Service; | ||||
| 
 | ||||
| import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationAttribute; | ||||
| import ch.ethz.seb.sebserver.gbl.model.sebconfig.ConfigurationValue; | ||||
| import ch.ethz.seb.sebserver.gbl.profile.GuiProfile; | ||||
| import ch.ethz.seb.sebserver.gui.service.examconfig.ValueChangeRule; | ||||
| import ch.ethz.seb.sebserver.gui.service.examconfig.impl.ViewContext; | ||||
| 
 | ||||
| @Lazy | ||||
| @Service | ||||
| @GuiProfile | ||||
| public class ProcotringViewRules implements ValueChangeRule { | ||||
| 
 | ||||
|     public static final String KEY_ENABLE_AI = "proctoringAIEnable"; | ||||
|     public static final String KEY_ENABLE_JITSI = "jitsiMeetEnable"; | ||||
| 
 | ||||
|     public static final String JITSI_GROUP_FEATURES = "jitsiMeetFeatureFlagChat"; | ||||
|     public static final String JITSI_GROUP_CONTROLS = "jitsiMeetAudioMuted"; | ||||
| 
 | ||||
|     public static final String AI_GROUP_FACE_NUMBER = "proctoringDetectFaceCount"; | ||||
|     public static final String AI_GROUP_FACE_ANGLE = "proctoringDetectFaceYaw"; | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean observesAttribute(final ConfigurationAttribute attribute) { | ||||
|         return KEY_ENABLE_AI.equals(attribute.name) || KEY_ENABLE_JITSI.equals(attribute.name); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void applyRule( | ||||
|             final ViewContext context, | ||||
|             final ConfigurationAttribute attribute, | ||||
|             final ConfigurationValue value) { | ||||
| 
 | ||||
|         if (KEY_ENABLE_JITSI.equals(attribute.name)) { | ||||
|             if (BooleanUtils.toBoolean(value.value)) { | ||||
|                 context.enableGroup(JITSI_GROUP_FEATURES); | ||||
|                 context.enableGroup(JITSI_GROUP_CONTROLS); | ||||
|             } else { | ||||
|                 context.disableGroup(JITSI_GROUP_FEATURES); | ||||
|                 context.disableGroup(JITSI_GROUP_CONTROLS); | ||||
|             } | ||||
|         } else if (KEY_ENABLE_AI.equals(attribute.name)) { | ||||
|             if (BooleanUtils.toBoolean(value.value)) { | ||||
|                 context.enableGroup(AI_GROUP_FACE_NUMBER); | ||||
|                 context.enableGroup(AI_GROUP_FACE_ANGLE); | ||||
|             } else { | ||||
|                 context.disableGroup(AI_GROUP_FACE_NUMBER); | ||||
|                 context.disableGroup(AI_GROUP_FACE_ANGLE); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | @ -41,4 +41,33 @@ INSERT IGNORE INTO configuration_attribute VALUES | |||
|     ; | ||||
|      | ||||
| INSERT INTO orientation (config_attribute_id, template_id, view_id, group_id, x_position, y_position, width, height, title) VALUES | ||||
|     (1102, 0,  @proct_view_id, null, 1, 1, 2, 1, 'NONE'); | ||||
|     (1129, 0,  @proct_view_id, null, 3, 1, 3, 1, 'LEFT_SPAN'), | ||||
|     (1130, 0,  @proct_view_id, null, 0, 2, 6, 1, 'NONE'), | ||||
|     (1131, 0,  @proct_view_id, null, 0, 3, 6, 1, 'NONE'), | ||||
|     (1132, 0,  @proct_view_id, null, 0, 4, 6, 1, 'NONE'), | ||||
|     (1133, 0,  @proct_view_id, null, 0, 5, 6, 1, 'NONE'), | ||||
|      | ||||
|     (1102, 0,  @proct_view_id, null, 6, 1, 6, 1, 'NONE'), | ||||
|      | ||||
|     (1103, 0,  @proct_view_id, 'jitsi_features', 6, 2, 6, 1, 'NONE'), | ||||
|     (1106, 0,  @proct_view_id, 'jitsi_features', 6, 3, 6, 1, 'NONE'), | ||||
|     (1108, 0,  @proct_view_id, 'jitsi_features', 6, 4, 6, 1, 'NONE'), | ||||
|     (1104, 0,  @proct_view_id, 'jitsi_features', 6, 5, 6, 1, 'NONE'), | ||||
|     (1105, 0,  @proct_view_id, 'jitsi_features', 6, 6, 6, 1, 'NONE'), | ||||
|      | ||||
|     (1100, 0,  @proct_view_id, 'jitsi_controls', 6, 8, 6, 1, 'NONE'), | ||||
|     (1116, 0,  @proct_view_id, 'jitsi_controls', 6, 9, 6, 1, 'NONE'), | ||||
|     (1101, 0,  @proct_view_id, 'jitsi_controls', 6, 10, 6, 1, 'NONE'), | ||||
|      | ||||
|     (1120, 0,  @proct_view_id, null, 0, 7, 6, 1, 'NONE'), | ||||
|      | ||||
|     (1122, 0,  @proct_view_id, 'ai_faces_number', 0, 8, 6, 1, 'NONE'), | ||||
|     (1123, 0,  @proct_view_id, 'ai_faces_number', 0, 9, 6, 1, 'NONE'), | ||||
|      | ||||
|     (1125, 0,  @proct_view_id, 'ai_faces_angle', 0, 11, 6, 1, 'NONE'), | ||||
|     (1124, 0,  @proct_view_id, 'ai_faces_angle', 0, 12, 6, 1, 'NONE'), | ||||
|     (1121, 0,  @proct_view_id, 'ai_faces_angle', 0, 13, 6, 1, 'NONE') | ||||
|     ; | ||||
|      | ||||
|      | ||||
|      | ||||
|  | @ -1246,72 +1246,86 @@ sebserver.examconfig.props.label.enableF10=Enable F10 | |||
| sebserver.examconfig.props.label.enableF11=Enable F11 | ||||
| sebserver.examconfig.props.label.enableF12=Enable F12 | ||||
| 
 | ||||
| sebserver.examconfig.props.group.jitsi_features=Jitsi Meet Features | ||||
| sebserver.examconfig.props.group.jitsi_features.tooltip= | ||||
| sebserver.examconfig.props.group.jitsi_controls=Jitsi Meet User Controls | ||||
| sebserver.examconfig.props.group.jitsi_controls.tooltip=When the proctoring view is disabled (see its display policy on left), users can mute and unmute audio and video manually.<br/>Audio and video streams can be disabled globally with the settings below. | ||||
| sebserver.examconfig.props.label.jitsiMeetAudioMuted=Audio Initially Muted | ||||
| sebserver.examconfig.props.label.jitsiMeetAudioMuted.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetAudioMuted.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetAudioOnly=Audio Only | ||||
| sebserver.examconfig.props.label.jitsiMeetAudioOnly.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetAudioOnly.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetEnable=Enable Jitsi Meet | ||||
| sebserver.examconfig.props.label.jitsiMeetEnable.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetEnable.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagChat=Enable Chat | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagChat.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagChat.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagCloseCaptions=Enable Close Captions | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagCloseCaptions.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagCloseCaptions.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagDisplayMeetingName=Display Meeting Name | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagDisplayMeetingName.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagRaiseHand=Enable Raise Hand | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagRaiseHand.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagRaiseHand.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagRecording=Allow Recording | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagRecording.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagRecording.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagTileView=Allow Tile View | ||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagTileView.tooltip=Note: Disabling Allow Tile View is not yet functional in this version. | ||||
| sebserver.examconfig.props.label.jitsiMeetRoom=Room | ||||
| sebserver.examconfig.props.label.jitsiMeetRoom.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetRoom.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetServerURL=Server URL | ||||
| sebserver.examconfig.props.label.jitsiMeetServerURL.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetServerURL.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetSubject=Subject | ||||
| sebserver.examconfig.props.label.jitsiMeetSubject.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetSubject.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetToken=Token | ||||
| sebserver.examconfig.props.label.jitsiMeetToken.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetToken.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetUserInfoAvatarURL=Avatar URL | ||||
| sebserver.examconfig.props.label.jitsiMeetUserInfoAvatarURL.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetUserInfoAvatarURL.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetUserInfoDisplayName=Display Name | ||||
| sebserver.examconfig.props.label.jitsiMeetUserInfoDisplayName.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetUserInfoDisplayName.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetUserInfoEMail=Info Mail | ||||
| sebserver.examconfig.props.label.jitsiMeetUserInfoEMail.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetUserInfoEMail.tooltip= | ||||
| sebserver.examconfig.props.label.jitsiMeetVideoMuted=Video Initially Muted | ||||
| sebserver.examconfig.props.label.jitsiMeetVideoMuted.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetReceiveAudio=Receive Audio | ||||
| sebserver.examconfig.props.label.jitsiMeetReceiveAudio.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetReceiveVideo=Receive Video | ||||
| sebserver.examconfig.props.label.jitsiMeetReceiveVideo.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetSendAudio=Send Audio | ||||
| sebserver.examconfig.props.label.jitsiMeetSendAudio.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetSendVideo=Send Video | ||||
| sebserver.examconfig.props.label.jitsiMeetSendVideo.tooltip | ||||
| sebserver.examconfig.props.label.proctoringAIEnable=Enable AI Proctoring | ||||
| sebserver.examconfig.props.label.proctoringAIEnable.tooltip | ||||
| sebserver.examconfig.props.label.jitsiMeetVideoMuted.tooltip= | ||||
| 
 | ||||
| sebserver.examconfig.props.label.jitsiMeetReceiveAudio=Receive Audio | ||||
| sebserver.examconfig.props.label.jitsiMeetReceiveAudio.tooltip=Global settings for receiving and sending audio/video streams.<br/>Streams can also be enabled/disabled by SEB Server during the exam session. | ||||
| sebserver.examconfig.props.label.jitsiMeetReceiveVideo=Receive Video | ||||
| sebserver.examconfig.props.label.jitsiMeetReceiveVideo.tooltip=Global settings for receiving and sending audio/video streams.<br/>Streams can also be enabled/disabled by SEB Server during the exam session. | ||||
| sebserver.examconfig.props.label.jitsiMeetSendAudio=Send Audio | ||||
| sebserver.examconfig.props.label.jitsiMeetSendAudio.tooltip=Global settings for receiving and sending audio/video streams.<br/>Streams can also be enabled/disabled by SEB Server during the exam session. | ||||
| sebserver.examconfig.props.label.jitsiMeetSendVideo=Send Video | ||||
| sebserver.examconfig.props.label.jitsiMeetSendVideo.tooltip=Global settings for receiving and sending audio/video streams.<br/>Streams can also be enabled/disabled by SEB Server during the exam session. | ||||
| 
 | ||||
| sebserver.examconfig.props.label.proctoringAIEnable=Enable AI Proctoring | ||||
| sebserver.examconfig.props.label.proctoringAIEnable.tooltip=AI proctoring features use computer vision algorithms, which are performed on the video frames on-device not in any cloud and not in SEB Server.<br/>If one of the events enabled below is detected, then it is logged in text form and send to SEB Server instance (if connected to one). | ||||
| 
 | ||||
| sebserver.examconfig.props.group.ai_faces_number=Detect Number of Faces | ||||
| sebserver.examconfig.props.group.ai_faces_number.tooltip=SEB is using the iOS Vision framework running on device for this detection.<br/>No face recognition is performed, only face and face features detection and tracking (looking for faces, not for faces of particular people). | ||||
| sebserver.examconfig.props.group.ai_faces_angle=Detect Face Angle | ||||
| sebserver.examconfig.props.group.ai_faces_angle.tooltip=SEB is using the iOS Vision framework running on device for this detection.<br/>No face recognition is performed, only face and face features detection and tracking (looking for faces, not for faces of particular people). | ||||
| sebserver.examconfig.props.label.proctoringDetectFaceCount=Number of Faces | ||||
| sebserver.examconfig.props.label.proctoringDetectFaceCount.tooltip | ||||
| sebserver.examconfig.props.label.proctoringDetectFaceCount.tooltip= | ||||
| sebserver.examconfig.props.label.proctoringDetectFaceCountDisplay=Feedback for Candidate | ||||
| sebserver.examconfig.props.label.proctoringDetectFaceCountDisplay.tooltip | ||||
| sebserver.examconfig.props.label.proctoringDetectFaceCountDisplay.tooltip= | ||||
| sebserver.examconfig.props.label.proctoringDetectFacePitch=Face Movement Up & Down (Pitch) | ||||
| sebserver.examconfig.props.label.proctoringDetectFacePitch.tooltip | ||||
| sebserver.examconfig.props.label.proctoringDetectFacePitch.tooltip= | ||||
| sebserver.examconfig.props.label.proctoringDetectFaceYaw=Face Movement Sideways (Yaw) | ||||
| sebserver.examconfig.props.label.proctoringDetectFaceYaw.tooltip | ||||
| sebserver.examconfig.props.label.proctoringDetectFaceYaw.tooltip= | ||||
| sebserver.examconfig.props.label.proctoringDetectFaceAngleDisplay=Feedback for Candidate | ||||
| sebserver.examconfig.props.label.proctoringDetectFaceAngleDisplay.tooltip | ||||
| sebserver.examconfig.props.label.proctoringDetectFaceAngleDisplay.tooltip= | ||||
| sebserver.examconfig.props.label.proctoringDetectTalking=Detect Talking | ||||
| sebserver.examconfig.props.label.proctoringDetectTalking.tooltip | ||||
| sebserver.examconfig.props.label.proctoringDetectTalking.tooltip= | ||||
| sebserver.examconfig.props.label.proctoringDetectTalkingDisplay=Feedback for Candidate | ||||
| sebserver.examconfig.props.label.proctoringDetectTalkingDisplay.tooltips | ||||
| sebserver.examconfig.props.label.proctoringDetectTalkingDisplay.tooltips= | ||||
| 
 | ||||
| sebserver.examconfig.props.label.remoteProctoringViewShow=Proctoring View Display Policy | ||||
| sebserver.examconfig.props.label.remoteProctoringViewShow.tooltip= | ||||
| sebserver.examconfig.props.label.remoteProctoringViewShow.0=Never | ||||
| sebserver.examconfig.props.label.remoteProctoringViewShow.0.tooltip= | ||||
| sebserver.examconfig.props.label.remoteProctoringViewShow.1=Allow to Show | ||||
| sebserver.examconfig.props.label.remoteProctoringViewShow.1.tooltip= | ||||
| sebserver.examconfig.props.label.remoteProctoringViewShow.2=Allow to Hide | ||||
| sebserver.examconfig.props.label.remoteProctoringViewShow.2.tooltip= | ||||
| sebserver.examconfig.props.label.remoteProctoringViewShow.3=Always | ||||
| sebserver.examconfig.props.label.remoteProctoringViewShow.3.tooltip= | ||||
| 
 | ||||
| sebserver.examconfig.props.label.showProctoringViewButton=Show Proctoring Button | ||||
| sebserver.examconfig.props.label.showProctoringViewButton | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 anhefti
						anhefti