From a3d601f0cb65eee784eb7b0d95f4981cb0279446 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Tue, 15 May 2012 10:07:41 +0200 Subject: [PATCH] OO-261: implements the automatic mapping of a property value to a self registrated user --- .../RegistrationAdminController.java | 99 ++++++++++++++++++- .../registration/RegistrationController.java | 20 ++++ .../olat/registration/RegistrationModule.java | 54 ++++++++++ .../_i18n/LocalStrings_de.properties | 6 ++ .../_i18n/LocalStrings_en.properties | 6 ++ .../propertyhandlers/MSNPropertyHandler.java | 6 +- 6 files changed, 186 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/olat/registration/RegistrationAdminController.java b/src/main/java/org/olat/registration/RegistrationAdminController.java index 630a99030dc..ae521fa8368 100644 --- a/src/main/java/org/olat/registration/RegistrationAdminController.java +++ b/src/main/java/org/olat/registration/RegistrationAdminController.java @@ -19,13 +19,16 @@ */ package org.olat.registration; +import java.util.ArrayList; import java.util.List; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.ValidationError; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; +import org.olat.core.gui.components.form.flexible.elements.SingleSelection; import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; @@ -34,6 +37,9 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.helpers.Settings; import org.olat.core.util.StringHelper; +import org.olat.user.UserPropertiesConfig; +import org.olat.user.propertyhandlers.Generic127CharTextPropertyHandler; +import org.olat.user.propertyhandlers.UserPropertyHandler; /** * Admin panel to configure the registration settings: should link appear on the login page... @@ -45,24 +51,52 @@ public class RegistrationAdminController extends FormBasicController { private MultipleSelectionElement registrationElement; private MultipleSelectionElement registrationLinkElement; private MultipleSelectionElement registrationLoginElement; + private MultipleSelectionElement staticPropElement; + private SingleSelection propertyElement; + private TextElement propertyValueElement; private TextElement exampleElement; private TextElement domainListElement; private FormLayoutContainer domainsContainer; + private FormLayoutContainer staticPropContainer; private static final String[] enableRegistrationKeys = new String[]{ "on" }; private static final String[] enableRegistrationValues = new String[1]; + private String[] propertyKeys, propertyValues; private final RegistrationModule registrationModule; private final RegistrationManager registrationManager; + private final UserPropertiesConfig userPropertiesConfig; public RegistrationAdminController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl, "admin"); registrationModule = CoreSpringFactory.getImpl(RegistrationModule.class); registrationManager = CoreSpringFactory.getImpl(RegistrationManager.class); - + userPropertiesConfig = CoreSpringFactory.getImpl(UserPropertiesConfig.class); + //decorate the translator + setTranslator(userPropertiesConfig.getTranslator(getTranslator())); + enableRegistrationValues[0] = translate("admin.enableRegistration.on"); + List<UserPropertyHandler> allPropertyHandlers = userPropertiesConfig.getAllUserPropertyHandlers(); + List<UserPropertyHandler> propertyHandlers = new ArrayList<UserPropertyHandler>(allPropertyHandlers.size()); + for(UserPropertyHandler handler:allPropertyHandlers) { + if(handler instanceof Generic127CharTextPropertyHandler) { + propertyHandlers.add(handler); + } + } + + propertyKeys = new String[propertyHandlers.size() + 1]; + propertyValues = new String[propertyHandlers.size() + 1]; + int count = 0; + //Translator translator = userPropertiesConfig.getTranslator(getTranslator()); + propertyKeys[0] = ""; + propertyValues[0] = ""; + for(UserPropertyHandler propertyHandler:propertyHandlers) { + propertyKeys[1 + count] = propertyHandler.getName(); + propertyValues[1 + count++] = translate(propertyHandler.i18nFormElementLabelKey()); + } + initForm(ureq); } @@ -105,8 +139,32 @@ public class RegistrationAdminController extends FormBasicController { uifactory.addFormSubmitButton("save", buttonGroupLayout); formLayout.add(buttonGroupLayout); - updateUI(); + //static property + staticPropContainer = FormLayoutContainer.createDefaultFormLayout("domains", getTranslator()); + staticPropContainer.setRootForm(mainForm); + staticPropContainer.contextPut("off_title", translate("admin.registration.staticprop.title")); + formLayout.add(staticPropContainer); + + uifactory.addStaticTextElement("admin.registration.staticprop.error", null, translate("admin.registration.staticprop.desc"), staticPropContainer); + + staticPropElement = uifactory.addCheckboxesHorizontal("enable.staticprop", "admin.enableStaticProp", staticPropContainer, enableRegistrationKeys, enableRegistrationValues, null); + staticPropElement.addActionListener(this, FormEvent.ONCHANGE); + staticPropElement.select("on", registrationModule.isStaticPropertyMappingEnabled()); + + propertyElement = uifactory.addDropdownSingleselect("property", "admin.registration.property", staticPropContainer, propertyKeys, propertyValues, null); + String propertyName = registrationModule.getStaticPropertyMappingName(); + UserPropertyHandler handler = userPropertiesConfig.getPropertyHandler(propertyName); + if(handler != null) { + propertyElement.select(handler.getName(), true); + } else { + propertyElement.select("", true); + } + propertyElement.addActionListener(this, FormEvent.ONCHANGE); + + String propertyValue = registrationModule.getStaticPropertyMappingValue(); + propertyValueElement = uifactory.addTextElement("admin.registration.prop.value", "admin.registration.propertyValue", 255, propertyValue, staticPropContainer); + updateUI(); } @Override @@ -126,6 +184,9 @@ public class RegistrationAdminController extends FormBasicController { } else if(source == registrationLoginElement) { registrationModule.setSelfRegistrationLoginEnabled(registrationLoginElement.isSelected(0)); updateUI(); + } else if (source == staticPropElement) { + registrationModule.setStaticPropertyMappingEnabled(staticPropElement.isSelected(0)); + updateUI(); } super.formInnerEvent(ureq, source, event); @@ -141,9 +202,13 @@ public class RegistrationAdminController extends FormBasicController { boolean enableDomains = enableMain && (registrationLinkElement.isSelected(0) || registrationLoginElement.isSelected(0)); domainsContainer.setVisible(enableDomains); + + //static prop + staticPropContainer.setVisible(enableMain); + boolean enabledProp = staticPropElement.isSelected(0); + propertyElement.setVisible(enableMain && enabledProp); + propertyValueElement.setVisible(enableMain && enabledProp); } - - @Override protected boolean validateFormLogic(UserRequest ureq) { @@ -164,6 +229,24 @@ public class RegistrationAdminController extends FormBasicController { allOk &= false; } } + + if(staticPropElement.isSelected(0)) { + if(propertyElement.isOneSelected()) { + String propertyName = propertyElement.getSelectedKey(); + String value = propertyValueElement.getValue(); + UserPropertyHandler handler = userPropertiesConfig.getPropertyHandler(propertyName); + ValidationError validationError = new ValidationError(); + boolean valid = handler.isValidValue(value, validationError, getLocale()); + if(!valid) { + String errorKey = validationError.getErrorKey(); + if(errorKey == null) { + propertyValueElement.setErrorKey("admin.registration.propertyValue.error", null); + } else { + propertyValueElement.setErrorKey(errorKey, null); + } + } + } + } return allOk && super.validateFormLogic(ureq); } @@ -176,6 +259,14 @@ public class RegistrationAdminController extends FormBasicController { String domains = domainListElement.getValue(); registrationModule.setDomainListRaw(domains); + + registrationModule.setStaticPropertyMappingEnabled(staticPropElement.isSelected(0)); + if(propertyElement.isOneSelected()) { + registrationModule.setStaticPropertyMappingName(propertyElement.getSelectedKey()); + } else { + registrationModule.setStaticPropertyMappingName(null); + } + registrationModule.setStaticPropertyMappingValue(propertyValueElement.getValue()); } private String generateExampleCode() { diff --git a/src/main/java/org/olat/registration/RegistrationController.java b/src/main/java/org/olat/registration/RegistrationController.java index 4d96ea17b9a..a7b57bf910c 100644 --- a/src/main/java/org/olat/registration/RegistrationController.java +++ b/src/main/java/org/olat/registration/RegistrationController.java @@ -55,6 +55,7 @@ import org.olat.core.id.User; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.logging.OLATRuntimeException; +import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.core.util.WebappHelper; import org.olat.core.util.i18n.I18nManager; @@ -63,6 +64,7 @@ import org.olat.core.util.mail.MailerResult; import org.olat.core.util.mail.manager.MailManager; import org.olat.dispatcher.LocaleNegotiator; import org.olat.user.UserManager; +import org.olat.user.UserPropertiesConfig; import org.olat.user.propertyhandlers.UserPropertyHandler; /** @@ -405,6 +407,24 @@ public class RegistrationController extends BasicController implements Activatea // update other user properties from form List<UserPropertyHandler> userPropertyHandlers = um.getUserPropertyHandlersFor(RegistrationForm2.USERPROPERTIES_FORM_IDENTIFIER, false); User persistedUser = persistedIdentity.getUser(); + + //add eventually static value + UserPropertiesConfig userPropertiesConfig = CoreSpringFactory.getImpl(UserPropertiesConfig.class); + RegistrationModule registrationModule = CoreSpringFactory.getImpl(RegistrationModule.class); + if(registrationModule.isStaticPropertyMappingEnabled()) { + String propertyName = registrationModule.getStaticPropertyMappingName(); + String propertyValue = registrationModule.getStaticPropertyMappingValue(); + if(StringHelper.containsNonWhitespace(propertyName) + && StringHelper.containsNonWhitespace(propertyValue) + && userPropertiesConfig.getPropertyHandler(propertyName) != null) { + try { + persistedUser.setProperty(propertyName, propertyValue); + } catch (Exception e) { + logError("Cannot set the static property value", e); + } + } + } + for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) { FormItem fi = registrationForm.getPropFormItem(userPropertyHandler.getName()); userPropertyHandler.updateUserFromFormItem(persistedUser, fi); diff --git a/src/main/java/org/olat/registration/RegistrationModule.java b/src/main/java/org/olat/registration/RegistrationModule.java index a57b0a08745..760c723eae8 100644 --- a/src/main/java/org/olat/registration/RegistrationModule.java +++ b/src/main/java/org/olat/registration/RegistrationModule.java @@ -50,6 +50,9 @@ import org.olat.core.util.mail.EmailAddressValidator; public class RegistrationModule extends AbstractOLATModule { // registration config private static final String CONFIG_SELFREGISTRATION = "enableSelfregistration"; + private static final String CONFIG_STATIC_PROPERTY_MAPPING = "enableStaticPropertyMapping"; + private static final String CONFIG_STATIC_PROPERTY_MAPPING_KEY = "staticPropertyMapping"; + private static final String CONFIG_STATIC_PROPERTY_MAPPING_VAL = "staticPropertyMappingValue"; private static final String CONFIG_SELFREGISTRATION_LINK = "enableSelfregistrationLink"; private static final String CONFIG_SELFREGISTRATION_LOGIN = "enableSelfregistrationLogin"; private static final String CONFIG_REGISTRATION_NOTIFICATION ="registrationNotificationEnabled"; @@ -57,8 +60,11 @@ public class RegistrationModule extends AbstractOLATModule { private boolean selfRegistrationEnabled; private boolean selfRegistrationLinkEnabled; private boolean selfRegistrationLoginEnabled; + private boolean staticPropertyMappingEnabled; private String registrationNotificationEmail; private String domainList; + private String staticPropertyMappingName; + private String staticPropertyMappingValue; // disclaimer config private static final String CONFIG_DISCLAIMER = "disclaimerEnabled"; @@ -97,6 +103,36 @@ public class RegistrationModule extends AbstractOLATModule { setStringProperty("registration.enabled", value, true); } + /** + * @return true if self registration is turned on, false otherwhise + */ + public boolean isStaticPropertyMappingEnabled(){ + return staticPropertyMappingEnabled; + } + + public void setStaticPropertyMappingEnabled(boolean enable) { + String value = enable ? "true" : "false"; + setStringProperty("static.prop.mapping.enabled", value, true); + } + + public String getStaticPropertyMappingName() { + return staticPropertyMappingName; + } + + public void setStaticPropertyMappingName(String value) { + value = StringHelper.containsNonWhitespace(value) ? value : ""; + setStringProperty("static.prop.mapping", value, true); + } + + public String getStaticPropertyMappingValue() { + return staticPropertyMappingValue; + } + + public void setStaticPropertyMappingValue(String value) { + value = StringHelper.containsNonWhitespace(value) ? value : ""; + setStringProperty("static.prop.mapping.value", value, true); + } + public boolean isSelfRegistrationLinkEnabled(){ return selfRegistrationLinkEnabled; } @@ -195,6 +231,20 @@ public class RegistrationModule extends AbstractOLATModule { if(StringHelper.containsNonWhitespace(domainObj)) { domainList = domainObj; } + + //static property mapping enabled/disabled + String enabledPropObj = getStringPropertyValue("static.prop.mapping.enabled", true); + if(StringHelper.containsNonWhitespace(enabledPropObj)) { + staticPropertyMappingEnabled = "true".equals(enabledPropObj); + } + String propKeyObj = getStringPropertyValue("static.prop.mapping", true); + if(StringHelper.containsNonWhitespace(propKeyObj)) { + staticPropertyMappingName = propKeyObj; + } + String propValueObj = getStringPropertyValue("static.prop.mapping.value", true); + if(StringHelper.containsNonWhitespace(propValueObj)) { + staticPropertyMappingValue = propValueObj; + } } @Override @@ -229,6 +279,10 @@ public class RegistrationModule extends AbstractOLATModule { // optional disclaimer elements additionalCheckbox = getBooleanConfigParameter(CONFIG_ADDITIONAL_CHECKBOX, false); additionaLinkText = getBooleanConfigParameter(CONFIG_ADDITIONAL_LINK, false); + + staticPropertyMappingEnabled = getBooleanConfigParameter(CONFIG_STATIC_PROPERTY_MAPPING, false); + staticPropertyMappingName = getStringConfigParameter(CONFIG_STATIC_PROPERTY_MAPPING_KEY, "", true); + staticPropertyMappingValue = getStringConfigParameter(CONFIG_STATIC_PROPERTY_MAPPING_VAL, "", true); } @Override diff --git a/src/main/java/org/olat/registration/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/registration/_i18n/LocalStrings_de.properties index af4353930e7..5fd100fc73e 100644 --- a/src/main/java/org/olat/registration/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/registration/_i18n/LocalStrings_de.properties @@ -11,6 +11,12 @@ admin.registration.domains.title=Einschr admin.registration.domains.desc=Die Selbtregistration kann optional auf eine oder mehrere Domänen eingeschränkt werden. Um diese Funktion zu aktivieren fügen Sie eine Liste von Domänen an z.B: openolat.com, *olat.org, hotmail.com admin.registration.domains=Dom\u00E4nenliste admin.registration.domains.error=Diese Dom\u00E4nen sind nicht g\u00FCltig: {0} +admin.registration.staticprop.title=User property mapping +admin.registration.staticprop.desc=Optionally a user property can be set to a default value after self registration. This can be used to easily identify users who self-registred and separate them e.g. from LDAP users. +admin.enableStaticProp=Activate user property mapping +admin.registration.property=User property name +admin.registration.propertyValue=User property value +admin.registration.propertyValue.error=Invalid user property value disclaimer.acknowledged=<b>Ich habe die Nutzungsbedingungen gelesen, verstanden und stimme ihnen zu.</b> disclaimer.additionalcheckbox=<b>Ich bin mit der Datenspeicherung einverstanden.</b> disclaimer.additionallinktext=Nutzungsbedingungen (PDF Dokument) diff --git a/src/main/java/org/olat/registration/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/registration/_i18n/LocalStrings_en.properties index 81e3b2f1f84..e75f944f5df 100644 --- a/src/main/java/org/olat/registration/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/registration/_i18n/LocalStrings_en.properties @@ -11,6 +11,12 @@ admin.registration.domains.title=Domain limitation admin.registration.domains.desc=Optionally the self registration can be limited to one or multiple domains. To activate this feature add a list of domains into the form below, e.g. : openolat.com, *olat.org, hotmail.com admin.registration.domains=List of domains admin.registration.domains.error=The following domains are not valid: {0} +admin.registration.staticprop.title=User property mapping +admin.registration.staticprop.desc=Optionally a user property can be set to a default value after self registration. This can be used to easily identify users who self-registred and separate them e.g. from LDAP users. +admin.enableStaticProp=Activate user property mapping +admin.registration.property=User property name +admin.registration.propertyValue=User property value +admin.registration.propertyValue.error=Invalid user property value disclaimer.acknowledged=<b>I have read your terms of use, do understand and agree.</b> disclaimer.additionalcheckbox=<b>I agree on the terms of data storage</b> disclaimer.additionallinktext=Terms of use (PDF document) diff --git a/src/main/java/org/olat/user/propertyhandlers/MSNPropertyHandler.java b/src/main/java/org/olat/user/propertyhandlers/MSNPropertyHandler.java index f2e7390f41f..32712b9c738 100644 --- a/src/main/java/org/olat/user/propertyhandlers/MSNPropertyHandler.java +++ b/src/main/java/org/olat/user/propertyhandlers/MSNPropertyHandler.java @@ -82,7 +82,11 @@ public class MSNPropertyHandler extends Generic127CharTextPropertyHandler { return false; } if (StringHelper.containsNonWhitespace(value)) { - return value.length() <= MSN_NAME_MAX_LENGTH; + boolean valid = value.length() <= MSN_NAME_MAX_LENGTH; + if(!valid && validationError != null) { + validationError.setErrorKey("form.name.msn.error"); + } + return valid; } return true; } -- GitLab