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 | 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.enableF11=Enable F11 | ||||||
| sebserver.examconfig.props.label.enableF12=Enable F12 | 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=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=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=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=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=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=Display Meeting Name | ||||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagDisplayMeetingName.tooltip | sebserver.examconfig.props.label.jitsiMeetFeatureFlagDisplayMeetingName.tooltip | ||||||
| sebserver.examconfig.props.label.jitsiMeetFeatureFlagRaiseHand=Enable Raise Hand | 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=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=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.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=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=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=Subject | ||||||
| sebserver.examconfig.props.label.jitsiMeetSubject.tooltip | sebserver.examconfig.props.label.jitsiMeetSubject.tooltip= | ||||||
| sebserver.examconfig.props.label.jitsiMeetToken=Token | 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=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=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=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=Video Initially Muted | ||||||
| sebserver.examconfig.props.label.jitsiMeetVideoMuted.tooltip | 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.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=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=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=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=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=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=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=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=Proctoring View Display Policy | ||||||
| sebserver.examconfig.props.label.remoteProctoringViewShow.tooltip= | sebserver.examconfig.props.label.remoteProctoringViewShow.tooltip= | ||||||
| sebserver.examconfig.props.label.remoteProctoringViewShow.0=Never | 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=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=Allow to Hide | ||||||
|  | sebserver.examconfig.props.label.remoteProctoringViewShow.2.tooltip= | ||||||
| sebserver.examconfig.props.label.remoteProctoringViewShow.3=Always | 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=Show Proctoring Button | ||||||
| sebserver.examconfig.props.label.showProctoringViewButton | sebserver.examconfig.props.label.showProctoringViewButton | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 anhefti
						anhefti