diff --git a/omod/src/main/java/org/openmrs/web/controller/user/UserFormController.java b/omod/src/main/java/org/openmrs/web/controller/user/UserFormController.java index 92caf0dc..9eee003f 100644 --- a/omod/src/main/java/org/openmrs/web/controller/user/UserFormController.java +++ b/omod/src/main/java/org/openmrs/web/controller/user/UserFormController.java @@ -11,6 +11,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.commons.validator.EmailValidator; import org.openmrs.Person; import org.openmrs.PersonName; import org.openmrs.Provider; @@ -43,6 +44,8 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; + +import java.lang.reflect.Field; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -112,6 +115,17 @@ public List getRoles(WebRequest request) { public String showForm(@RequestParam(required = false, value = "userId") Integer userId, @RequestParam(required = false, value = "createNewPerson") String createNewPerson, @ModelAttribute("user") User user, ModelMap model) { + + try { + boolean isPlatform22OrNewer = isPlatform22OrNewer(); + if (isPlatform22OrNewer) { + Field emailField = getEmailField(); + model.addAttribute("hasEmailField", isPlatform22OrNewer); + model.addAttribute("email", emailField.get(user)); + } + } catch (IllegalArgumentException | IllegalAccessException | NullPointerException e) { + log.warn("Email field not available for setting", e); + } // the formBackingObject method above sets up user, depending on userId and personId parameters @@ -157,6 +171,7 @@ public String handleSubmission(WebRequest request, HttpSession httpSession, Mode @RequestParam(required = false, value = "roleStrings") String[] roles, @RequestParam(required = false, value = "createNewPerson") String createNewPerson, @RequestParam(required = false, value = "providerCheckBox") String addToProviderTableOption, + @RequestParam(required = false, value = "email") String email, @ModelAttribute("user") User user, BindingResult errors, HttpServletResponse response) { UserService us = Context.getUserService(); @@ -227,6 +242,18 @@ public String handleSubmission(WebRequest request, HttpSession httpSession, Mode } } + if (isPlatform22OrNewer() && isEmailValid(email)) { + Field emailField; + try { + emailField = getEmailField(); + emailField.set(user, email); + } catch (IllegalArgumentException | IllegalAccessException | NullPointerException e) { + log.error("Error while setting the email field", e); + } + } else { + log.warn("Invalid or unspecified email: " + (email != null ? "'" + email + "'" : "not provided")); + } + Set newRoles = new HashSet(); if (roles != null) { for (String r : roles) { @@ -321,4 +348,43 @@ private Boolean isNewUser(User user) { return user == null ? true : user.getUserId() == null; } + /** + * @return true if email is valid or false otherwise + * @param email + */ + private boolean isEmailValid(String email) { + return StringUtils.hasLength(email) && EmailValidator.getInstance().isValid(email); + } + + /** + * @return an email field + * @param user + */ + private Field getEmailField() { + try { + Field emailField = User.class.getDeclaredField("email"); + emailField.setAccessible(true); + return emailField; + } catch (NoSuchFieldException | SecurityException e) { + log.warn("Email field not available for setting", e); + return null; + } + } + + /** + * @return true if the platform version is 2.2 or higher + */ + private boolean isPlatform22OrNewer() { + String platformVersion = OpenmrsConstants.OPENMRS_VERSION_SHORT.substring(0, 3); + try { + float versionFloat = Float.parseFloat(platformVersion); + if (versionFloat >= 2.2) { + return true; + } + } + catch (NumberFormatException e) { + log.error("Unable to parse platform value text to float", e); + } + return false; + } } diff --git a/omod/src/main/webapp/admin/users/userForm.jsp b/omod/src/main/webapp/admin/users/userForm.jsp index cbdbf748..c01706b5 100644 --- a/omod/src/main/webapp/admin/users/userForm.jsp +++ b/omod/src/main/webapp/admin/users/userForm.jsp @@ -90,6 +90,12 @@ + + + + + + * diff --git a/omod/src/main/webapp/resources/css/openmrs.css b/omod/src/main/webapp/resources/css/openmrs.css index 5e9846c0..cf1a231a 100644 --- a/omod/src/main/webapp/resources/css/openmrs.css +++ b/omod/src/main/webapp/resources/css/openmrs.css @@ -671,7 +671,7 @@ tr.searchHighlight { overflow-y: auto; } -input[type="text"], input[type="password"] { +input[type="text"], input[type="email"], input[type="password"] { padding: 1px; border: 1px solid cadetblue; } diff --git a/omod/src/test/java/org/openmrs/web/controller/user/UserFormControllerTest.java b/omod/src/test/java/org/openmrs/web/controller/user/UserFormControllerTest.java index 8f79e6d1..cfb3e1d3 100644 --- a/omod/src/test/java/org/openmrs/web/controller/user/UserFormControllerTest.java +++ b/omod/src/test/java/org/openmrs/web/controller/user/UserFormControllerTest.java @@ -49,7 +49,7 @@ public void handleSubmission_shouldWorkForAnExample() throws Exception { user.addName(new PersonName("This", "is", "Test")); user.getPerson().setGender("F"); controller.handleSubmission(request, new MockHttpSession(), new ModelMap(), "", "Save User", "pass123", "pass123", - null, null, null, new String[0], "true", null, user, new BindException(user, "user"), + null, null, null, new String[0], "true", null, "sample@email.com", user, new BindException(user, "user"), new MockHttpServletResponse()); } @@ -71,7 +71,7 @@ public void handleSubmission_createUserProviderAccountWhenProviderAccountCheckbo controller.showForm(2, "true", user, model); controller.handleSubmission(request, new MockHttpSession(), new ModelMap(), "", null, "Test1234", "valid secret question", "valid secret answer", "Test1234", false, new String[] { "Provider" }, "true", - "addToProviderTable", user, new BindException(user, "user"), response); + "addToProviderTable", "sample@email.com", user, new BindException(user, "user"), response); Assert.assertFalse(Context.getProviderService().getProvidersByPerson(user.getPerson()).isEmpty()); Assert.assertEquals(200, response.getStatus()); } @@ -85,7 +85,7 @@ public void shouldSetResponseStatusToBadRequestOnError() throws Exception { MockHttpServletResponse response = new MockHttpServletResponse(); controller.handleSubmission(request, new MockHttpSession(), new ModelMap(), "", null, "Test123", "valid secret question", "valid secret answer", "Test1234", false, new String[] { "Provider" }, "true", - "addToProviderTable", user, new BindException(user, "user"), response); + "addToProviderTable", "sample@email.com", user, new BindException(user, "user"), response); Assert.assertEquals(400, response.getStatus()); }