diff --git a/olat3/webapp/WEB-INF/src/org/olat/preferences/DbStorage.java b/olat3/webapp/WEB-INF/src/org/olat/preferences/DbStorage.java index d591f4425d6baa40027d337062949bd0b7f6b1ec..7a8141125c592484aaa8b06f132d308af5739b8c 100644 --- a/olat3/webapp/WEB-INF/src/org/olat/preferences/DbStorage.java +++ b/olat3/webapp/WEB-INF/src/org/olat/preferences/DbStorage.java @@ -21,7 +21,12 @@ */ package org.olat.preferences; +import java.util.Iterator; +import java.util.List; + import org.olat.core.id.Identity; +import org.olat.core.logging.AssertException; +import org.olat.core.logging.LogDelegator; import org.olat.core.util.prefs.Preferences; import org.olat.core.util.prefs.PreferencesStorage; import org.olat.core.util.xml.XStreamHelper; @@ -35,7 +40,7 @@ import org.olat.properties.PropertyManager; * * @author Felix Jost */ -public class DbStorage implements PreferencesStorage { +public class DbStorage extends LogDelegator implements PreferencesStorage{ static final String USER_PROPERTY_KEY = "v2guipreferences"; @@ -52,8 +57,26 @@ public class DbStorage implements PreferencesStorage { * @param identity * @return */ - private DbPrefs getPreferencesFor(Identity identity) { - Property guiProperty = PropertyManager.getInstance().findProperty(identity, null, null, null, USER_PROPERTY_KEY); + private DbPrefs getPreferencesFor(final Identity identity) { + Property guiProperty = null; + try { + guiProperty = PropertyManager.getInstance().findProperty(identity, null, null, null, USER_PROPERTY_KEY); + } catch (AssertException e) { + // OLAT-6429 detect and delete multiple prefs objects, keep the first one only + List<Property> guiPropertyList = PropertyManager.getInstance().findProperties(identity, null, null, null, USER_PROPERTY_KEY); + if (guiPropertyList != null && guiPropertyList.size() > 0) { + logError("Found more than 1 entry for " + USER_PROPERTY_KEY + " in o_property table for user " + identity.getName() + ". Use first of them, deleting the others!", e); + guiProperty = guiPropertyList.get(0); + Iterator<Property> iterator = guiPropertyList.iterator(); + iterator.next(); + while (iterator.hasNext()) { + Property property = (Property) iterator.next(); + PropertyManager.getInstance().deleteProperty(property); + logInfo("Will delete old property: " + property.getTextValue()); + } + } + } + if (guiProperty == null) { return createEmptyDbPrefs(identity,false); } else { diff --git a/olat3/webapp/WEB-INF/src/org/olat/user/ChangePrefsController.java b/olat3/webapp/WEB-INF/src/org/olat/user/ChangePrefsController.java index 9ef27f4d2ec6cd47226f4558b027721c075eed6c..274933bc9c0f7e505985e6af31e751ad1c493760 100644 --- a/olat3/webapp/WEB-INF/src/org/olat/user/ChangePrefsController.java +++ b/olat3/webapp/WEB-INF/src/org/olat/user/ChangePrefsController.java @@ -35,6 +35,7 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.id.Identity; +import org.olat.core.util.UserSession; import org.olat.core.util.prefs.Preferences; import org.olat.core.util.prefs.PreferencesFactory; @@ -133,10 +134,15 @@ class SpecialPrefsForm extends FormBasicController { private String[] keys, values; private boolean useAjaxCheckbox = false; - public SpecialPrefsForm(UserRequest ureq, WindowControl wControl, Identity changeableIdentity) { + public SpecialPrefsForm(final UserRequest ureq, final WindowControl wControl, final Identity changeableIdentity) { super(ureq, wControl); tobeChangedIdentity = changeableIdentity; - prefs = PreferencesFactory.getInstance().getPreferencesFor(tobeChangedIdentity, false); + // OLAT-6429 load GUI prefs from user session for myself and from factory for other users (as user manager) + if (ureq.getIdentity().equalsByPersistableKey(tobeChangedIdentity)) { + prefs = ureq.getUserSession().getGuiPreferences(); + } else { + prefs = PreferencesFactory.getInstance().getPreferencesFor(tobeChangedIdentity, false); + } // The ajax configuration is only for user manager (technical stuff) useAjaxCheckbox = ureq.getUserSession().getRoles().isUserManager(); // initialize checkbox keys depending on useAjaxCheckbox flag @@ -158,6 +164,15 @@ class SpecialPrefsForm extends FormBasicController { @Override protected void formOK(UserRequest ureq) { + // OLAT-6429 don't change another users GUI prefs when he is logged in + if (!ureq.getIdentity().equalsByPersistableKey(tobeChangedIdentity)) { + if (UserSession.getSignedOnIdentity(tobeChangedIdentity.getName()) != null) { + showError("error.user.logged.in", tobeChangedIdentity.getName()); + prefsElement.reset(); + return; + } + } + if (useAjaxCheckbox) { prefs.putAndSave(WindowManager.class, "ajax-beta-on", prefsElement.getSelectedKeys().contains("ajax")); } diff --git a/olat3/webapp/WEB-INF/src/org/olat/user/_i18n/LocalStrings_de.properties b/olat3/webapp/WEB-INF/src/org/olat/user/_i18n/LocalStrings_de.properties index c69127234da2593110907ffb4abf11ef41805460..6cbe330324b7abd4f989f92fecde3e5f2b2c09ec 100644 --- a/olat3/webapp/WEB-INF/src/org/olat/user/_i18n/LocalStrings_de.properties +++ b/olat3/webapp/WEB-INF/src/org/olat/user/_i18n/LocalStrings_de.properties @@ -6,6 +6,7 @@ accessibility.web2aMode.label=Web 2.a Modus f\u00FCr Brailleger\u00E4te action.choose=W\u00E4hlen ajaxon.global.label=AJAX-Modus ist auf Systemebene eingeschaltet ajaxon.label=AJAX-Modus +error.user.logged.in=Diese Änderung kann nicht vorgenommen werden da der Benutzer {0} zur Zeit eingeloggt ist. Warten Sie bis der Benutzer sich ausloggt und versuchen Sie es erneut. change=\u00C4ndern chelp.card1=Sie haben die M\u00F6glichkeit, eine pers\u00F6nliche Visitenkarte zu erstellen, die f\u00FCr alle registrierten OLAT-Benutzer einsehbar ist. chelp.card2=Mit Hilfe der Check-Boxen k\u00F6nnen Sie bestimmen, welche Eintr\u00E4ge auf Ihrer Visitenkarte erscheinen sollen. diff --git a/olat3/webapp/WEB-INF/src/org/olat/user/_i18n/LocalStrings_en.properties b/olat3/webapp/WEB-INF/src/org/olat/user/_i18n/LocalStrings_en.properties index aff2681f7af9fee9ba331046e8a1bfd79472ffe7..3706882a0045643b783595e2d4239d537c765176 100644 --- a/olat3/webapp/WEB-INF/src/org/olat/user/_i18n/LocalStrings_en.properties +++ b/olat3/webapp/WEB-INF/src/org/olat/user/_i18n/LocalStrings_en.properties @@ -7,6 +7,7 @@ action.choose=Select ajaxon.global.label=AJAX mode active on system level ajaxon.label=AJAX mode change=Modify +error.user.logged.in=This change can not be made as the user {0} is currently logged in. Please wait until the user has logged out and try it again. chelp.accessibility0=Accessibility chelp.accessibility1=Visually impaired persons often have trouble reconstructing all changes on their screen. chelp.accessibility2=Therefore OLAT offers a special Web 2.a mode which particularly highlights updated elements on screen. diff --git a/olat3/webapp/static/themes/default/patches/brasato_patch.css b/olat3/webapp/static/themes/default/patches/brasato_patch.css index 56be1ad19d80ea0924466baad277a546f4bddc31..df28ecd19bb2a468ead36e82b82e562553c3ede6 100644 --- a/olat3/webapp/static/themes/default/patches/brasato_patch.css +++ b/olat3/webapp/static/themes/default/patches/brasato_patch.css @@ -17,6 +17,9 @@ div.b_closablewapper_handle { height: 2em; } + /* IE6 fix wrong positioning of modal overlay which breaks callout windows */ + * html div.b_modal_overlay {position: absolute;} + /* min-height fix IE6 */ * div.b_form div.b_form_general_error { height: 32px;} /* 3-pixel job bug fix for IE6 and IE7: set hasLayout=true and remove margin */ diff --git a/olat3/webapp/static/themes/default/patches/content_patch.css b/olat3/webapp/static/themes/default/patches/content_patch.css index 8a5610985fc2edec6530e54497f51e28bf852119..aae60d4ab2b5244d412e8422b33f03c22c729a06 100644 --- a/olat3/webapp/static/themes/default/patches/content_patch.css +++ b/olat3/webapp/static/themes/default/patches/content_patch.css @@ -14,11 +14,7 @@ * html table.b_grid_row td { border-top: 1px solid #ACAAAA; border-bottom: 1px solid #ACAAAA; } /* make IE render images nicely, default rendering is ugly */ - img { -ms-interpolation-mode:bicubic; } - - /* IE6 fix wrong positioning of modal overlay which breaks callout windows */ - * html div.b_modal_overlay {position: absolute;} - + img { -ms-interpolation-mode:bicubic; } }