new name for Client Config export file "SEBServerSettings.seb" and
"Configure a Client" as default purpose.
This commit is contained in:
parent
f442b9885f
commit
18280173c0
9 changed files with 70 additions and 65 deletions
|
@ -121,7 +121,7 @@ Now we want to activate this client configuration and export it to make it acces
|
|||
specific Client configuration.
|
||||
- Then either on the list or in the view mode of the form, use the "Activate Client Configuration" action on the right action pane to activate the client configuration
|
||||
- Now there is a "Export Client Configuration" action in the detail view of the client configuration. Use the "Export Client Configuration" action
|
||||
to start a download dialog. Choose "Save As" and download the file with the name "SEBClientSettings.seb".
|
||||
to start a download dialog. Choose "Save As" and download the file with the name "SEBServerSettings.seb".
|
||||
- This file can now be published as download-link within a public server where SEB user can click and start the download and startup of the SEB client automatically.
|
||||
|
||||
**Deactivate a Client Configuration**
|
||||
|
|
|
@ -1,24 +1,15 @@
|
|||
Exams
|
||||
=====
|
||||
|
||||
TODO
|
||||
Within an exam in SEB server all threads come together to set up a e-assessment with Safe Exam Browser and SEB Server. An exam can be imported
|
||||
from a course that exists on an LMS that was binded with a LMS Setup. An exam configuration that was formerly created can be attached to the exam by
|
||||
choosing one from the library. Indicators can be defined that are shown in the monitoring section while monitoring a running exam. And if
|
||||
the API of the specified LMS integration supports individual SEB restriction attributes for a e-assessment, this can also be defined and managed
|
||||
on the exam management of SEB Server.
|
||||
|
||||
Import
|
||||
------
|
||||
|
||||
TODO
|
||||
|
||||
Exam Configuration Binding
|
||||
--------------------------
|
||||
|
||||
TODO
|
||||
|
||||
Thresholds
|
||||
----------
|
||||
|
||||
TODO
|
||||
|
||||
SEB Restriction On LMS
|
||||
-------------------------
|
||||
We will go through all the steps to setting up an exam for Safe Exam Browser with SEB Server one by one.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -6,10 +6,11 @@ Leraning Management System Setup
|
|||
Overview
|
||||
--------
|
||||
|
||||
To be able to connect to a learning management system (LMS) and view and manage the courses provided by a LMS is an essential feature of the SEB Server.
|
||||
To create an exam or e-assessment, based on a course existing on a LMS, to use with SEB we need some data of this course from the LMS like,
|
||||
start- end-time, name and others. If we furthermore want to be able to automatically restrict the course for SEB access only we need to have proper
|
||||
integration API's in place on both sides, the LMS and the SEB Server. This integration is separated into two main features so far. This are:
|
||||
To be able to connect to a learning management system (LMS), to view and manage the courses provided by a LMS is an essential feature of the SEB Server.
|
||||
To setup an exam or e-assessment for SEB on SEB Server that is based on a course from a LMS, we have to make a binding to the course on the LMS.
|
||||
This allows as to always get the actual course data from LMS like, start- end-time, name and others. If we furthermore want to be able to automatically
|
||||
restrict the course for SEB access only we also need to have proper integration API's in place on both sides, the LMS and the SEB Server.
|
||||
This integration is separated into two main features so far. This are:
|
||||
|
||||
**Course API**
|
||||
|
||||
|
|
|
@ -200,41 +200,41 @@ public final class SebClientConfig implements GrantEntity, Activatable {
|
|||
}
|
||||
|
||||
public ConfigPurpose getConfigPurpose() {
|
||||
return configPurpose;
|
||||
return this.configPurpose;
|
||||
}
|
||||
|
||||
public Boolean getFallback() {
|
||||
return fallback;
|
||||
return this.fallback;
|
||||
}
|
||||
|
||||
public Long getFallbackTimeout() {
|
||||
return fallbackTimeout;
|
||||
return this.fallbackTimeout;
|
||||
}
|
||||
|
||||
public Short getFallbackAttempts() {
|
||||
return fallbackAttempts;
|
||||
return this.fallbackAttempts;
|
||||
}
|
||||
|
||||
public Short getFallbackAttemptInterval() {
|
||||
return fallbackAttemptInterval;
|
||||
return this.fallbackAttemptInterval;
|
||||
}
|
||||
|
||||
public CharSequence getFallbackPassword() {
|
||||
return fallbackPassword;
|
||||
return this.fallbackPassword;
|
||||
}
|
||||
|
||||
@JsonIgnore
|
||||
public CharSequence getFallbackPasswordConfirm() {
|
||||
return fallbackPasswordConfirm;
|
||||
return this.fallbackPasswordConfirm;
|
||||
}
|
||||
|
||||
public CharSequence getQuitPassword() {
|
||||
return quitPassword;
|
||||
return this.quitPassword;
|
||||
}
|
||||
|
||||
@JsonIgnore
|
||||
public CharSequence getQuitPasswordConfirm() {
|
||||
return quitPasswordConfirm;
|
||||
return this.quitPasswordConfirm;
|
||||
}
|
||||
|
||||
public DateTime getDate() {
|
||||
|
@ -272,21 +272,21 @@ public final class SebClientConfig implements GrantEntity, Activatable {
|
|||
@Override
|
||||
public String toString() {
|
||||
final StringBuilder sb = new StringBuilder("SebClientConfig{");
|
||||
sb.append("id=").append(id);
|
||||
sb.append(", institutionId=").append(institutionId);
|
||||
sb.append(", name='").append(name).append('\'');
|
||||
sb.append(", configPurpose=").append(configPurpose);
|
||||
sb.append(", fallback=").append(fallback);
|
||||
sb.append(", fallbackStartURL='").append(fallbackStartURL).append('\'');
|
||||
sb.append(", fallbackTimeout=").append(fallbackTimeout);
|
||||
sb.append(", fallbackAttempts=").append(fallbackAttempts);
|
||||
sb.append(", fallbackAttemptInterval=").append(fallbackAttemptInterval);
|
||||
sb.append(", fallbackPassword=").append(fallbackPassword);
|
||||
sb.append(", fallbackPasswordConfirm=").append(fallbackPasswordConfirm);
|
||||
sb.append(", date=").append(date);
|
||||
sb.append(", encryptSecret=").append(encryptSecret);
|
||||
sb.append(", encryptSecretConfirm=").append(encryptSecretConfirm);
|
||||
sb.append(", active=").append(active);
|
||||
sb.append("id=").append(this.id);
|
||||
sb.append(", institutionId=").append(this.institutionId);
|
||||
sb.append(", name='").append(this.name).append('\'');
|
||||
sb.append(", configPurpose=").append(this.configPurpose);
|
||||
sb.append(", fallback=").append(this.fallback);
|
||||
sb.append(", fallbackStartURL='").append(this.fallbackStartURL).append('\'');
|
||||
sb.append(", fallbackTimeout=").append(this.fallbackTimeout);
|
||||
sb.append(", fallbackAttempts=").append(this.fallbackAttempts);
|
||||
sb.append(", fallbackAttemptInterval=").append(this.fallbackAttemptInterval);
|
||||
sb.append(", fallbackPassword=").append(this.fallbackPassword);
|
||||
sb.append(", fallbackPasswordConfirm=").append(this.fallbackPasswordConfirm);
|
||||
sb.append(", date=").append(this.date);
|
||||
sb.append(", encryptSecret=").append(this.encryptSecret);
|
||||
sb.append(", encryptSecretConfirm=").append(this.encryptSecretConfirm);
|
||||
sb.append(", active=").append(this.active);
|
||||
sb.append('}');
|
||||
return sb.toString();
|
||||
}
|
||||
|
@ -318,7 +318,7 @@ public final class SebClientConfig implements GrantEntity, Activatable {
|
|||
null,
|
||||
institutionId,
|
||||
null,
|
||||
ConfigPurpose.START_EXAM,
|
||||
ConfigPurpose.CONFIGURE_CLIENT,
|
||||
false,
|
||||
null,
|
||||
null,
|
||||
|
|
|
@ -357,10 +357,10 @@ public class SebClientConfigDAOImpl implements SebClientConfigDAO {
|
|||
|
||||
private Result<SebClientConfig> toDomainModel(final SebClientConfigRecord record) {
|
||||
|
||||
Map<String, AdditionalAttributeRecord> additionalAttributes = this.additionalAttributesDAO
|
||||
final Map<String, AdditionalAttributeRecord> additionalAttributes = this.additionalAttributesDAO
|
||||
.getAdditionalAttributes(
|
||||
EntityType.SEB_CLIENT_CONFIGURATION,
|
||||
record.getId())
|
||||
EntityType.SEB_CLIENT_CONFIGURATION,
|
||||
record.getId())
|
||||
.getOrThrow()
|
||||
.stream()
|
||||
.collect(Collectors.toMap(
|
||||
|
@ -374,7 +374,8 @@ public class SebClientConfigDAOImpl implements SebClientConfigDAO {
|
|||
record.getInstitutionId(),
|
||||
record.getName(),
|
||||
additionalAttributes.containsKey(SebClientConfig.ATTR_CONFIG_PURPOSE)
|
||||
? ConfigPurpose.valueOf(additionalAttributes.get(SebClientConfig.ATTR_CONFIG_PURPOSE).getValue())
|
||||
? ConfigPurpose
|
||||
.valueOf(additionalAttributes.get(SebClientConfig.ATTR_CONFIG_PURPOSE).getValue())
|
||||
: ConfigPurpose.START_EXAM,
|
||||
additionalAttributes.containsKey(SebClientConfig.ATTR_FALLBACK) &&
|
||||
BooleanUtils.toBoolean(additionalAttributes.get(SebClientConfig.ATTR_FALLBACK).getValue()),
|
||||
|
@ -388,7 +389,8 @@ public class SebClientConfigDAOImpl implements SebClientConfigDAO {
|
|||
? Short.parseShort(additionalAttributes.get(SebClientConfig.ATTR_FALLBACK_ATTEMPTS).getValue())
|
||||
: null,
|
||||
additionalAttributes.containsKey(SebClientConfig.ATTR_FALLBACK_ATTEMPT_INTERVAL)
|
||||
? Short.parseShort(additionalAttributes.get(SebClientConfig.ATTR_FALLBACK_ATTEMPT_INTERVAL).getValue())
|
||||
? Short.parseShort(
|
||||
additionalAttributes.get(SebClientConfig.ATTR_FALLBACK_ATTEMPT_INTERVAL).getValue())
|
||||
: null,
|
||||
additionalAttributes.containsKey(SebClientConfig.ATTR_FALLBACK_PASSWORD)
|
||||
? additionalAttributes.get(SebClientConfig.ATTR_FALLBACK_PASSWORD).getValue()
|
||||
|
@ -435,14 +437,14 @@ public class SebClientConfigDAOImpl implements SebClientConfigDAO {
|
|||
}
|
||||
}
|
||||
|
||||
private void saveAdditionalAttributes(SebClientConfig sebClientConfig, Long configId) {
|
||||
private void saveAdditionalAttributes(final SebClientConfig sebClientConfig, final Long configId) {
|
||||
this.additionalAttributesDAO.saveAdditionalAttribute(
|
||||
EntityType.SEB_CLIENT_CONFIGURATION,
|
||||
configId,
|
||||
SebClientConfig.ATTR_CONFIG_PURPOSE,
|
||||
(sebClientConfig.configPurpose != null)
|
||||
? sebClientConfig.configPurpose.name()
|
||||
: ConfigPurpose.START_EXAM.name());
|
||||
: ConfigPurpose.CONFIGURE_CLIENT.name());
|
||||
|
||||
this.additionalAttributesDAO.saveAdditionalAttribute(
|
||||
EntityType.SEB_CLIENT_CONFIGURATION,
|
||||
|
|
|
@ -24,6 +24,7 @@ public interface ClientConfigService {
|
|||
|
||||
Logger log = LoggerFactory.getLogger(ClientConfigService.class);
|
||||
|
||||
/** The cache name of ClientDetails */
|
||||
String EXAM_CLIENT_DETAILS_CACHE = "EXAM_CLIENT_DETAILS_CACHE";
|
||||
|
||||
/** Indicates if there is any SebClientConfiguration for a specified institution.
|
||||
|
|
|
@ -95,17 +95,27 @@ public abstract class EntityController<T extends Entity, M extends Entity> {
|
|||
}
|
||||
|
||||
// ******************
|
||||
// * GET (getAll)
|
||||
// * GET (getPage)
|
||||
// ******************
|
||||
|
||||
/** The get-all or get-page rest endpoint for all types of Entity and returns a Page of
|
||||
* entities of specific type.
|
||||
*
|
||||
* GET /{api}/{entity-type-endpoint-name}
|
||||
*
|
||||
/** The generic endpoint to get a Page of domain-entities of a specific type.
|
||||
* </p>
|
||||
* GET /{api}/{domain-entity-name}
|
||||
* </p>
|
||||
* For example for the "exam" domain-entity
|
||||
* GET /admin-api/v1/exam
|
||||
* GET /admin-api/v1/exam?page_number=2&page_size=10&sort=-name
|
||||
* GET /admin-api/v1/exam?name=seb&active=true
|
||||
* </p>
|
||||
* Sorting: the sort parameter to sort the list of entities before paging
|
||||
* the sort parameter is the name of the entity-model attribute to sort with a leading '-' sign for
|
||||
* descending sort order. Note that not all entity-model attribute are suited for sorting while the most
|
||||
* are.
|
||||
* </p>
|
||||
* Filter: The filter attributes accepted by this API depend on the actual entity model (domain object)
|
||||
* and are of the form [domain-attribute-name]=[filter-value]. E.g.: name=abc or type=EXAM. Usually
|
||||
* filter attributes of text type are treated as SQL wildcard with %[text]% to filter all text containing
|
||||
* a given text-snippet.
|
||||
*
|
||||
* @param institutionId The institution identifier of the request.
|
||||
* Default is the institution identifier of the institution of the current user
|
||||
|
@ -113,8 +123,8 @@ public abstract class EntityController<T extends Entity, M extends Entity> {
|
|||
* @param pageSize the size of the page that is requested
|
||||
* @param sort the sort parameter to sort the list of entities before paging
|
||||
* the sort parameter is the name of the entity-model attribute to sort with a leading '-' sign for
|
||||
* descending sort order
|
||||
* @param allRequestParams a MultiValueMap of all request parameter that is used for filtering
|
||||
* descending sort order.
|
||||
* @param allRequestParams a MultiValueMap of all request parameter that is used for filtering.
|
||||
* @return Page of domain-model-entities of specified type */
|
||||
@RequestMapping(
|
||||
method = RequestMethod.GET,
|
||||
|
|
|
@ -18,5 +18,5 @@ sebserver.gui.multilingual=false
|
|||
sebserver.gui.supported.languages=en,de
|
||||
sebserver.gui.date.displayformat=de
|
||||
|
||||
sebserver.gui.seb.client.config.download.filename=SEBClientSettings.seb
|
||||
sebserver.gui.seb.client.config.download.filename=SEBServerSettings.seb
|
||||
sebserver.gui.seb.exam.config.download.filename=SEBExamSettings.seb
|
|
@ -131,6 +131,6 @@ sebserver.gui.webservice.apipath=${sebserver.webservice.api.admin.endpoint}
|
|||
# defines the polling interval that is used to poll the webservice for client connection data on a monitored exam page
|
||||
sebserver.gui.webservice.poll-interval=1000
|
||||
sebserver.gui.webservice.mock-lms-enabled=true
|
||||
sebserver.gui.seb.client.config.download.filename=SEBClientSettings.seb
|
||||
sebserver.gui.seb.client.config.download.filename=SEBServerSettings.seb
|
||||
sebserver.gui.seb.exam.config.download.filename=SEBExamSettings.seb
|
||||
|
||||
|
|
Loading…
Reference in a new issue